一、引言

在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工程后,控制台打印如下,阐明定时任务调度胜利