Quartz任务调度(一)前言

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

前言

定时任务可以让程序在不同的时间段执行不同的任务,彻底解决人与机器之间的不同,机器可以天天不睡觉24小时帮你执行任务,而人不行,定时任务的出现,就可以继续压榨程序的劳动力,但是定时任务我们一般会使用SpringBoot的cron表达式与定时注解来实现定时任务的创建,但是由于过于单一,并且一旦启动无法再次修改得特性一点也不人性化,所以这个时候我们就迫切的需要一个可定制化的时间段任务执行框架,那么他就是我们接下来要讲的Quartz任务调度。

初识Quartz

Quartz的世界中,万物皆可任务,任务都被每个触发器管理,每个触发器被调度器管理。Quartz的实现必须依靠以下三个类实现:Scheduler 调度器、Trigger触发器、Job 任务来实现任务的调度。

Quartz 官方给出的使用例子
image.png

在Quartz的官网中,初次启动该程序你需要配置一下Quartz的配置文件,Quartz是一个可配置的应用程序。

基本的Quartz.properties文件

org.quartz.scheduler.instanceName = MyScheduler //任务调度计划名
org.quartz.threadPool.threadCount = 3 //几个线程执行任务
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore //使用内存来持久化quartz任务,这里也可以配置为Mysql的数据库形式
复制代码

mysql的quartz基本配置

quartz:
  #相关属性配置
  properties:
    org:
      quartz:
        scheduler:
          instanceName: DefaultQuartzScheduler
          instanceId: AUTO
        dataSource:
          qrtz:
            URL: jdbc:mysql://xxxxxx:3306/sensor_quartz?useUnicode=true&characterEncoding=UTF-8&useSSL=false
            user: mouth
            password: 123456
            driver: com.mysql.jdbc.Driver
            validateOnCheckout: true
            validationQuery: "select 1"
            idleConnectionValidationSeconds: 60
            maxConnections: 10
            maxIdleTime: 60
        jobStore:
          class: org.quartz.impl.jdbcjobstore.JobStoreTX
          driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
          tablePrefix: SENSOR_QRTZ_
          isClustered: true
          clusterCheckinInterval: 10000
          useProperties: true
          dataSource: qrtz
        threadPool:
          class: org.quartz.simpl.SimpleThreadPool
          threadCount: 10
          threadPriority: 5
          threadsInheritContextClassLoaderOfInitializingThread: true
复制代码

执行Job

定义一个Job

public class RemoteHttpJobBean extends QuartzJobBean {
    private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class);

    @Override
    protected void executeInternal(JobExecutionContext context)
            throws JobExecutionException {


        // trigger
        CollectionTrigger.trigger(context);
    }

}

--------------------------------
// 把Job任务丢入jobdetail中
JobDetail job = newJob(HelloJob.class)
      .withIdentity("job1", "group1")
      .build();
      
//定义触发器
Trigger trigger = newTrigger()
      .withIdentity("trigger1", "group1")
      .startNow()
            .withSchedule(simpleSchedule()
              .withIntervalInSeconds(40)
              .repeatForever())            
      .build();

//把触发器 与 job任务 丢进调度器执行,触发器与job绑定为job的触发条件
scheduler.scheduleJob(job, trigger);
   
复制代码

这里要注意一个点,scheduler要是在执行任务中被调用了shutdown方法,那么执行的任务都会中断!trigger在方法中可以看到他是设置组别的,不同的trigger可以设置不同分组,取决于业务的处理方式来自由扩展,分组后定时器的查询会更加方便。