package com.alibaba.dubbo.spring.boot.health;

import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.Status;

import com.alibaba.dubbo.rpc.service.EchoService;
import com.alibaba.dubbo.spring.boot.DubboConsumerAutoConfiguration;
import com.alibaba.dubbo.spring.boot.bean.ClassIdBean;
import com.alibaba.dubbo.spring.boot.listener.ConsumerSubscribeListener;

/**
 * Dubbo health indicator
 *
 * @author xionghui
 * @version 1.0.0
 * @since 1.0.0
 */
public class DubboHealthIndicator extends AbstractHealthIndicator {

  @Override
  public void doHealthCheck(Health.Builder builder) throws Exception {
    boolean up = true;
    for (ClassIdBean classIdBean : ConsumerSubscribeListener.SUBSCRIBEDINTERFACES_SET) {
      Object service = DubboConsumerAutoConfiguration.getDubboReference(classIdBean);
      EchoService echoService = (EchoService) service;
      if (echoService != null) {
        try {
          echoService.$echo("Hello");
          builder.withDetail(classIdBean.toString(), Status.UP.getCode());
        } catch (Throwable t) {
          up = false;
          builder.withDetail(classIdBean.toString(),
              Status.DOWN.getCode() + ", message: " + t.getMessage());
        }
      }
    }
    if (up) {
      builder.up();
    } else {
      builder.down();
    }
  }
}