@RefreshScope导致xxl-job jobhandler naming conflicts项目启动报错
问题
项目里使用xxl-job
定时任务框架,某个任务定义如下:
@Slf4j
@RefreshScope
@Component
@JobHandler("xxxTask")
public class XxxTask extends IJobHandler {
@Value("${xxx.enable:false}")
private boolean enable;
@Override
public ReturnT<String> execute(String param) throws Exception {
...
}
}
项目启动报错:
...
Caused by: java.lang.RuntimeException: xxl-job jobhandler naming conflicts.
at com.xxl.job.core.executor.impl.XxlJobSpringExecutor.initJobHandlerRepository(XxlJobSpringExecutor.java:49)
at com.xxl.job.core.executor.impl.XxlJobSpringExecutor.start(XxlJobSpringExecutor.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
根据报错提示,存在jobhandler
命名冲突;
检查项目里的所有@JobHandler
标识的类,没有发现命名重复。
解决
项目在之前一直能启动成功,报这个错启动失败前,刚添加了该XxxTask
类,
对比其它@JobHandler
,XxxTask
类使用了Spring的@Value
注解和Spring-Cloud的@RefreshScope
,
期望通过配置中心的动态配置,XxxTask
类能同步实时刷新。
尝试去掉@RefreshScope
注解,发现启动项目成功。
在xxl-job
官方github里找到了相同的问题: https://github.com/xuxueli/xxl-job/issues/2010
@RefreshScope
、xxl-job
生成Bean有冲突。
虽然去掉去掉@RefreshScope
能让项目启动成功,但这样修改配置中心配置,XxxTask
类不会动态刷新;
考虑一个折中的方案,将@Value
动态配置属性放到一个单独的配置类中,如DynamicConfig
:
@Slf4j
@Getter
@Setter
@RefreshScope
@Configuration
public class DynamicConfig implements Serializable {
@Value("${xxx.dynamic.enable:false}")
private Integer enable;
...
}
然后把DynamicConfig
类注入到XxxTask
中:
@Slf4j
@RefreshScope
@Component
@JobHandler("xxxTask")
public class XxxTask extends IJobHandler {
@Autowired
private DynamicConfig dynamicConfig;
@Override
public ReturnT<String> execute(String param) throws Exception {
...
}
}
当配置中心属性修改,DynamicConfig
Bean动态刷新后,XxxTask
里的dynamicConfig
同步刷新,使用它的属性即为最新值。