Spring Boot 整合 Quartz

配置

pom

Spring Boot 使用的是2.1.6.RELEASE,依賴中增加如下配置

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

application.properties

調度器可以和springboot公用數據源

#使用數據庫固化調度信息
spring.quartz.job-store-type=jdbc
#調度器名稱
spring.quartz.scheduler-name=MyScheduler
#不重新創建數據表
spring.quartz.jdbc.initialize-schema=never
#線程數量
spring.quartz.properties.org.quartz.threadPool.threadCount = 50
#持久化實現
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
#數據庫方言StdJDBCDelegate 
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate 

java代碼

任務:實現Job接口即可

public interface Job {
    //context中包含當前任務關聯的信息 
    //JobExecutionException 當任務執行失敗時可以通過配置來控制是否繼續執行等操作
    void execute(JobExecutionContext context) throws JobExecutionException;
}

調度器:在service中注入Scheduler即可,Scheduler是調度器整體管理包括暫停任務,更新任務,恢復任務等

需求以及解決方法

每個任務使用相同上下文即JobData
繼承Job的java類上增加@PersistJobDataAfterExecution,@DisallowConcurrentExecution註解,通常這兩個註解配合使用

  • @PersistJobDataAfterExecution:在任務執行後固化JobData至數據庫
  • @DisallowConcurrentExecution:避免同一個組的同一個任務併發執行以免JobData混亂

更新JobData至當前任務

   //jobDetail 任務信息
   JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(job.getName(), job.getGroup()));
   jobDetail.getJobDataMap().put("aaa", "bbb");
   CronTrigger trigger = (CronTrigger) scheduler.getTrigger(TriggerKey.triggerKey(job.getName(), job.getGroup()));
   Set<Trigger> triggers = new HashSet<>();
   triggers.add(trigger);
   //true 就是替換數據庫中JobDataMap
   scheduler.scheduleJob(jobDetail,triggers,true);

任務控制

  • 暫停任務:scheduler.pauseJob(jobKey)
  • 恢復任務:scheduler.resumeJob(jobKey)
  • 立即執行任務:scheduler.triggerJob(jobKey)
  • 執行中的任務:
List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs()
//獲取具體任務信息
JobDetail jobDetail = executingJob.getJobDetail();
  • 查詢任務
   //依據分組查詢,如需其他查找查看api中實現了org.quartz.Matcher接口的類即可
   GroupMatcher<JobKey> matcher = GroupMatcher.groupContains(groupKeyword);
   Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
   //通過JobKey獲取調度器中具體任務以及相關信息 
   scheduler.getJobDetail(jobKey); 

參考資料

https://eelve.com/archives/springbootstarterquartzs

http://www.quartz-scheduler.org/

https://www.w3cschool.cn/quartz_doc/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章