1、前提背景
- 如果服务实例在获取某个数据的时候,获取不到则不能启动成功
- 搭配eureka,如果获取失败,才能将其注册到eureka中
- 因服务启动存在服务依赖,服务的先后启动顺序
- 降低安装部署的门槛(如果部署时存在服务的先后顺序,不按顺序还起不来,则岂不是很烦。可以让其服务运行起来,慢慢达到可用的一个状态)
2、实现方案
- 实现ApplicationRunner接口,服务启动时,就会执行的接口
- 让代码先启动,但是又没有完全启动,一直去重试,可以通过衰减重试(先尝试一次不成功,则失败后再重试一次,只是重试的时间间隔会越来越长,最后间隔时间固定)
- eureka表示down,其他服务不可用(通过ApplicationInfoManager进行设置实例的状态)
- ScheduledThreadPoolExecutor的schedule来设置任务的延迟执行时间来达到衰减重试的效果(每次设置schedule的实现时,都可设计延迟的时间,达到衰减的效果)
- 失败后,再次执行任务,这段逻辑需要放到finally去执行
- 因我的实现是基于自动装配,故数据的依赖是通过构造函数进行数据赋值(@Autowired)
3、代码
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.InstanceInfo;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.Ti