idyoudo
idyoudo
见DubboConsumerAutoConfiguration的源码,77~79行, 77:ClassIdBean classIdBean = new ClassIdBean(interfaceClass, group, version); 78: Object dubboReference = 79: DubboConsumerAutoConfiguration.DUBBO_REFERENCES_MAP.get(classIdBean); 假设在一个类里面同时引用多个Reference: @Reference(interfaceName = "BankInnerTransfer",generic = true,check = false ) public Object bankInnerTransferReference = null; @Reference(interfaceName =...
#1、问题 现有代码是通过判断计数器JOB_ADD_COUNT是否为1来决定是否执行addJob(job)方法,但是这样还是有例外场景。 #2、场景 比如有进程A,B,都需要执行同样的任务,先启动进程A,**显示**调用了addJob方法,此时在zk上完成任务的注册。待注册成功后启动进程B,没有显示调用addJob,那么monitorJobRegister方法启动监听,执行 case CHILD_ADDED的逻辑,但是在进程B中由于还没有执行对应job的addJob方法,此时的计数器还没有初始化,那么monitorJobRegister中的的动态注册任务是不会执行的。 #3、分析 正常情况下,进程启动后,由进程解析ElasticJobConf,然后注册任务(addJob),那么原有的逻辑是不会有问题的,但是存在一种例外情况,如上所述,启动进程B,在上下文中没有ElasticJobConf注解,纯碎是根据zk的注册信息,通过执行monitorJobRegister监听代码,完成任务的注册。 建议,可以综合考虑上述的两种情况,在JobService中维护一个任务注册器,只要任务已经注册了,就不调用addJob方法,否则就执行。
JobConfParser注册完任务后,会触发zk的监听,监听器会重复执行任务内的注册