最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springBoot  創(chuàng)建定時(shí)任務(wù)過(guò)程詳解

 更新時(shí)間:2019年10月12日 09:34:50   作者:quellanan  
這篇文章主要介紹了springBoot 創(chuàng)建定時(shí)任務(wù)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

好幾天沒(méi)寫了,工作有點(diǎn)忙,最近工作剛好做一個(gè)定時(shí)任務(wù)統(tǒng)計(jì)的,所以就將springboot 如何創(chuàng)建定時(shí)任務(wù)整理了一下。
總的來(lái)說(shuō),springboot創(chuàng)建定時(shí)任務(wù)是非常簡(jiǎn)單的,不用像spring 或者springmvc 需要在xml 文件中配置,在項(xiàng)目啟動(dòng)的時(shí)候加載。spring boot 使用注解的方式就可以完全支持定時(shí)任務(wù)。

不過(guò)基礎(chǔ)注解的話,可能有的需求定時(shí)任務(wù)的時(shí)間會(huì)經(jīng)常變動(dòng),注解就不好修改,每次都得重新編譯,所以想將定時(shí)時(shí)間存在數(shù)據(jù)庫(kù),然后項(xiàng)目讀取數(shù)據(jù)庫(kù)執(zhí)行定時(shí)任務(wù),所以就有了基于接口的定時(shí)任務(wù)。下面就分基于注解和基于接口詳細(xì)講解。

基于注解

pom.xml 文件不用修改,我們?cè)镜捻?xiàng)目就支持,其實(shí)定時(shí)器是springboot框架自帶的,不用引入什么依賴。我們直接創(chuàng)建一個(gè)autotask 包,創(chuàng)建一個(gè)AutoTask類。

@EnableScheduling
@Component
@Slf4j
public class AutoTask {
 @Scheduled(cron="*/6 * * * * ?")
 private void process(){
  log.info("autoTask ");
 }
}

這樣一個(gè)定時(shí)器就創(chuàng)建啦,在項(xiàng)目啟動(dòng)后,會(huì)每隔6s 打印“autoTask”的日志。是不是很簡(jiǎn)單。主要用到的兩個(gè)注解就是@EnableScheduling 和 @Scheduled。

注解@EnableScheduling 就是開啟定時(shí)任務(wù)的。哪個(gè)類的中的方法想要定期執(zhí)行,就在這個(gè)類上加入這個(gè)注解。當(dāng)然這個(gè)這個(gè)注解也可以加在啟動(dòng)類上。加在啟動(dòng)類上表示項(xiàng)目中所有的類都可以創(chuàng)建定時(shí)任務(wù)。

@Scheduled 注解就是我們常見(jiàn)的定時(shí)器啦,后面的cron 就是定時(shí)任務(wù)表達(dá)式。在方法上注解,表示這個(gè)方法定期執(zhí)行。


不過(guò)@Scheduled 可以進(jìn)行兩種配置,我們熟悉的cron ,還有一種是fixedRate。比如fixedRate=6000 表示方法每6秒鐘執(zhí)行一次。

我們來(lái)啟動(dòng)項(xiàng)目看一下,可以看到兩個(gè)方法都在定期執(zhí)行。

基于接口

上面可以看到springboot 基于注解是非常方便的。但是對(duì)于頻繁變動(dòng)或者一個(gè)項(xiàng)目中有很多的定時(shí)器那就不方便管理了。所以統(tǒng)一將定時(shí)器信息存放在數(shù)據(jù)庫(kù)中。

DROP TABLE IF EXISTS `scheduled`;
CREATE TABLE `scheduled` (
 `cron_id` varchar(30) NOT NULL PRIMARY KEY,
 `cron_name` varchar(30) NULL,
 `cron` varchar(30) NOT NULL
);
INSERT INTO `scheduled` VALUES ('1','定時(shí)器任務(wù)一','0/6 * * * * ?');

在dao 層mapper1包下創(chuàng)建一個(gè)CronMapper接口,很簡(jiǎn)單的就獲取cron

public interface CronMapper {

 @Select("select cron from scheduled where cron_id = #{id}")
 public String getCron(int id);
}

這里我們就不寫service 層了。直接在autotask 包下創(chuàng)建一個(gè)AutoTaskFromDB類

@Slf4j
@Component
public class AutoTaskFromDB implements SchedulingConfigurer {

 @Autowired
 protected CronMapper cronMapper;

 @Override
 public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

  scheduledTaskRegistrar.addTriggerTask(() -> process(),
    triggerContext -> {
     String cron = cronMapper.getCron(1);
     if (cron.isEmpty()) {
      log.info("cron 為空");
     }
     return new CronTrigger(cron).nextExecutionTime(triggerContext);
    }
  );
 }

 private void process(){
  log.info("formDB ");
 }
}

可以看到也很簡(jiǎn)單,就是實(shí)現(xiàn)SchedulingConfigurer 這個(gè)吧接口,addTriggerTask()是添加一個(gè)定時(shí)器。
process()方法是我們需要定時(shí)執(zhí)行的方法體。

CronTrigger(cron).nextExecutionTime(triggerContext) 就是從數(shù)據(jù)庫(kù)讀取的cron 創(chuàng)建定時(shí)器。

這個(gè)類我沒(méi)有加上@EnableScheduling 注解,因?yàn)槲以趩?dòng)類上加上了,如果你們啟動(dòng)類上沒(méi)有加,這里記得加上。

測(cè)試一下;下圖可以看到三個(gè)定時(shí)任務(wù)都執(zhí)行了,fromDB 是從數(shù)據(jù)庫(kù)讀取的。

cron

cron 用法網(wǎng)上有很多,也沒(méi)有什么講的這里就附帶記錄下

結(jié)構(gòu)

cron表達(dá)式是一個(gè)字符串,分為6或7個(gè)域,每?jī)蓚€(gè)域之間用空格分隔,

其語(yǔ)法格式為:"秒域 分域 時(shí)域 日域 月域 周域 年域"

取值范圍

域名 可取值 可取符號(hào)(僅列部分常用)
秒域 0~59的整數(shù) * - , /
分域 0~59的整數(shù) * - , /
時(shí)域 0~23的整數(shù) * - , /
日域 1~31的整數(shù) * - , / ? L
月域 1~12的整數(shù)或JAN~DEC * - , /
周域 1~7的整數(shù)或SUN~SAT * - , / ? L #
年域 1970~2099的整數(shù) * - , /

常例

表達(dá)式 意義
每隔5秒鐘執(zhí)行一次 */5 * * * * ?
每隔1分鐘執(zhí)行一次 0 * /1 * * * ?
每天1點(diǎn)執(zhí)行一次     0 0 1 * * ?
每天23點(diǎn)55分執(zhí)行一次      0 55 23 * * ?
每月最后一天23點(diǎn)執(zhí)行一次     0 0 23 L * ?
每周六8點(diǎn)執(zhí)行一次     0 0 8 ? * L
每月最后一個(gè)周五,每隔2小時(shí)執(zhí)行一次      0 0 */2 ? * 6L
每月的第三個(gè)星期五上午10:15執(zhí)行一次     0 15 10 ? * 5#3
在每天下午2點(diǎn)到下午2:05期間的每1分鐘執(zhí)行     0 0-5 14 * * ?
表示周一到周五每天上午10:15執(zhí)行      0 15 10 ? * 2-6
每個(gè)月的最后一個(gè)星期五上午10:15執(zhí)行     0 15 10 ? * 6L
每天上午10點(diǎn),下午2點(diǎn),4點(diǎn)執(zhí)行一次     0 0 10,14,16 * * ?
朝九晚五工作時(shí)間內(nèi)每半小時(shí)執(zhí)行一次     0 0/30 9-17 * * ?
每個(gè)星期三中午12點(diǎn)執(zhí)行一次      0 0 12 ? * 4
每年三月的星期三的下午2:10和2:44各執(zhí)行一次     0 10,44 14 ? 3 4 
每月的第三個(gè)星期五上午10:15執(zhí)行一次     0 15 10 ? * 6#3
每月一日凌晨2點(diǎn)30執(zhí)行一次     0 30 2 1 * ?
每分鐘的第10秒與第20秒都會(huì)執(zhí)行     10,20 * * * * ?
每月的第2個(gè)星期的周5,凌晨執(zhí)行     0 0 0 ? * 6#2

番外

本來(lái)這個(gè)知識(shí)點(diǎn)不應(yīng)該放在這里講的,但是不多,順帶寫了,剛好也能做定時(shí)器。我們項(xiàng)目中往往有一些需求需要在項(xiàng)目啟動(dòng)的時(shí)候就執(zhí)行,那這個(gè)我們?cè)趺磳?shí)現(xiàn)了。其實(shí)spring boot 使用起來(lái)也非常簡(jiǎn)單,只用實(shí)現(xiàn) ApplicationRunner 就好了。

我們?cè)赼utotask 包下創(chuàng)建一個(gè)AutoTaskFromSpringRunner類

@Slf4j
@Component
public class AutoTaskFromSpringRunner implements ApplicationRunner {

 @Override
 public void run(ApplicationArguments args) throws Exception {
  process();
 }

 private void process(){
  log.info(" run ApplicationArguments");
 }
}

啟動(dòng)項(xiàng)目看一下,可以發(fā)現(xiàn)這個(gè)會(huì)在項(xiàng)目啟動(dòng)后執(zhí)行,但是只會(huì)執(zhí)行一次。

那這個(gè)怎么用來(lái)做定時(shí)器呢?當(dāng)然是結(jié)合線程來(lái)做啦,但是這個(gè)方法其實(shí)不建議,b畢竟線程很容易出問(wèn)題,但是提供一種思路:

@Slf4j
@Component
public class AutoTaskFromSpringRunner implements ApplicationRunner {

 @Override
 public void run(ApplicationArguments args) throws Exception {
  process();
  new Thread(() -> {
   while (true) {
    process2();
    try {
     Thread.sleep(6000);
    } catch (InterruptedException e) {
     log.error("{}",e);
    }
   }
  }).start();
 }
 private void process(){
  log.info(" run ApplicationArguments");
 }
 private void process2(){
  log.info("線程定時(shí)器");
 }
}

啟動(dòng)項(xiàng)目看下,發(fā)現(xiàn)也是可以起到定時(shí)器的作用的。

好了,就說(shuō)這么多啦,今天項(xiàng)目的代碼也同步到github 上啦。

github地址:https://github.com/QuellanAn/zlflovemm

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)掃雷游戲的代碼分享

    Java實(shí)現(xiàn)掃雷游戲的代碼分享

    windows自帶的游戲《掃雷》是陪伴了無(wú)數(shù)人的經(jīng)典游戲,本文將利用Java語(yǔ)言實(shí)現(xiàn)這一經(jīng)典的游戲,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Java的垃圾強(qiáng)制回收實(shí)例分析

    Java的垃圾強(qiáng)制回收實(shí)例分析

    這篇文章主要介紹了Java的垃圾強(qiáng)制回收,結(jié)合實(shí)例形式分析了java垃圾強(qiáng)制回收的相關(guān)原理及實(shí)現(xiàn)方法,需要的朋友可以參考下
    2019-08-08
  • Redis工具類封裝RedisUtils的使用示例

    Redis工具類封裝RedisUtils的使用示例

    本文主要介紹了Redis工具類封裝RedisUtils的使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java代碼實(shí)現(xiàn)mysql分表操作(用戶行為記錄)

    java代碼實(shí)現(xiàn)mysql分表操作(用戶行為記錄)

    這篇文章主要介紹了java代碼實(shí)現(xiàn)mysql分表操作(用戶行為記錄),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)原理解析

    Java文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Java文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • springboot配置https訪問(wèn)的方法

    springboot配置https訪問(wèn)的方法

    這篇文章主要介紹了springboot配置https訪問(wèn)的方法,需要的朋友可以參考下
    2018-11-11
  • 淺析Java中JSONObject和JSONArray使用

    淺析Java中JSONObject和JSONArray使用

    這篇文章主要介紹了Java中JSONObject和JSONArray使用的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • 解決jasperreport導(dǎo)出的pdf每頁(yè)顯示的記錄太少問(wèn)題

    解決jasperreport導(dǎo)出的pdf每頁(yè)顯示的記錄太少問(wèn)題

    這篇文章主要介紹了解決jasperreport導(dǎo)出的pdf每頁(yè)顯示的記錄太少問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring中的SpringApplicationRunListener詳細(xì)解析

    Spring中的SpringApplicationRunListener詳細(xì)解析

    這篇文章主要介紹了Spring中的SpringApplicationRunListener詳細(xì)解析,SpringApplicationRunListener是一個(gè)監(jiān)聽SpringApplication中run方法的接口,在項(xiàng)目啟動(dòng)過(guò)程的各個(gè)階段進(jìn)行事件的發(fā)布,需要的朋友可以參考下
    2023-11-11
  • hibernate4快速入門實(shí)例詳解

    hibernate4快速入門實(shí)例詳解

    Hibernate是一個(gè)輕量級(jí)的ORMapping框架,本文重點(diǎn)給大家介紹hibernate4 入門實(shí)例詳細(xì),需要的朋友參考下吧
    2017-09-09

最新評(píng)論

长兴县| 凭祥市| 高邮市| 股票| 和龙市| 卫辉市| 湖州市| 乳源| 乌拉特后旗| 镇雄县| 滕州市| 高碑店市| 唐山市| 桂平市| 理塘县| 汤阴县| 东乌珠穆沁旗| 醴陵市| 宁德市| 左贡县| 宿州市| 上林县| 沾化县| 琼中| 西平县| 平和县| 富顺县| 秦安县| 犍为县| 高清| 滦平县| 乐陵市| 独山县| 台湾省| 荣成市| 阳朔县| 蕉岭县| 施秉县| 登封市| 灵石县| 澜沧|