一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot實現定時任務的三種方式小結

SpringBoot實現定時任務的三種方式小結

2022-03-08 00:50程序員阿九不喝酒 Java教程

這篇文章主要介紹了SpringBoot實現定時任務的三種方式小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot三種方式實現定時任務

定時任務實現的三種方式

  • Timer:這是java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程序按照某一個頻度執行,但不能在指定時間運行。一般用的較少。
  • ScheduledExecutorService:也jdk自帶的一個類;是基于線程池設計的定時任務類,每個調度任務都會分配到線程池中的一個線程去執行,也就是說,任務是并發執行,互不影響。
  • Spring Task:Spring3.0以后自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。

使用Timer

這個目前在項目中用的較少,直接貼demo代碼。具體的介紹可以查看api

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class TestTimer {
    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task  run:"+ new Date());
            }
        };
        Timer timer = new Timer();
        //安排指定的任務在指定的時間開始進行重復的固定延遲執行。這里是每3秒執行一次
        timer.schedule(timerTask,10,3000);
    }
}

使用ScheduledExecutorService

該方法跟Timer類似,直接看demo:

?
1
2
3
4
5
6
7
8
public class TestScheduledExecutorService {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 參數:1、任務體 2、首次執行的延時時間
        //      3、任務執行間隔 4、間隔時間單位
        service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
    }
}

使用Spring Task

1.簡單的定時任務

在SpringBoot項目中,我們可以很優雅的使用注解來實現定時任務,首先創建項目,導入依賴:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

創建任務類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Slf4j
@Component
public class ScheduledService {
    @Scheduled(cron = "0/5 * * * * *")
    public void scheduled(){
        log.info("=====>>>>>使用cron  {}",System.currentTimeMillis());
    }
    @Scheduled(fixedRate = 5000)
    public void scheduled1() {
        log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis());
    }
    @Scheduled(fixedDelay = 5000)
    public void scheduled2() {
        log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis());
    }
}

在主類上使用@EnableScheduling注解開啟對定時任務的支持,然后啟動項目

可以看到三個定時任務都已經執行,并且使同一個線程中串行執行,如果只有一個定時任務,這樣做肯定沒問題,當定時任務增多,如果一個任務卡死,會導致其他任務也無法執行。

2.多線程執行

在傳統的Spring項目中,我們可以在xml配置文件添加task的配置,而在SpringBoot項目中一般使用config配置類的方式添加配置,所以新建一個AsyncConfig類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
@EnableAsync
public class AsyncConfig {
     /*
    此處成員變量應該使用@Value從配置中讀取
     */
    private int corePoolSize = 10;
    private int maxPoolSize = 200;
    private int queueCapacity = 10;
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.initialize();
        return executor;
    }
}
  • @Configuration:表明該類是一個配置類
  • @EnableAsync:開啟異步事件的支持

然后在定時任務的類或者方法上添加@Async 。最后重啟項目,每一個任務都是在不同的線程中。

在線cron表達式生成:http://qqe2.com/cron/index

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/longzhongxiaoniao/article/details/86182075

延伸 · 閱讀

精彩推薦
  • Java教程基于UDP協議實現聊天系統

    基于UDP協議實現聊天系統

    這篇文章主要為大家詳細介紹了基于UDP協議實現聊天系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    CosperNXL11742021-09-10
  • Java教程mybatis調用存儲過程的實例代碼

    mybatis調用存儲過程的實例代碼

    這篇文章主要介紹了mybatis調用存儲過程的實例,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    動力節點11232021-01-25
  • Java教程JDBC環境設置(中文詳解)

    JDBC環境設置(中文詳解)

    要開始使用JDBC設置,按照以下所示的步驟開發JDBC環境。以下內容假設Windows平臺上 ...

    java技術網4212019-11-14
  • Java教程hibernate測試時遇到的幾個異常及解決方法匯總

    hibernate測試時遇到的幾個異常及解決方法匯總

    今天小編就為大家分享一篇關于hibernate測試時遇到的幾個異常及解決方法匯總,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋...

    光仔December7572021-07-26
  • Java教程10分鐘帶你理解Java中的反射

    10分鐘帶你理解Java中的反射

    反射是java中一種強大的工具,能夠使我們很方便的創建靈活的代碼,這篇文章帶大家十分鐘快速理解Java中的反射,有需要的可以參考借鑒。 ...

    daisy2072020-06-08
  • Java教程Java設計模式之java迭代器模式詳解

    Java設計模式之java迭代器模式詳解

    這篇文章主要介紹了java迭代器模式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一...

    大忽悠愛忽悠8122022-01-04
  • Java教程Java利用遞歸算法實現查詢斐波那契數

    Java利用遞歸算法實現查詢斐波那契數

    今天小編就為大家分享一篇關于Java利用遞歸算法實現查詢斐波那契數,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟...

    哲別君9902021-06-21
  • Java教程關于java入門與java開發環境配置詳細教程

    關于java入門與java開發環境配置詳細教程

    這篇文章主要介紹了關于java入門與java開發環境配置詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價...

    程序員Eason10482021-08-31
主站蜘蛛池模板: 色先锋影音先锋 | 午夜福利试看120秒体验区 | 三级全黄的视频 | 我年轻漂亮的继坶2中字在线播放 | 亚洲国产成人超福利久久精品 | 麻生希在线观看 | 激情小说欧美图片 | 亚洲日本中文字幕天堂网 | 国产精品久久久久久久免费大片 | 性生大片免费看 | 亚洲AV 日韩 国产 有码 | 国产一区二区三区水野朝阳 | 白虎喷水 | 视频在线91 | 国产精品露脸国语对白河北 | 拔插拔插.com | 欧美视频在线一区二区三区 | 精品一区二区三区免费毛片 | 美女插插视频 | 亚洲国产欧美另类va在线观看 | 日本一区二区三区四区无限 | 91亚洲在线 | 成人中文字幕在线高清 | 欧美日韩国产成人精品 | 日本aaaa级| 亚洲国产日韩欧美在线vip1区 | 369看片网| 国产久热香蕉在线观看 | 91大神亚洲影视在线 | 东北美女野外bbwbbw免费 | 黄a 大片a v 永久免费 | 国产精品怡红院在线观看 | 无码国产成人777爽死在线观看 | 美女尿口羞羞视频 | 天天欲色成人综合网站 | 性满足久久久久久久久 | 欧亚精品一区二区三区 | 四虎永久免费在线观看 | 日本孕妇与黑人xxxxxx | 暖暖的免费观看高清视频韩国 | 天天做天天爱天天综合网 |