Open hashmaparraylist opened 2 years ago
感觉应该是ExecutorRegistryThread
这个类的问题
ExecutorRegistryThread
被作为一个单例来使用的。无论是start()
还是stop()
方法都是通过下面这个标志位变量来处理的。
private volatile boolean toStop = false;
当/actuator/restart
被触发的时候,应该只是触发了ApplicationContext
的restart,这个时候会执行器会先调用ExecutorRegistryThread
的stop()
再调用start()
,
在stop
方法里
public void toStop() {
toStop = true;
// interrupt and wait
if (registryThread != null) {
registryThread.interrupt();
try {
registryThread.join();
} catch (InterruptedException e) {
logger.error(e.getMessage(), e);
}
}
}
toStop
这个标志位被标记成true了,所以在start里就没有办法完成执行器的注册了。
归根结底/actuator/restart
这个并不会触发整个jvm的重启,所以作为单例的ExecutorRegistryThread
的成员变量不会被重置。
感觉在使用Nacos作为配置中心可能也会有相同的问题。
以下几个单例模式的线程都有这个问题。
Please answer some questions before submitting your issue. Thanks!
Which version of XXL-JOB do you using?
spring boot
2.5.1
spring cloud2020.0.3
xxl-job-core2.3.0
spring cloud 主要使用下列组件
Expected behavior
执行器(基于Spring Boot)部署在K8S环境中,使用K8S的ConfigMap作为配置中心。 当执行器对应的ConfigMap内容发生变化后会想执行器的
/actuator/restart
发送一个POST请求重启整个Spring容器。 (上述行为是通过spring-cloud-starter-kubernetes-fabric8-config实现的。)此时执行器并没有和正常启动时一样注册到调度中心。
Actual behavior
执行器没有办法自动注册到调度中心
Steps to reproduce the behavior
在springboot的配置文件中加入下面的配置打开
actuator
的restart
接口等执行器完全启动后通过postman或是curl命令发送post请求
Other information
正常启动时的LOG日志
向
/actuator/restart
发送POST请求后的重启日志