@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类,
对比其它@JobHandlerXxxTask类使用了Spring的@Value注解和Spring-Cloud的@RefreshScope
期望通过配置中心的动态配置,XxxTask类能同步实时刷新。

尝试去掉@RefreshScope注解,发现启动项目成功。

xxl-job官方github里找到了相同的问题: https://github.com/xuxueli/xxl-job/issues/2010
@RefreshScopexxl-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 {
        ...
    }
}

当配置中心属性修改,DynamicConfigBean动态刷新后,XxxTask里的dynamicConfig同步刷新,使用它的属性即为最新值。

posted @ 2024-05-06 22:54  cdfive  阅读(584)  评论(0编辑  收藏  举报