一、引言
在java中最常用的定时任务框架当属quartz
了,早在Spring Boot还未发布之前,spring就已经在spring-context-support包中对quartz进行了集成,而使用Spring Boot来整合quartz就变的尤为方便、快捷。
这里我使用的Spring Boot版本:2.5.14
二、快速整合
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,代码如下
@Service
public 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方法来简单地创建一个定时任务,代码如下
@Component
public 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工程后,控制台打印如下,说明定时任务调度成功
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。