亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

springboot整合Quartz實現動態配置定時任務的方法

2024-07-13 10:12:52
字體:
來源:轉載
供稿:網友

前言

在我們日常的開發中,很多時候,定時任務都不是寫死的,而是寫到數據庫中,從而實現定時任務的動態配置,下面就通過一個簡單的示例,來實現這個功能。

一、新建一個springboot工程,并添加依賴

<dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-data-jpa</artifactId>     </dependency>      <dependency><!-- 為了方便測試,此處使用了內存數據庫 -->       <groupId>com.h2database</groupId>       <artifactId>h2</artifactId>       <scope>runtime</scope>     </dependency>     <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-test</artifactId>       <scope>test</scope>     </dependency>          <dependency>       <groupId>org.quartz-scheduler</groupId>       <artifactId>quartz</artifactId>       <version>2.2.1</version>       <exclusions>         <exclusion>           <artifactId>slf4j-api</artifactId>           <groupId>org.slf4j</groupId>         </exclusion>       </exclusions>     </dependency>     <dependency><!-- 該依賴必加,里面有sping對schedule的支持 -->             <groupId>org.springframework</groupId>             <artifactId>spring-context-support</artifactId>     </dependency> 

二、配置文件application.properties

# 服務器端口號  server.port=7902 # 是否生成ddl語句  spring.jpa.generate-ddl=false  # 是否打印sql語句  spring.jpa.show-sql=true  # 自動生成ddl,由于指定了具體的ddl,此處設置為none  spring.jpa.hibernate.ddl-auto=none  # 使用H2數據庫  spring.datasource.platform=h2  # 指定生成數據庫的schema文件位置  spring.datasource.schema=classpath:schema.sql  # 指定插入數據庫語句的腳本位置  spring.datasource.data=classpath:data.sql  # 配置日志打印信息  logging.level.root=INFO  logging.level.org.hibernate=INFO  logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE  logging.level.org.hibernate.type.descriptor.sql.BasicExtractor=TRACE  logging.level.com.itmuch=DEBUG  

三、Entity類

package com.chhliu.springboot.quartz.entity;  import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id;  @Entity public class Config {   @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private Long id;     @Column    private String cron;    /**    * @return the id    */   public Long getId() {     return id;   }     ……此處省略getter和setter方法…… } 

四、任務類

package com.chhliu.springboot.quartz.entity;  import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Component;  @Configuration @Component // 此注解必加 @EnableScheduling // 此注解必加 public class ScheduleTask {   private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleTask.class);   public void sayHello(){     LOGGER.info("Hello world, i'm the king of the world!!!");   } } 

五、Quartz配置類

由于springboot追求零xml配置,所以下面會以配置Bean的方式來實現

package com.chhliu.springboot.quartz.entity;  import org.quartz.Trigger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.CronTriggerFactoryBean; import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; import org.springframework.scheduling.quartz.SchedulerFactoryBean;  @Configuration public class QuartzConfigration {   /**    * attention:    * Details:配置定時任務    */   @Bean(name = "jobDetail")   public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduleTask task) {// ScheduleTask為需要執行的任務     MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();     /*      * 是否并發執行      * 例如每5s執行一次任務,但是當前任務還沒有執行完,就已經過了5s了,      * 如果此處為true,則下一個任務會執行,如果此處為false,則下一個任務會等待上一個任務執行完后,再開始執行      */     jobDetail.setConcurrent(false);          jobDetail.setName("srd-chhliu");// 設置任務的名字     jobDetail.setGroup("srd");// 設置任務的分組,這些屬性都可以存儲在數據庫中,在多任務的時候使用          /*      * 為需要執行的實體類對應的對象      */     jobDetail.setTargetObject(task);          /*      * sayHello為需要執行的方法      * 通過這幾個配置,告訴JobDetailFactoryBean我們需要執行定時執行ScheduleTask類中的sayHello方法      */     jobDetail.setTargetMethod("sayHello");     return jobDetail;   }      /**    * attention:    * Details:配置定時任務的觸發器,也就是什么時候觸發執行定時任務    */   @Bean(name = "jobTrigger")   public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {     CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();     tigger.setJobDetail(jobDetail.getObject());     tigger.setCronExpression("0 30 20 * * ?");// 初始時的cron表達式     tigger.setName("srd-chhliu");// trigger的name     return tigger;    }    /**    * attention:    * Details:定義quartz調度工廠    */   @Bean(name = "scheduler")   public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) {     SchedulerFactoryBean bean = new SchedulerFactoryBean();     // 用于quartz集群,QuartzScheduler 啟動時更新己存在的Job     bean.setOverwriteExistingJobs(true);     // 延時啟動,應用啟動1秒后     bean.setStartupDelay(1);     // 注冊觸發器     bean.setTriggers(cronJobTrigger);     return bean;   } } 

六、定時查庫,并更新任務

package com.chhliu.springboot.quartz.entity;  import javax.annotation.Resource;  import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;  import com.chhliu.springboot.quartz.repository.ConfigRepository;  @Configuration @EnableScheduling @Component public class ScheduleRefreshDatabase {   @Autowired   private ConfigRepository repository;    @Resource(name = "jobDetail")   private JobDetail jobDetail;    @Resource(name = "jobTrigger")   private CronTrigger cronTrigger;    @Resource(name = "scheduler")   private Scheduler scheduler;    @Scheduled(fixedRate = 5000) // 每隔5s查庫,并根據查詢結果決定是否重新設置定時任務   public void scheduleUpdateCronTrigger() throws SchedulerException {     CronTrigger trigger = (CronTrigger) scheduler.getTrigger(cronTrigger.getKey());     String currentCron = trigger.getCronExpression();// 當前Trigger使用的     String searchCron = repository.findOne(1L).getCron();// 從數據庫查詢出來的     System.out.println(currentCron);     System.out.println(searchCron);     if (currentCron.equals(searchCron)) {       // 如果當前使用的cron表達式和從數據庫中查詢出來的cron表達式一致,則不刷新任務     } else {       // 表達式調度構建器       CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(searchCron);       // 按新的cronExpression表達式重新構建trigger       trigger = (CronTrigger) scheduler.getTrigger(cronTrigger.getKey());       trigger = trigger.getTriggerBuilder().withIdentity(cronTrigger.getKey())           .withSchedule(scheduleBuilder).build();       // 按新的trigger重新設置job執行       scheduler.rescheduleJob(cronTrigger.getKey(), trigger);       currentCron = searchCron;     }   } } 

六、相關腳本

1、data.sql

insert into config(id,cron) values(1,'0 0/2 * * * ?'); # 每2分鐘執行一次定時任務

2、schema.sql

drop table config if exists; create table config(   id bigint generated by default as identity,   cron varchar(40),   primary key(id) ); 

六、運行測試

測試結果如下:(Quartz默認的線程池大小為10)

0 30 20 * * ? 0 0/2 * * * ? 2017-03-08 18:02:00.025 INFO 5328 --- [eduler_Worker-1] c.c.s.quartz.entity.ScheduleTask     : Hello world, i'm the king of the world!!! 2017-03-08 18:04:00.003 INFO 5328 --- [eduler_Worker-2] c.c.s.quartz.entity.ScheduleTask     : Hello world, i'm the king of the world!!! 2017-03-08 18:06:00.002 INFO 5328 --- [eduler_Worker-3] c.c.s.quartz.entity.ScheduleTask     : Hello world, i'm the king of the world!!! 2017-03-08 18:08:00.002 INFO 5328 --- [eduler_Worker-4] c.c.s.quartz.entity.ScheduleTask     : Hello world, i'm the king of the world!!! 

從上面的日志打印時間來看,我們實現了動態配置,最初的時候,任務是每天20:30執行,后面通過動態刷新變成了每隔2分鐘執行一次。

雖然上面的解決方案沒有使用Quartz推薦的方式完美,但基本上可以滿足我們的需求,當然也可以采用觸發事件的方式來實現,例如當前端修改定時任務的觸發時間時,異步的向后臺發送通知,后臺收到通知后,然后再更新程序,也可以實現動態的定時任務刷新

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情小视频| 日本人成精品视频在线| 操人视频在线观看欧美| 成人精品福利视频| 91精品久久久久久久久不口人| 成人久久精品视频| 91av网站在线播放| 久久久精品日本| 中文字幕不卡在线视频极品| 欧美成人剧情片在线观看| 欧美壮男野外gaytube| 亚洲bt欧美bt日本bt| 高清欧美性猛交| 粉嫩av一区二区三区免费野| 国产一区二区黄| 精品毛片三在线观看| 久久久爽爽爽美女图片| 一本色道久久88综合日韩精品| 欧美日韩国产精品专区| 亚洲欧美激情另类校园| 欧美黑人巨大精品一区二区| 亚洲精品日韩欧美| 日本国产精品视频| 黄色成人在线播放| 亚洲国产91精品在线观看| 九九九久久久久久| 欧美性猛交xxxxx水多| 国产小视频91| 欧美日韩中文字幕日韩欧美| 91在线|亚洲| 成人激情视频在线观看| 伊人久久免费视频| 欧美日韩激情视频| 国产精品欧美激情在线播放| 日韩电影中文字幕在线| 精品国产区一区二区三区在线观看| 欧美激情第一页xxx| 国产性猛交xxxx免费看久久| 色yeye香蕉凹凸一区二区av| 上原亚衣av一区二区三区| 久久精品91久久久久久再现| 中文字幕av日韩| 日韩欧美在线视频日韩欧美在线视频| 久久69精品久久久久久国产越南| 国产精品9999| 精品一区二区三区四区在线| 91久久精品在线| 成年无码av片在线| 亚洲第一天堂无码专区| 欧美性色xo影院| 欧美精品在线播放| 精品国产成人av| 成人日韩在线电影| 国产精品中文字幕在线| 亚洲自拍偷拍在线| 97超级碰在线看视频免费在线看| 综合欧美国产视频二区| 日韩综合中文字幕| 欧美日韩成人在线播放| www.日韩不卡电影av| 日韩成人久久久| 欧美视频中文在线看| 欧美最近摘花xxxx摘花| 欧美黑人狂野猛交老妇| 亚洲欧美国产制服动漫| 国产成人一区二区| 亚洲人成在线播放| 亚洲激情电影中文字幕| 国产亚洲xxx| 黄色成人在线播放| 色一区av在线| 亚洲美女激情视频| 国产日韩精品在线| 中文字幕v亚洲ⅴv天堂| 国产精品精品久久久久久| 中文字幕亚洲欧美| 国产成人精品久久久| 日韩av影视在线| 91国产视频在线播放| 亚洲国产欧美在线成人app| 国产精品免费久久久久久| 国产精彩精品视频| 一区二区欧美在线| 国产欧美日韩综合精品| 成人网在线免费观看| 91精品视频一区| 日韩精品视频在线观看网址| 亚洲第一中文字幕在线观看| 久久久久久久影视| 97国产精品视频| 一区二区三区无码高清视频| 午夜精品久久久久久久久久久久| 国模吧一区二区三区| 成人激情视频免费在线| 91国产美女在线观看| 日韩美女福利视频| 亚洲欧美日韩视频一区| 成人激情电影一区二区| 中文字幕亚洲情99在线| 国产精品第3页| 欧美最顶级丰满的aⅴ艳星| 欧美色图在线视频| 成人黄在线观看| 91久久久久久久| 国产亚洲精品成人av久久ww| 91精品国产91久久久久久最新| 国产精品久久久久福利| 国产精品一区二区三区免费视频| 最近2019中文免费高清视频观看www99| 38少妇精品导航| 久久影视电视剧凤归四时歌| 亚洲视频777| 亚洲精品欧美极品| 亚洲大胆人体视频| 亚洲国产精彩中文乱码av| 精品久久久久久中文字幕一区奶水| 成人中文字幕+乱码+中文字幕| 91精品免费久久久久久久久| 午夜精品视频网站| 亚洲国产精品小视频| 国产精品永久免费在线| 亚洲女人天堂成人av在线| 国产精品十八以下禁看| 欧美日韩国产色视频| 国产精品黄色影片导航在线观看| 欧美乱大交xxxxx另类电影| 在线观看欧美日韩| 亚洲夜晚福利在线观看| 欧美精品情趣视频| 91经典在线视频| 久久久久国产精品www| 亚洲性生活视频在线观看| 久久亚洲综合国产精品99麻豆精品福利| 97精品国产97久久久久久免费| 色琪琪综合男人的天堂aⅴ视频| 精品久久久久久久久久久| 国产成人91久久精品| 亚洲欧美国产另类| 国产精品99蜜臀久久不卡二区| www日韩中文字幕在线看| 欧美电影在线播放| 91在线观看欧美日韩| 国外日韩电影在线观看| 欧美丰满少妇xxxx| www.日韩视频| 91精品国产91久久| 亚洲精品国产精品国自产在线| 日韩大片免费观看视频播放| 欧美激情在线播放| 亚洲日本欧美日韩高观看| 亚洲久久久久久久久久| 久久久久久久一区二区| 国产精品日韩电影| 久久不射电影网| 欧美裸体xxxxx| 一区二区三区视频免费在线观看| 8x拔播拔播x8国产精品| 欧美在线亚洲一区| 国产精品激情av电影在线观看| 久久精品亚洲国产| 欧美激情在线有限公司| 国产中文字幕日韩| 激情懂色av一区av二区av| 国产精品久久久久一区二区|