Quartz 是一个相当优秀的任务调度项目,在 SpringBoot 中对其进行集成也是一件不算难也不算容易的事情。然而,该有的坑总是会来的。
前言
废话不多说,先上 Demo。
Github :quartz-schedule-demo
这个项目是我将 Quartz 官方案例在 SpringBoot 上的一个 Demo 实现,同时配上了必要的注释和适当的调整。
对于新接触的同学来说,应该是一个不错的上手项目。
案例
quartz-schedule-demo 项目中目前一共包含 8 个 Demo,后期添加新的 Demo 时,我会更新这篇博文。
分别是:
Demo1
简单的循环任务,每隔 10 秒一次输出
-
启动 Test 下 SimpleTest 的 demo1Test(请将其 ignore 注释)
-
SimpleJob 将每隔 10 秒钟运行一次。
Demo2
传递参数到 Jobs 中,直接从 context 中读取参数。
-
启动 Test 下 DataParseTest 的 parameterTest(请将其 ignore 注释)
-
DataParseJob 将每隔 10 秒运行一次。
Demo3
同样传递参数到 Jobs 中,但将参数写入 Jobs 的属性。
-
启动 Test 下 DataParseTest 的 parameterAutoWriteTest(请将其 ignore 注释)
-
HighLevelParameterJob 将每隔 10 秒运行一次。
Demo4
延时五秒后执行任务
-
启动 Test 下 SimpleTest 的 demo4Test(请将其 ignore 注释)
-
五秒后控制台可以看到输出。
Demo5
延时五秒后启动一个任务,该任务每隔 10 秒执行一次,直到执行了 10 次为止。
-
启动 Test 下 SimpleTest 的 demo5Test(请将其 ignore 注释)
-
五秒后控制台可以看到输出。(一共会看到 11 行输出)
Demo6
立即启动一个任务,然后每隔 5 分钟执行一次,直到当天下午 4 点为止。
-
启动 Test 下 SimpleTest 的 demo6Test(请将其 ignore 注释)
-
检查结果
Demo7
每个偶数小时整(14:00,16:00)执行一次任务。
-
启动 Test 下 SimpleTest 的 demo7Test(请将其 ignore 注释)
-
检查结果
Demo8
通过配置,将 Spring 的 Bean 对象自动加载到 Quartz 的 JobFactory 中。
Demo8 检测了 Quartz 的 job 在执行的过程中,能否正常使用 Spring 的 Bean 对象
-
启动 Test 下 HelloTest 的 Demo8Test(请将其 ignore 注释)
-
检查运行结果
排坑
在读官方文档的过程中,基本上从 Demo1 一直跑到 Demo7 都没什么问题,唯一的大问题出现在 Quartz 的 SimpleThreadPool 上,这个线程池在执行 Jobs 的过程中,如果缺少对 JobFactory 配置 Spring 的 Context,那么执行的 Job 将无法正常解析 Spring 的 Bean 对象。
以下是详细的解决办法:
-
引入 spring-context-support,在 pom.xml 中加下面的依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.13.RELEASE</version> </dependency>
-
配置 applicationContext.getAutowireCapableBeanFactory(),加载到 JobFactory 中即可。(详细代码请见项目中的 config)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于