一、单实例方式

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

定义核心业务Job

只需要继承QuartzJobBean,并重载executeInternal方法即可定义自己的Job执行逻辑。

@Slf4j
public class HelloJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        // 获取参数
        context.getJobDetail().getJobDataMap().forEach(
                (k, v) -> log.info("param, key:{}, value:{}", k, v)
        );
        // 核心业务
        log.info("Hello Job执行时间: " + new Date());
    }
}

编写配置类

JobDetail, Trigger, Schedule(这里采用CronScheduleBuilder)。

@Configuration // 使用@Configuration注解来标识这是一个配置类
public class QuartzConfig {

    @Bean("helloJob") // 使用@Bean注解来创建和注册一个JobDetail对象,名称为helloJob
    public JobDetail helloJobDetail() {
        return JobBuilder.newJob(HelloJob.class) // 使用JobBuilder类来构建一个JobDetail对象,指定任务的类名为HelloJob.class
                .withIdentity("DateTimeJob") // 指定任务的标识为DateTimeJob
                .usingJobData("msg", "Hello Quartz") // 指定任务的参数为msg=Hello Quartz
                .storeDurably()// 即使没有Trigger关联时,也不需要删除该JobDetail
                .build(); // 构建并返回该对象
    }

    @Bean // 使用@Bean注解来创建和注册一个Trigger对象
    public Trigger printTimeJobTrigger() {
        // 使用CronScheduleBuilder类来定义一个Cron表达式,表示每秒执行一次
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ?");
        return TriggerBuilder.newTrigger() // 使用TriggerBuilder类来构建一个Trigger对象
                .forJob(helloJobDetail()) // 指定触发器关联的任务为上面创建的helloJobDetail()方法返回的对象
                .withIdentity("quartzTaskService") // 指定触发器的标识为quartzTaskService
                .withSchedule(cronScheduleBuilder) // 指定触发器的时间表为上面定义的Cron表达式
                .build(); // 构建并返回该对象
    }
}