乐趣区

关于springboot:Springboot快速整合Quartz

一、引言

在 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,代码如下

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

退出移动版