1. 程式人生 > >Spring-boot整合Quartz,3、動態配置定時任務

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整合Quartz3動態配置定時任務

通過動態新增JobDetail例項到Scheduler中,實現可配置動態式的定時任務作業 首先實現Job介面的 Myjob,通過包全名(com.example.demo.job.MyJob1),利用反射得到Clazz。 設定JobDetail的名字和組

Spring Boot 整合 Freemarker50 多行配置是怎麼省略掉的?

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整合dubboSpring 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整合rediskey自定義生成

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工程,並添加依