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

Java下SpringBoot創(chuàng)建定時(shí)任務(wù)詳解

 更新時(shí)間:2020年07月23日 10:57:45   作者:淼淼之森  
這篇文章主要介紹了Java下SpringBoot創(chuàng)建定時(shí)任務(wù)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

序言

使用SpringBoot創(chuàng)建定時(shí)任務(wù)非常簡單,目前主要有以下三種創(chuàng)建方式:

  • 一、基于注解(@Scheduled)
  • 二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是實(shí)際使用中我們往往想從數(shù)據(jù)庫中讀取指定時(shí)間來動(dòng)態(tài)執(zhí)行定時(shí)任務(wù),這時(shí)候基于接口的定時(shí)任務(wù)就派上用場了。
  • 三、基于注解設(shè)定多線程定時(shí)任務(wù)

一、靜態(tài):基于注解

基于注解@Scheduled默認(rèn)為單線程,開啟多個(gè)任務(wù)時(shí),任務(wù)的執(zhí)行時(shí)機(jī)會(huì)受上一個(gè)任務(wù)執(zhí)行時(shí)間的影響。

1、創(chuàng)建定時(shí)器

使用SpringBoot基于注解來創(chuàng)建定時(shí)任務(wù)非常簡單,只需幾行代碼便可完成。代碼如下:

@Configuration //1.主要用于標(biāo)記配置類,兼?zhèn)銫omponent的效果。
@EnableScheduling // 2.開啟定時(shí)任務(wù)
public class SaticScheduleTask {
 //3.添加定時(shí)任務(wù)
 @Scheduled(cron = "0/5 * * * * ?")
 //或直接指定時(shí)間間隔,例如:5秒
 //@Scheduled(fixedRate=5000)
 private void configureTasks() {
 System.err.println("執(zhí)行靜態(tài)定時(shí)任務(wù)時(shí)間: " + LocalDateTime.now());
 }
}

Cron表達(dá)式參數(shù)分別表示:

  • 秒(0~59) 例如0/5表示每5秒
  • 分(0~59)
  • 時(shí)(0~23)
  • 日(0~31)的某天,需計(jì)算
  • 月(0~11)周幾( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)

@Scheduled:除了支持靈活的參數(shù)表達(dá)式cron之外,還支持簡單的延時(shí)操作,例如 fixedDelay ,fixedRate 填寫相應(yīng)的毫秒數(shù)即可。

2、啟動(dòng)測試

啟動(dòng)應(yīng)用,可以看到控制臺(tái)打印出如下信息:


顯然,使用@Scheduled 注解很方便,但缺點(diǎn)是當(dāng)我們調(diào)整了執(zhí)行周期的時(shí)候,需要重啟應(yīng)用才能生效,這多少有些不方便。為了達(dá)到實(shí)時(shí)生效的效果,可以使用接口來完成定時(shí)任務(wù)。

二、動(dòng)態(tài):基于接口

基于接口(SchedulingConfigurer)

1、導(dǎo)入依賴包

<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter</artifactId>
 <version>2.0.4.RELEASE</version>
 </parent>

 <dependencies>
 <dependency><!--添加Web依賴 -->
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency><!--添加MySql依賴 -->
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
 </dependency>
 <dependency><!--添加Mybatis依賴 配置mybatis的一些初始化的東西-->
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.3.1</version>
 </dependency>
 <dependency><!-- 添加mybatis依賴 -->
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.5</version>
  <scope>compile</scope>
 </dependency>
 </dependencies>

2、添加數(shù)據(jù)庫記錄:

開啟本地?cái)?shù)據(jù)庫mysql,隨便打開查詢窗口,然后執(zhí)行腳本內(nèi)容,如下:

DROP DATABASE IF EXISTS `socks`;
CREATE DATABASE `socks`;
USE `SOCKS`;
DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron` (
 `cron_id` varchar(30) NOT NULL PRIMARY KEY,
 `cron` varchar(30) NOT NULL 
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');


然后在項(xiàng)目中的application.yml 添加數(shù)據(jù)源:

spring:
 datasource:
 url: jdbc:mysql://localhost:3306/socks
 username: root
 password: 123456

3、創(chuàng)建定時(shí)器

數(shù)據(jù)庫準(zhǔn)備好數(shù)據(jù)之后,我們編寫定時(shí)任務(wù),注意這里添加的是TriggerTask,目的是循環(huán)讀取我們?cè)跀?shù)據(jù)庫設(shè)置好的執(zhí)行周期,以及執(zhí)行相關(guān)定時(shí)任務(wù)的內(nèi)容。
具體代碼如下:

@Configuration //1.主要用于標(biāo)記配置類,兼?zhèn)銫omponent的效果。
@EnableScheduling // 2.開啟定時(shí)任務(wù)
public class DynamicScheduleTask implements SchedulingConfigurer {

 @Mapper
 public interface CronMapper {
 @Select("select cron from cron limit 1")
 public String getCron();
 }

 @Autowired //注入mapper
 @SuppressWarnings("all")
 CronMapper cronMapper;

 /**
 * 執(zhí)行定時(shí)任務(wù).
 */
 @Override
 public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

 taskRegistrar.addTriggerTask(
  //1.添加任務(wù)內(nèi)容(Runnable)
  () -> System.out.println("執(zhí)行動(dòng)態(tài)定時(shí)任務(wù): " + LocalDateTime.now().toLocalTime()),
  //2.設(shè)置執(zhí)行周期(Trigger)
  triggerContext -> {
   //2.1 從數(shù)據(jù)庫獲取執(zhí)行周期
   String cron = cronMapper.getCron();
   //2.2 合法性校驗(yàn).
   if (StringUtils.isEmpty(cron)) {
   // Omitted Code ..
   }
   //2.3 返回執(zhí)行周期(Date)
   return new CronTrigger(cron).nextExecutionTime(triggerContext);
  }
 );
 }

}

4、啟動(dòng)測試

啟動(dòng)應(yīng)用后,查看控制臺(tái),打印時(shí)間是我們預(yù)期的每10秒一次:

然后打開Navicat ,將執(zhí)行周期修改為每6秒執(zhí)行一次,如圖:


查看控制臺(tái),發(fā)現(xiàn)執(zhí)行周期已經(jīng)改變,并且不需要我們重啟應(yīng)用,十分方便。如圖:


注意:如果在數(shù)據(jù)庫修改時(shí)格式出現(xiàn)錯(cuò)誤,則定時(shí)任務(wù)會(huì)停止,即使重新修改正確;此時(shí)只能重新啟動(dòng)項(xiàng)目才能恢復(fù)。

三、多線程定時(shí)任務(wù)

基于注解設(shè)定多線程定時(shí)任務(wù)

1、創(chuàng)建多線程定時(shí)任務(wù)

//@Component注解用于對(duì)那些比較中立的類進(jìn)行注釋;
//相對(duì)與在持久層、業(yè)務(wù)層和控制層分別采用 @Repository、@Service 和 @Controller 對(duì)分層中的類進(jìn)行注釋
@Component
@EnableScheduling // 1.開啟定時(shí)任務(wù)
@EnableAsync // 2.開啟多線程
public class MultithreadScheduleTask {

 @Async
 @Scheduled(fixedDelay = 1000) //間隔1秒
 public void first() throws InterruptedException {
  System.out.println("第一個(gè)定時(shí)任務(wù)開始 : " + LocalDateTime.now().toLocalTime() + "\r\n線程 : " + Thread.currentThread().getName());
  System.out.println();
  Thread.sleep(1000 * 10);
 }

 @Async
 @Scheduled(fixedDelay = 2000)
 public void second() {
  System.out.println("第二個(gè)定時(shí)任務(wù)開始 : " + LocalDateTime.now().toLocalTime() + "\r\n線程 : " + Thread.currentThread().getName());
  System.out.println();
 }
 }

注: 這里的@Async注解很關(guān)鍵

2、啟動(dòng)測試

啟動(dòng)應(yīng)用后,查看控制臺(tái):


從控制臺(tái)可以看出,第一個(gè)定時(shí)任務(wù)和第二個(gè)定時(shí)任務(wù)互不影響;

并且,由于開啟了多線程,第一個(gè)任務(wù)的執(zhí)行時(shí)間也不受其本身執(zhí)行時(shí)間的限制,所以需要注意可能會(huì)出現(xiàn)重復(fù)操作導(dǎo)致數(shù)據(jù)異常。

到此這篇關(guān)于Java下SpringBoot創(chuàng)建定時(shí)任務(wù)詳解的文章就介紹到這了,更多相關(guān)SpringBoot創(chuàng)建定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Intellij IDEA 2019 最新亂碼問題及解決必殺技(必看篇)

    Intellij IDEA 2019 最新亂碼問題及解決必殺技(必看篇)

    大家在使用Intellij IDEA 的時(shí)候會(huì)經(jīng)常遇到各種亂碼問題,今天小編給大家分享一些關(guān)于Intellij IDEA 2019 最新亂碼問題及解決必殺技,感興趣的朋友跟隨小編一起看看吧
    2020-04-04
  • Java?Agent探針技術(shù)詳解示例

    Java?Agent探針技術(shù)詳解示例

    這篇文章主要介紹了Java?Agent?探針技術(shù)詳情,Java?中的?Agent?技術(shù)可以讓我們無侵入性的去進(jìn)行代理,最常用于程序調(diào)試、熱部署、性能診斷分析等場景,下文更多相關(guān)資料,感興趣的小伙伴可以參考一下
    2022-06-06
  • IDEA2023常用配置指南(JDK/系統(tǒng)設(shè)置等常用配置)

    IDEA2023常用配置指南(JDK/系統(tǒng)設(shè)置等常用配置)

    idea很強(qiáng)大,但是初次安裝默認(rèn)的有很多設(shè)置并不是滿足我們開發(fā)的需要,下面這篇文章主要給大家介紹了關(guān)于IDEA2023常用配置(JDK/系統(tǒng)設(shè)置等常用配置)的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Java中clone方法使用筆記

    Java中clone方法使用筆記

    clone顧名思義是復(fù)制,在Java語言中,clone方法被對(duì)象調(diào)用,所以會(huì)復(fù)制對(duì)象,下面這篇文章主要給大家介紹了關(guān)于Java中clone方法使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens

    從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens

    這篇文章主要為大家介紹了從0構(gòu)建Oauth2Server服務(wù)之Refreshing-access-tokens刷新令牌示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • SpringBoot導(dǎo)入mail依賴報(bào)錯(cuò)問題解決

    SpringBoot導(dǎo)入mail依賴報(bào)錯(cuò)問題解決

    這篇文章主要介紹了SpringBoot導(dǎo)入mail依賴報(bào)錯(cuò)問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Mybatis批量修改的操作代碼

    Mybatis批量修改的操作代碼

    這篇文章主要介紹了Mybatis批量修改的操作代碼,包括整體批量修改的詳細(xì)代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2017-09-09
  • Java面向?qū)ο笾b類的用途與實(shí)際使用

    Java面向?qū)ο笾b類的用途與實(shí)際使用

    所謂包裝類,就是能夠直接將簡單類型的變量表示為一個(gè)類,在執(zhí)行變量類型的相互轉(zhuǎn)換時(shí),我們會(huì)大量使用這些包裝類,本文我們來深入探索一下Java包裝類的相關(guān)內(nèi)容,需要的朋友可以參考下
    2022-03-03
  • Java變量命名規(guī)則詳解及常見命名錯(cuò)誤(建議收藏)

    Java變量命名規(guī)則詳解及常見命名錯(cuò)誤(建議收藏)

    這篇文章主要介紹了Java中變量命名的規(guī)則及最佳實(shí)踐,包括有效字符、大小寫敏感性、不能使用保留字、駝峰命名法、描述性命名、特定類型的命名習(xí)慣、避免潛在問題、常見命名錯(cuò)誤及如何避免等內(nèi)容,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • 利用Lambda表達(dá)式創(chuàng)建新線程案例

    利用Lambda表達(dá)式創(chuàng)建新線程案例

    這篇文章主要介紹了利用Lambda表達(dá)式創(chuàng)建新線程案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評(píng)論

册亨县| 苏尼特右旗| 九寨沟县| 浮梁县| 德庆县| 南开区| 东台市| 岳西县| 察哈| 南靖县| 和林格尔县| 贵定县| 崇左市| 梁河县| 灌云县| 寿阳县| 漠河县| 天祝| 嘉祥县| 杭锦后旗| 雷波县| 天气| 涪陵区| 大埔区| 长海县| 宁化县| 龙南县| 昌吉市| 陇西县| 渑池县| 通化市| 合水县| 资阳市| 苍山县| 扎鲁特旗| 宜兴市| 略阳县| 民和| 陆良县| 响水县| 全州县|