Spring-boot整合Quartz,3、動態配置定時任務
通過動態新增JobDetail例項到Scheduler中,實現可配置動態式的定時任務作業
首先實現Job介面的 Myjob,通過包全名(com.example.demo.job.MyJob1),利用反射得到Clazz。
設定JobDetail的名字和組
Class jobClass = Class.forName(job);
// 建立jobDetail例項,繫結Job實現類
// 指明job的名稱,所在組的名稱,以及繫結job類
JobDetail jobDetail = JobBuilder.newJob(jobClass/*MyJob1.class*/ ) .withIdentity(jobId, group).build();//設定Job的名字和組
再配置CronTrigger引數,觸發器規則,新增名字和組。
// corn表示式 每2秒執行一次
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time/*"0/2 * * * * ?"*/);
//設定定時任務的時間觸發規則
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity (jobId,group) .withSchedule(scheduleBuilder).build();
最後將把作業和觸發器註冊到任務排程中
具體程式碼
@Component
public class MyScheduler {
@Autowired
private Scheduler scheduler;
public void scheduleJobs() throws SchedulerException {
// startJob();
}
public void startJob(String time,String group,String jobId,String job){
try {
Class jobClass = Class.forName(job);
// 建立jobDetail例項,繫結Job實現類
// 指明job的名稱,所在組的名稱,以及繫結job類
JobDetail jobDetail = JobBuilder.newJob(jobClass/*MyJob1.class*/) .withIdentity(jobId, group).build();//設定Job的名字和組
// JobDetail jobDetail = JobBuilder.newJob(jobClass/*MyJob1.class*/) .withIdentity(jobId, group).usingJobData("name","我的名字").build();//設定Job的名字和組
jobDetail.getJobDataMap().put("name","MyName");//動態新增資料
// corn表示式 每2秒執行一次
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time/*"0/2 * * * * ?"*/);
//設定定時任務的時間觸發規則
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(jobId,group) .withSchedule(scheduleBuilder).build();
// 把作業和觸發器註冊到任務排程中
scheduler.scheduleJob(jobDetail,cronTrigger);
/*
// 啟動排程
scheduler.start();
Thread.sleep(30000);
// 停止排程
scheduler.shutdown();*/
} catch (Exception e) {
e.printStackTrace();
}
}
/***
* 修改定時任務時間
* @param triggerName
* @param triggerGroupName
* @param time
*/
public void modifyJobTime(String triggerName,String triggerGroupName, String time) {
try {
TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
if (trigger == null) {
return;
}
System.out.println(scheduler.getTriggerState(triggerKey));
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(time)) { // Trigger已存在,那麼更新相應的定時設定
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);//設定一個新的定時時間
// 按新的cronExpression表示式重新構建trigger
CronTrigger cronTrigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
// 按新的trigger重新設定job執行
scheduler.rescheduleJob(triggerKey, cronTrigger);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/****
* 暫停一個任務
* @param triggerName
* @param triggerGroupName
*/
public void pauseJob(String triggerName,String triggerGroupName){
try {
JobKey jobKey = new JobKey(triggerName, triggerGroupName);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if (jobDetail==null){
return;
}
scheduler.pauseJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/****
* 刪除一個任務
* @param triggerName
* @param triggerGroupName
*/
public void deleteJob(String triggerName,String triggerGroupName){
try {
JobKey jobKey = new JobKey(triggerName, triggerGroupName);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if (jobDetail==null){
return;
}
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/****
* 恢復一個任務
* @param triggerName
* @param triggerGroupName
*/
public void resumeJob(String triggerName,String triggerGroupName){
try {
JobKey jobKey = new JobKey(triggerName, triggerGroupName);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if (jobDetail==null){
return;
}
scheduler.resumeJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/***
* 開始定時任務
*/
public void startAllJob(){
try {
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/***
* 立即執行定時任務
*/
public void doJob(String triggerName,String triggerGroupName){
try {
JobKey jobKey = JobKey.jobKey(triggerName, triggerGroupName);
scheduler.triggerJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public void shutdown(){
try {
scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
測試類
@Autowired
private MyScheduler myScheduler ;
@Test
public void TestQuartz(){
try {
myScheduler.startJob("0/5 * * * * ? ","gropu1","job1","com.example.demo.job.MyJob1");
myScheduler.startAllJob();
Thread.sleep( 30000);
myScheduler.modifyJobTime("job1","gropu1","0/2 * * * * ? ");
Thread.sleep( 30000);
myScheduler.pauseJob("job1","gropu1");
Thread.sleep( 10000);
myScheduler.resumeJob("job1","gropu1");
Thread.sleep( 10000);
myScheduler.doJob("job1","gropu1");
myScheduler.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
暫停,刪除,恢復通過JobDetail設定的名字和組,生成JobKey,從scheduler中獲取JobDetail,再操作。
修改Job觸發時間規則的,首先獲取觸發器的名字和組,再把新的觸發器規則重新設定job執行
scheduler.rescheduleJob(triggerKey, cronTrigger);
在Job的實現類上加@DisallowConcurrentExecution的註釋
@DisallowConcurrentExecution 禁止併發執行多個相同定義的JobDetail, 這個註解是加在Job類上的, 但意思並不是不能同時執行多個Job, 而是不能併發執行同一個Job Definition(由JobDetail定義), 但是可以同時執行多個不同的JobDetail, 舉例說明,我們有一個Job類,叫做SayHelloJob, 並在這個Job上加了這個註解, 然後在這個Job上定義了很多個JobDetail, 如sayHelloToJoeJobDetail, sayHelloToMikeJobDetail, 那麼當scheduler啟動時, 不會併發執行多個sayHelloToJoeJobDetail或者sayHelloToMikeJobDetail, 但可以同時執行sayHelloToJoeJobDetail跟sayHelloToMikeJobDetail。
@PersistJobDataAfterExecution 同樣, 也是加在Job上,表示當正常執行完Job後, JobDataMap中的資料應該被改動, 以被下一次呼叫時用。當使用@PersistJobDataAfterExecution 註解時, 為了避免併發時, 儲存資料造成混亂, 強烈建議把@DisallowConcurrentExecution註解也加上。
JobDataMap,它是JobDetail的一個屬性。JobDataMap是Map介面的一個實現,並且它有一些便利的方法來儲存和檢索基本型別資料。
相關推薦
Spring-boot整合Quartz,3、動態配置定時任務
通過動態新增JobDetail例項到Scheduler中,實現可配置動態式的定時任務作業 首先實現Job介面的 Myjob,通過包全名(com.example.demo.job.MyJob1),利用反射得到Clazz。 設定JobDetail的名字和組
Spring Boot 整合 Freemarker,50 多行配置是怎麼省略掉的?
Spring Boot2 系列教程接近完工,最近進入修修補補階段。Freemarker 整合貌似還沒和大家聊過,因此今天把這個補充上。 已經完工的 Spring Boot2 教程,大家可以參考這裡: 乾貨|最新版 Spring Boot2.1.5 教程+案例合集 Freemarker 簡介 這是一個相當
Spring Boot 整合 Elasticsearch,實現 function score query 權重分查詢
search 小寫 業務 jpg 啟動會 last cti cal agen 摘要: 原創出處 www.bysocket.com 「泥瓦匠BYSocket 」歡迎轉載,保留摘要,謝謝! 『 預見未來最好的方式就是親手創造未來 – 《史蒂夫·喬布斯
spring boot整合quartz定時任務案例
blank pos jdk com post 4.0 learn int idea 1.運行環境 開發工具:intellij idea JDK版本:1.8 項目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/spr
spring boot整合swagger,自定義註解,攔截器,xss過濾,非同步呼叫,定時任務案例
本文介紹spring boot整合swagger,自定義註解,攔截器,xss過濾,非同步呼叫,定時任務案例 整合swagger--對於做前後端分離的專案,後端只需要提供介面訪問,swagger提供了介面呼叫測試和各種註釋的視覺化web介面。配置swagger的掃描包路徑,api資訊等,見配置類Swagger
spring boot 整合 quartz
1.建立一個springboot工程,選擇依賴。 2.標註啟動定時任務 @EnableScheduling 在啟動類中 package com.lzx.demo01; import org.springframework.boot.SpringApplication;
spring boot整合dubbo,Spring boot +Dubbo,簡易的配置方式
剛做完一個基於motan的專案不久,便去看看dubbo的新特性了,dubbo自上年9月恢復更新到現在大概半年多,發現已經有和spring boot整合的配置了。個人喜歡的配置方式優先順序一般都是資原始
Spring Boot整合swagger2,搭建Restful API線上文件
Swagger,中文“拽”的意思,它是一個強大的線上API文件的框架,目前它的版本是2.x,所以稱為“swagger2”。swagger2提供了線上文件的查閱和測試功能。利用Swagger2很容易構建RESTf
springboot動態配置定時任務2種方式,整合Quartz多執行緒併發執行多個定時任務配置
我的專案是採用的idea+gradle+springboot專案構建,下面是springboot實現定時任務所需要的jar包 //定時任務使用 compile group: 'org.quartz-scheduler', name: 'quartz', version:
【spring boot】【elasticsearch】spring boot整合elasticsearch,啟動報錯Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], reje
spring boot整合elasticsearch, 啟動報錯: Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], rejecting [8] at
Spring Boot整合shiro,出現UnavailableSecurityManagerException 異常
問題描述:由於在java過濾器中通過User token = (User) SecurityUtils.getSubject().getPrincipal();獲取當前的登入使用者的資訊,報UnavailableSecurityManagerException這個異常。spr
spring boot整合UEditor,不改原始碼,真實有效
UEditor以前在php專案中使用過,是一款非常強大的富文字編輯器,內部實現了各種上傳功能,我們甚至不用寫任何程式碼,只需要在所需的專案中正確引入ueditor即可。最近在學習java spring boot框架,專案中也選擇這款編輯器。但是配置卻出現了很多問題,是我沒有想到的。因為
Spring Boot整合redis,key自定義生成
redis key生成策略程式碼: import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; im
spring boot 整合quartz實現定時任務排程
1.pom檔案引入 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&
spring boot 整合 redis,使用@Cacheable,@CacheEvict,@CachePut,jedisPool操作redis資料庫
好久沒寫文章了,最近換了個公司,入職差不多一個半月了,接觸了不少沒玩過的新東西,這裡放個 spring boot 整合 redis的demo吧。 先看一下demo目錄: 如何建立spring boot專案我就不說了很簡單,不會百度一大把。 先看一下p
spring boot 整合quartz 定時任務排程
新增依賴: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <ver
Spring Boot 整合 Swagger,生成介面文件就這麼簡單!
開發十年,就只剩下這套架構體系了! >>>
Spring Boot 整合 Shiro ,兩種方式全總結!
在 Spring Boot 中做許可權管理,一般來說,主流的方案是 Spring Security ,但是,僅僅從技術角度來說,也可以使用 Shiro。 今天鬆哥就來和大家聊聊 Spring Boot 整合 Shiro 的話題! 一般來說,Spring Security 和 Shiro 的比較如下: Sp
Spring Boot整合quartz實現定時任務並支援切換任務資料來源
org.quartz實現定時任務並自定義切換任務資料來源 在工作中經常會需要使用到定時任務處理各種週期性的任務,org.quar
springboot整合Quartz實現動態配置定時任務
打印 uil xtra serve mail evel .com 指定 obs 前言 在我們日常的開發中,很多時候,定時任務都不是寫死的,而是寫到數據庫中,從而實現定時任務的動態配置,下面就通過一個簡單的示例,來實現這個功能。 一、新建一個springboot工程,並添加依