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

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

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

序言

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

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

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

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

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

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

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

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

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

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

2、啟動測試

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


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

二、動態(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ù)庫記錄:

開啟本地數(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 * * * * ?');


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

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

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

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

@Configuration //1.主要用于標(biāo)記配置類,兼?zhèn)銫omponent的效果。
@EnableScheduling // 2.開啟定時任務(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í)行定時任務(wù).
 */
 @Override
 public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

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

}

4、啟動測試

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

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


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


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

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

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

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

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

 @Async
 @Scheduled(fixedDelay = 1000) //間隔1秒
 public void first() throws InterruptedException {
  System.out.println("第一個定時任務(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("第二個定時任務(wù)開始 : " + LocalDateTime.now().toLocalTime() + "\r\n線程 : " + Thread.currentThread().getName());
  System.out.println();
 }
 }

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

2、啟動測試

啟動應(yīng)用后,查看控制臺:


從控制臺可以看出,第一個定時任務(wù)和第二個定時任務(wù)互不影響;

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

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

相關(guān)文章

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

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

    大家在使用Intellij IDEA 的時候會經(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方法被對象調(diào)用,所以會復(fù)制對象,下面這篇文章主要給大家介紹了關(guān)于Java中clone方法使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(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依賴報錯問題解決

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

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

    Mybatis批量修改的操作代碼

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

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

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

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

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

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

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

最新評論

永丰县| 临海市| 安福县| 盐边县| 南安市| 建德市| 太原市| 西乌珠穆沁旗| 宿松县| 沂水县| 平江县| 嘉鱼县| 荣昌县| 绥棱县| 军事| 金堂县| 舒城县| 武强县| 潞西市| 绵竹市| 新郑市| 安徽省| 芮城县| 城口县| 大同市| 郧西县| 紫云| 祥云县| 乌兰浩特市| 宜兰市| 蚌埠市| 白朗县| 商丘市| 元江| 蕉岭县| 屯留县| 百色市| 镇赉县| 玉山县| 沐川县| 宜川县|