通过上面ExecutorRegistryThread # start方法核心代码,可以看到,注册是通过adminBiz.registry代码实现的,调用链路总结如下:最终还是通过 HTTP 协议的 POST 请求,注册数据格式如下:看到这里,我们回到文章开头问题部分。
java.util.Timer是 JDK 1.3 开始就已经支持的一种定时任务的实现方式。ElasticJob 由于在架构设计上是基于 Zookeeper ,而 XXL-JOB 是基于数据库,性能方面的话,ElasticJob 略胜一筹。
Spring Task 的原理是在初始化 bean 时借助 ScheduledAnnotationBeanPostProcessor 拦截@Scheduled 注解所标识的方法,并根据每个方法及其注解配置构建相应的 Task 实例注册到 ScheduledTaskRegistrar 中,并在单例 bean 初始化完成后通过 afterSingletonsInstantiated 回调设置 ScheduledTaskRegistrar 中的调度器 TaskScheduler,其底层依赖于 jdk 并发包中的 ScheduledThreadPoolExecutor 实现,并在 afterPropertiesSet 时将所有 Task 添加到 TaskScheduler 中调度执行。