Eureka Client监听启动状态
在Eureka Client 端,通过@PostConstruct注解去做一些初始化工作,有时候会涉及到调用其他微服务,
这个时候,由于Eureka Client尚未启动完成,注册信息还没有从Eureka Server上拉取下来,因此ribbon
是获取不到client信息的,在使用Fegin调用的过程中,如果开启了熔断器,那么,服务调用会快速失败
feign hystrix enabledtrue
如果去除如上配置,那么此次调用去等获取到了Eureka Client信息之后才开始调用。
为保证在使用了Hystrix的前提下,能够在系统启动成功之后,可以调用其他微服务做一些初始化工作,可以
使用如下方法。
Demo如下:
package com.client.a.config; import com.client.a.client.BClient; import com.netflix.appinfo.ApplicationInfoManager; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import com.netflix.discovery.StatusChangeEvent; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @Author 张云和 * @Date 2018/6/14 * @Time 10:49 */ public class Demo { ApplicationInfoManager.StatusChangeListener eurekaListener = null; private EurekaClient eurekaClient; private BClient bClient; private ExecutorService executorService = Executors.newSingleThreadExecutor(); public void init() { eurekaListener = new ApplicationInfoManager.StatusChangeListener() { public String getId() { return "forExample"; } public void notify(StatusChangeEvent statusChangeEvent) { // 当前状态为UP, 之前的状态为STARTING if (InstanceInfo.InstanceStatus.UP == statusChangeEvent.getStatus() && InstanceInfo.InstanceStatus.STARTING == statusChangeEvent.getPreviousStatus()) { // TODO somethings // 执行一遍之后,在卸载该监听,达到在EurekaClient启动完成之后,仅执行一次 // ID可以自定义 executorService.execute(() -> { while (!Thread.currentThread().isInterrupted()) { try { bClient.test(); Thread.sleep(10000); } catch (Exception e) { e.printStackTrace(); } } }); ApplicationInfoManager.getInstance().unregisterStatusChangeListener(eurekaListener.getId()); eurekaListener = null; } } }; eurekaClient.getApplicationInfoManager().registerStatusChangeListener(eurekaListener); } }