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

首頁 > 開發 > Java > 正文

Spring Boot中實現定時任務應用實踐

2024-07-14 08:40:39
字體:
來源:轉載
供稿:網友

前言

在Spring Boot中實現定時任務功能,可以通過Spring自帶的定時任務調度,也可以通過集成經典開源組件Quartz實現任務調度。

本文將詳細介紹關于Spring Boot實現定時任務應用的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

一、Spring定時器

1、cron表達式方式

使用自帶的定時任務,非常簡單,只需要像下面這樣,加上注解就好,不需要像普通定時任務框架那樣繼承任何定時處理接口 ,簡單示例代碼如下:

package com.power.demo.scheduledtask.simple;import com.power.demo.util.DateTimeUtil;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.util.Date;@Component@EnableSchedulingpublic class SpringTaskA { /** * CRON表達式參考:http://cron.qqe2.com/ **/ @Scheduled(cron = "*/5 * * * * ?", zone = "GMT+8:00") private void timerCron() { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } System.out.println(String.format("(timerCron)%s 每隔5秒執行一次,記錄日志", DateTimeUtil.fmtDate(new Date()))); }}SpringTaskA

上述代碼中,在一個類上添加@EnableScheduling注解,在方法上加上@Scheduled,配置下 cron 表達式,一個最最簡單的cron定時任務就完成了。cron表達式的各個組成部分,可以參考下面:

@Scheduled(cron = "[Seconds] [Minutes] [Hours] [Day of month] [Month] [Day of week] [Year]")

2、fixedRate和fixedDelay

@Scheduled注解除了cron表達式,還有其他配置方式,比如fixedRate和fixedDelay,下面這個示例通過配置方式的不同,實現不同形式的定時任務調度,示例代碼如下:

package com.power.demo.scheduledtask.simple;import com.power.demo.util.DateTimeUtil;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.util.Date;@Component@EnableSchedulingpublic class SpringTaskB { /*fixedRate:上一次開始執行時間點之后5秒再執行*/ @Scheduled(fixedRate = 5000) public void timerFixedRate() { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } System.out.println(String.format("(fixedRate)現在時間:%s", DateTimeUtil.fmtDate(new Date()))); } /*fixedDelay:上一次執行完畢時間點之后5秒再執行*/ @Scheduled(fixedDelay = 5000) public void timerFixedDelay() { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } System.out.println(String.format("(fixedDelay)現在時間:%s", DateTimeUtil.fmtDate(new Date()))); } /*第一次延遲2秒后執行,之后按fixedDelay的規則每5秒執行一次*/ @Scheduled(initialDelay = 2000, fixedDelay = 5000) public void timerInitDelay() { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } System.out.println(String.format("(initDelay)現在時間:%s", DateTimeUtil.fmtDate(new Date()))); }}SpringTaskB

注意一下主要區別:

@Scheduled(fixedRate = 5000)  :上一次開始執行時間點之后5秒再執行

@Scheduled(fixedDelay = 5000)  :上一次執行完畢時間點之后5秒再執行

@Scheduled(initialDelay=2000, fixedDelay=5000)  :第一次延遲2秒后執行,之后按fixedDelay的規則每5秒執行一次

有時候,很多項目我們都需要配置好定時任務后立即執行一次,initialDelay就可以不用配置了。

3、zone

@Scheduled注解還有一個熟悉的屬性zone,表示時區,通常,如果不寫,定時任務將使用服務器的默認時區;如果你的任務想在特定時區特定時間點跑起來,比如常見的多語言系統可能會定時跑腳本更新數據,就可以設置一個時區,如東八區,就可以設置為:

zone = "GMT+8:00"

二、Quartz

Quartz是應用最為廣泛的開源任務調度框架之一,有很多公司都根據它實現自己的定時任務管理系統。Quartz提供了最常用的兩種定時任務觸發器,即SimpleTrigger和CronTrigger,本文以最廣泛使用的CronTrigger為例。

1、添加依賴

 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency>

2、配置cron表達式

示例代碼需要,在application.properties文件中新增如下配置:

## Quartz定時job配置job.taska.cron=*/3 * * * * ?job.taskb.cron=*/7 * * * * ?job.taskmail.cron=*/5 * * * * ?

其實,我們完全可以不用配置,直接在代碼里面寫或者持久化在DB中然后讀取也可以。

3、添加定時任務實現

任務1:

package com.power.demo.scheduledtask.quartz;import com.power.demo.util.DateTimeUtil;import org.quartz.DisallowConcurrentExecution;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import java.util.Date;@DisallowConcurrentExecutionpublic class QuartzTaskA implements Job { @Override public void execute(JobExecutionContext var1) throws JobExecutionException { try { Thread.sleep(1); } catch (Exception e) { e.printStackTrace(); } System.out.println(String.format("(QuartzTaskA)%s 每隔3秒執行一次,記錄日志", DateTimeUtil.fmtDate(new Date()))); }}QuartzTaskA

任務2:

package com.power.demo.scheduledtask.quartz;import com.power.demo.util.DateTimeUtil;import org.quartz.DisallowConcurrentExecution;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import java.util.Date;@DisallowConcurrentExecutionpublic class QuartzTaskB implements Job { @Override public void execute(JobExecutionContext var1) throws JobExecutionException { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } System.out.println(String.format("(QuartzTaskB)%s 每隔7秒執行一次,記錄日志", DateTimeUtil.fmtDate(new Date()))); }}QuartzTaskB

定時發送郵件任務:

package com.power.demo.scheduledtask.quartz;import com.power.demo.service.contract.MailService;import com.power.demo.util.DateTimeUtil;import com.power.demo.util.PowerLogger;import org.joda.time.DateTime;import org.quartz.DisallowConcurrentExecution;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.beans.factory.annotation.Autowired;import java.util.Date;@DisallowConcurrentExecutionpublic class MailSendTask implements Job { @Autowired private MailService mailService; @Override public void execute(JobExecutionContext var1) throws JobExecutionException { System.out.println(String.format("(MailSendTask)%s 每隔5秒發送郵件", DateTimeUtil.fmtDate(new Date()))); try { //Thread.sleep(1); DateTime dtNow = new DateTime(new Date()); Date startTime = dtNow.minusMonths(1).toDate();//一個月前 Date endTime = dtNow.plusDays(1).toDate(); mailService.autoSend(startTime, endTime); PowerLogger.info(String.format("發送郵件,開始時間:%s,結束時間:%s"  , DateTimeUtil.fmtDate(startTime), DateTimeUtil.fmtDate(endTime))); } catch (Exception e) { e.printStackTrace(); PowerLogger.info(String.format("發送郵件,出現異常:%s,結束時間:%s", e)); } }}MailSendTask

實現任務看上去非常簡單,繼承Quartz的Job接口,重寫execute方法即可。

4、集成Quartz定時任務

怎么讓Spring自動識別初始化Quartz定時任務實例呢?這就需要引用Spring管理的Bean,向Spring容器暴露所必須的bean,通過定義Job Factory實現自動注入。

首先,添加Spring注入的Job Factory類:

package com.power.demo.scheduledtask.quartz.config;import org.quartz.spi.TriggerFiredBundle;import org.springframework.beans.factory.config.AutowireCapableBeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.scheduling.quartz.SpringBeanJobFactory;public final class AutowireBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { private transient AutowireCapableBeanFactory beanFactory; /** * Spring提供了一種機制讓你可以獲取ApplicationContext,即ApplicationContextAware接口 * 對于一個實現了ApplicationContextAware接口的類,Spring會實例化它的同時調用它的 * public voidsetApplicationContext(ApplicationContext applicationContext) throws BeansException;接口, * 將該bean所屬上下文傳遞給它。 **/ @Override public void setApplicationContext(final ApplicationContext context) { beanFactory = context.getAutowireCapableBeanFactory(); } @Override protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception { final Object job = super.createJobInstance(bundle); beanFactory.autowireBean(job); return job; }}AutowireBeanJobFactory

定義QuartzConfig:

package com.power.demo.scheduledtask.quartz.config;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.quartz.CronTriggerFactoryBean;import org.springframework.scheduling.quartz.SchedulerFactoryBean;@Configurationpublic class QuartzConfig { @Autowired @Qualifier("quartzTaskATrigger") private CronTriggerFactoryBean quartzTaskATrigger; @Autowired @Qualifier("quartzTaskBTrigger") private CronTriggerFactoryBean quartzTaskBTrigger; @Autowired @Qualifier("mailSendTrigger") private CronTriggerFactoryBean mailSendTrigger; //Quartz中的job自動注入spring容器托管的對象 @Bean public AutowireBeanJobFactory autoWiringSpringBeanJobFactory() { return new AutowireBeanJobFactory(); } @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean scheduler = new SchedulerFactoryBean(); scheduler.setJobFactory(autoWiringSpringBeanJobFactory()); //配置Spring注入的Job類 //設置CronTriggerFactoryBean,設定任務Trigger scheduler.setTriggers( quartzTaskATrigger.getObject(), quartzTaskBTrigger.getObject(), mailSendTrigger.getObject() ); return scheduler; }}QuartzConfig

接著配置job明細:

package com.power.demo.scheduledtask.quartz.config;import com.power.demo.common.AppField;import com.power.demo.scheduledtask.quartz.MailSendTask;import com.power.demo.scheduledtask.quartz.QuartzTaskA;import com.power.demo.scheduledtask.quartz.QuartzTaskB;import com.power.demo.util.ConfigUtil;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.quartz.CronTriggerFactoryBean;import org.springframework.scheduling.quartz.JobDetailFactoryBean;@Configurationpublic class TaskSetting { @Bean(name = "quartzTaskA") public JobDetailFactoryBean jobDetailAFactoryBean() { //生成JobDetail JobDetailFactoryBean factory = new JobDetailFactoryBean(); factory.setJobClass(QuartzTaskA.class); //設置對應的Job factory.setGroup("quartzTaskGroup"); factory.setName("quartzTaskAJob"); factory.setDurability(false); factory.setDescription("測試任務A"); return factory; } @Bean(name = "quartzTaskATrigger") public CronTriggerFactoryBean cronTriggerAFactoryBean() { String cron = ConfigUtil.getConfigVal(AppField.JOB_TASKA_CRON); CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean(); //設置JobDetail stFactory.setJobDetail(jobDetailAFactoryBean().getObject()); stFactory.setStartDelay(1000); stFactory.setName("quartzTaskATrigger"); stFactory.setGroup("quartzTaskGroup"); stFactory.setCronExpression(cron); return stFactory; } @Bean(name = "quartzTaskB") public JobDetailFactoryBean jobDetailBFactoryBean() { //生成JobDetail JobDetailFactoryBean factory = new JobDetailFactoryBean(); factory.setJobClass(QuartzTaskB.class); //設置對應的Job factory.setGroup("quartzTaskGroup"); factory.setName("quartzTaskBJob"); factory.setDurability(false); factory.setDescription("測試任務B"); return factory; } @Bean(name = "quartzTaskBTrigger") public CronTriggerFactoryBean cronTriggerBFactoryBean() { String cron = ConfigUtil.getConfigVal(AppField.JOB_TASKB_CRON); CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean(); //設置JobDetail stFactory.setJobDetail(jobDetailBFactoryBean().getObject()); stFactory.setStartDelay(1000); stFactory.setName("quartzTaskBTrigger"); stFactory.setGroup("quartzTaskGroup"); stFactory.setCronExpression(cron); return stFactory; } @Bean(name = "mailSendTask") public JobDetailFactoryBean jobDetailMailFactoryBean() { //生成JobDetail JobDetailFactoryBean factory = new JobDetailFactoryBean(); factory.setJobClass(MailSendTask.class); //設置對應的Job factory.setGroup("quartzTaskGroup"); factory.setName("mailSendTaskJob"); factory.setDurability(false); factory.setDescription("郵件發送任務"); return factory; } @Bean(name = "mailSendTrigger") public CronTriggerFactoryBean cronTriggerMailFactoryBean() { String cron = ConfigUtil.getConfigVal(AppField.JOB_TASKMAIL_CRON); CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean(); //設置JobDetail stFactory.setJobDetail(jobDetailMailFactoryBean().getObject()); stFactory.setStartDelay(1000); stFactory.setName("mailSendTrigger"); stFactory.setGroup("quartzTaskGroup"); stFactory.setCronExpression(cron); return stFactory; }}TaskSetting

最后啟動你的Spring Boot定時任務應用,一個完整的基于Quartz調度的定時任務就實現好了。

本文定時任務示例中,有一個定時發送郵件任務MailSendTask,下一篇將分享Spring Boot應用中以MongoDB作為存儲介質的簡易郵件系統。

擴展閱讀:

很多公司都會有自己的定時任務調度框架和系統,在Spring Boot中如何整合Quartz集群,實現動態定時任務配置?

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲free性xxxx护士hd| 日韩欧美在线国产| 最近2019中文字幕在线高清| 在线精品高清中文字幕| 国产aⅴ夜夜欢一区二区三区| 国产女人精品视频| 国产精自产拍久久久久久蜜| 国产精品一区二区女厕厕| 色偷偷88888欧美精品久久久| 久久6免费高清热精品| 欧美成人高清视频| 在线精品视频视频中文字幕| 中文字幕视频在线免费欧美日韩综合在线看| 国内精品久久久久久| 久久成人在线视频| 国产精品国产三级国产专播精品人| 亚洲自拍在线观看| 国产精品极品美女在线观看免费| 欧美性猛交xxxx富婆| 最好看的2019的中文字幕视频| 国产免费一区二区三区香蕉精| 一道本无吗dⅴd在线播放一区| 日韩欧美在线网址| 国产欧美日韩高清| 久久6免费高清热精品| 亚洲国产精品资源| 91黄色8090| 在线成人激情视频| 日韩精品高清在线| 久久影视电视剧凤归四时歌| 午夜精品在线视频| 九九热这里只有精品6| 国产精品成人国产乱一区| 国内精久久久久久久久久人| 久久久久久久久久久91| 精品国产一区二区三区久久久| 操日韩av在线电影| 欧美激情一区二区三区成人| 中文字幕国产亚洲| 久久香蕉国产线看观看网| 欧美日韩免费看| 日韩av在线一区| 久久99久久99精品免观看粉嫩| 亚洲人成网站色ww在线| 91精品视频在线看| 日韩成人高清在线| 欧美黑人巨大精品一区二区| 精品在线欧美视频| 日本久久91av| 久久久www成人免费精品| 欧美午夜精品久久久久久人妖| 欧美日韩加勒比精品一区| 亚洲欧美国产日韩中文字幕| 欧美在线亚洲一区| 日本老师69xxx| 国产美女91呻吟求| 成人午夜在线观看| 欧美视频在线看| 国产精品一区二区3区| 欧美高清理论片| 亚洲欧洲日产国产网站| 69国产精品成人在线播放| 国产成人精品av| 国产成人精品国内自产拍免费看| 国产精品人人做人人爽| 亚洲人永久免费| 国产视频丨精品|在线观看| 91国偷自产一区二区三区的观看方式| 亚洲欧美在线免费观看| 亚洲性xxxx| 欧美一区二区色| 在线观看视频99| 97欧美精品一区二区三区| 欧美丰满老妇厨房牲生活| 91九色在线视频| 日韩久久精品电影| 久久久久成人精品| 国产精品久久久久久中文字| 精品性高朝久久久久久久| 国产91久久婷婷一区二区| 国产精品久久久久久av福利软件| 亚洲国产精品一区二区久| 日韩欧美成人区| 日韩在线视频国产| 久久91精品国产| 国产亚洲精品综合一区91| 亚洲欧洲成视频免费观看| 国产一区在线播放| 高清欧美性猛交xxxx黑人猛交| 国产a∨精品一区二区三区不卡| 中文字幕综合一区| 亚洲新中文字幕| 91av视频在线免费观看| 亚洲欧洲自拍偷拍| 国产精品欧美一区二区| 中文字幕国产精品| 成人国产精品日本在线| 久久综合亚洲社区| 精品亚洲夜色av98在线观看| 中文字幕欧美日韩va免费视频| 国产成人欧美在线观看| 欧美性猛交99久久久久99按摩| 欧美视频第一页| 国产日产欧美a一级在线| 欧美激情xxxx| 亚洲天堂视频在线观看| 国产999在线观看| 亚洲欧美国产一本综合首页| 亚洲男人的天堂在线| 精品女厕一区二区三区| 日韩有码片在线观看| 久久精品色欧美aⅴ一区二区| 日韩精品在线视频观看| 欧美国产在线视频| 国产日韩欧美在线视频观看| 成人看片人aa| 欧美怡春院一区二区三区| 亚洲偷熟乱区亚洲香蕉av| 精品呦交小u女在线| 成人免费高清完整版在线观看| 日韩有码视频在线| 欧美情侣性视频| 日韩美女毛茸茸| 日本精品视频网站| 欧美激情性做爰免费视频| 国产美女被下药99| 成人国产在线视频| 国产精品女视频| 91国偷自产一区二区三区的观看方式| 亚洲已满18点击进入在线看片| 欧美日韩精品在线视频| 国产精品高潮呻吟久久av无限| 亚洲福利视频二区| 欧美亚洲视频在线看网址| 精品成人久久av| 国产精品一区二区三区久久久| 亚洲黄色成人网| 国产精品成av人在线视午夜片| 日韩欧美大尺度| 国内自拍欧美激情| 红桃视频成人在线观看| 日韩欧美亚洲范冰冰与中字| 欧美日韩亚洲激情| 一区二区三区视频免费在线观看| 日韩av黄色在线观看| 国产精品中文字幕在线观看| 久久影视电视剧凤归四时歌| 色av中文字幕一区| 欧美刺激性大交免费视频| 2019日本中文字幕| 亚洲欧洲xxxx| 久久久亚洲福利精品午夜| 欧美一级片一区| 81精品国产乱码久久久久久| 国精产品一区一区三区有限在线| 欧美成人免费网| 亚洲精品小视频在线观看| 久青草国产97香蕉在线视频| 日韩久久免费电影| 97视频在线观看免费高清完整版在线观看| 日本亚洲欧美成人| 国产色综合天天综合网| 亚洲精品综合久久中文字幕| 国产精品美乳在线观看|