SpringBoot整合quartz(单机非持久化)

发布于 2022-10-19  2.49k 次阅读


引入quartz依赖:

<!-- 实现对 Quartz 的自动化配置 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

1. 创建Job

整合Quartz有两种方式创建Job:

  • 继承QuartzJobBean抽象类 (由spring提供)
  • 实现原生的Job接口

    QuartzJobBean抽象类也实现了Job接口,并且定义共有的execute方法,子类可以继承QuartzJobBean并实现executeInternal

例1:继承QuartzJobBean抽象类

public class HelloJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        //打印当前日期和数据
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateformat = simpleDateFormat.format(date);

        //执行任务
        System.out.println(dateformat+"--数据库备份!!");

    }
}

例2:实现Job接口

public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //打印当前日期和数据
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateformat = simpleDateFormat.format(date);

        //执行任务
        System.out.println(dateformat+"--数据库备份!!");

    }
}

2. 组件配置

两种方式:

  • 使用Bean自动配置
  • 使用Sechedler手动配置

2.1 自动配置

@Configuration
public class HelloQuartzConfig {

    @Bean
    public JobDetail getJobDetail(){


        JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJobBeanJob.class)
                .withIdentity("hellojob", "hellogroup")
                .storeDurably()//设置当没有Trigger关联job时, 是否继续持久化job,默认为true,这个必须设置,因为在bean的创建中有先后顺序
                .build();
        return jobDetail;
    }

    @Bean
    public Trigger getTrigger(){

        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
                .withIdentity("helloTrigger", "helloTriggerGroup")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(3))
                .build();

        return simpleTrigger;
    }

    @Bean
    public Scheduler getScheduler() throws SchedulerException {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        scheduler.scheduleJob(getJobDetail(),getTrigger());

        return scheduler;
    }
}

运行springboot:

2022-10-19 15:57:49--数据库备份!!
2022-10-19 15:57:52--数据库备份!!
2022-10-19 15:57:55--数据库备份!!

注:Job的storeDurably(true)必须加上,不然假如job先创建而trigger没有被初始化,那么这个job就被删除,之后trigger因为找不到job而报错

2.2 手动配置

手动配置:

  • @Component
  • 实现ApplicationRunner接口
@Component
public class HelloJobInit implements ApplicationRunner {

    @Autowired
    Scheduler scheduler;//这个对象必须引入,本地创建不会被调用

    @Override
    public void run(ApplicationArguments args) throws Exception {
        JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJobBeanJob.class)
                .withIdentity("job1","jobgroup1")
                .storeDurably()
                .build();
        CronScheduleBuilder scheduleBuilder =
                CronScheduleBuilder.cronSchedule("0/5 * * * * ? *");
        // 创建任务触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("01Trigger","01TriggerGroup")
                .startNow() //立即執行一次任務
                .withSchedule(scheduleBuilder)
                .build();
        // 手动将触发器与任务绑定到调度器内
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

注:Scheduler scheduler对象必须使用Spring进行注入,本地创建会失效

输出:

2022-10-19 16:19:40--数据库备份!!
2022-10-19 16:19:45--数据库备份!!
2022-10-19 16:19:50--数据库备份!!
2022-10-19 16:19:55--数据库备份!!
2022-10-19 16:20:00--数据库备份!!
2022-10-19 16:20:05--数据库备份!!

3. Quartz的配置

SpringBoot集成Quartz配置,可以在application.yml的配置Quartz

以下是quartz的一下配置项:

spring:
    # Quartz 的配置,对应 QuartzProperties 配置类
    quartz:
        job-store-type: memory # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
        auto-startup: true # Quartz 是否自动启动
        startup-delay: 0 # 延迟 N 秒启动
        wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
        overwrite-existing-jobs: false # 是否覆盖已有 Job 的配置
        properties: # 添加 Quartz Scheduler 附加属性
            org:
                quartz:
                    threadPool:
                        threadCount: 25 # 线程池大小。默认为 10 。
                        threadPriority: 5 # 线程优先级
                        class: org.quartz.simpl.SimpleThreadPool # 线程池类型

路漫漫其修远兮,吾将上下而求索