public class XxlJobContext {
.........
.........
private static InheritableThreadLocal contextHolder = new InheritableThreadLocal(); // support for child thread of job handler)
public static void setXxlJobContext(XxlJobContext xxlJobContext){
contextHolder.set(xxlJobContext);
}
public static XxlJobContext getXxlJobContext(){
return contextHolder.get();
}
}
XXL-JOB中的XxlJobContext 使用了InheritableThreadLocal,关于ThreadLocal的使用以及原理,可以参考如下博客:
Java中的ThreadLocal详解 - 夏末秋涼 - 博客园一、ThreadLocal简介 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线https://www.cnblogs.com/fsmly/p/11020641.html上面博客详细讲解了ThreadLocal以及InheritableThreadLocal的原理以及实现,推荐大家参考。
2. Spring中的 InitializingBean接口XXL-JOB初始化启动Admin组件,通过实现Spring中的 InitializingBean接口中的 afterPropertiesSet 方法完成 XxlJobScheduler的初始化,包含所有需要线程的启动,包含触发线程池、注册去注册线程池、异常警告线程等等重要线程池以及线程的启动。
XxlJobAdminConfig主要是通过实现了InitializingBean, DisposableBean 来分别完成xxlJobScheduler的初始化以及销毁操作。
@Component
public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
private static XxlJobAdminConfig adminConfig = null;
public static XxlJobAdminConfig getAdminConfig() {
return adminConfig;
}
// ---------------------- XxlJobScheduler ----------------------
private XxlJobScheduler xxlJobScheduler;
@Override
public void afterPropertiesSet() throws Exception {
adminConfig = this;
xxlJobScheduler = new XxlJobScheduler();
xxlJobScheduler.init();
}
@Override
public void destroy() throws Exception {
xxlJobScheduler.destroy();
}
............
............
}
关于InitializingBean的使用参考如下博文:
Spring中的InitializingBean接口的使用 - 卫旗 - 博客园InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。 测试,如下: 配置文https://www.cnblogs.com/weiqihome/p/8922937.html当然也可以采用init-method方法完成初始化操作。大家可以参考上述博文了解这个知识点。
上述两个点是以前代码学习中没有注意到的,在这次看到的很多Java或者Spring框架中没有注意的点,我都会在这里整理一下。


