一、引言
在java中最罕用的定时工作框架当属quartz
了,早在spring boot还未公布之前,spring就曾经在spring-context-support包中对quartz进行了集成,而应用spring boot来整合quartz就变的尤为不便、快捷。
二、疾速整合
2.1 pom引入starter依赖
spring boot最重要的就是它的插件化设计
,想引入哪个模块或框架个别只需引入对应的starter即可,quartz也是一样,如下
<!-- 整合quartz --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId></dependency>
(这里的spring-boot-starter-quartz没有写明version版本,默认与spring boot的版本统一即可)。
在pom中点击spring-boot-starter-quartz进去能够看到其外部依赖spring-boot-starter、spring-context-support、spring-tx以及quartz
,如下
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.6.6</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.3.18</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.18</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> <scope>compile</scope> </dependency></dependencies>
2.2 定义工作类
自定义的工作类须要实现quartz提供的Job接口,样例如下
/** * 工作类 */public class MyJob1 implements Job { @Autowired private MyService1 myService1; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();// System.out.println("工作创建人:" + jobDataMap.getString("createUser")); myService1.work(); }}
如上代码中,工作类中能够间接应用@Autowired来注入bean
,这为咱们编写工作类时提供了很好的便当,不须要通过工作参数jobDataMap来传入bean了。MyService1是一个简略的bean,代码如下
@Servicepublic class MyService1 { public void work() { String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(now + ": service1正在工作..."); }}
2.3 创立定时工作
上面通过定义一个ApplicationRunner,在spring容器启动后,执行run办法来简略地创立一个定时工作,代码如下
@Componentpublic class MyApplicationRunner implements ApplicationRunner { @Autowired private Scheduler scheduler; @Override public void run(ApplicationArguments args) throws Exception { // 创立工作明细 JobDetail jobDetail = JobBuilder.newJob(MyJob1.class) .withIdentity("myJob1", "job_group")// .usingJobData("createUser", "kamier") // 能够放一些工作数据 .build(); // 创立触发器,每隔5秒执行一次 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?"); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger1", "trigger_group") .withSchedule(cronScheduleBuilder) .build(); // 调度定时工作 scheduler.scheduleJob(jobDetail, trigger); }}
2.4 测试验证
启动spring boot工程后,控制台打印如下,阐明定时任务调度胜利