Java spring定時(shí)任務(wù)詳解
一、定時(shí)任務(wù)
1、cron表達(dá)式
語法:秒 分 時(shí) 日 月 周 年
(其中“年”Spring不支持,也就是說在spring定時(shí)任務(wù)中只能設(shè)置:秒 分 時(shí) 日 月 周)


2、cron示例


3、SpringBoot整合
@EnableScheduling
@Scheduled
實(shí)例:
package com.xunqi.gulimall.seckill.scheduled;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* @Description:
* @Created: with IntelliJ IDEA.
* @author: 夏沫止水
* @createTime: 2020-07-09 18:49
**/
/**
* 定時(shí)任務(wù)
* 1、@EnableScheduling 開啟定時(shí)任務(wù)
* 2、@Scheduled開啟一個(gè)定時(shí)任務(wù)
*
* 異步任務(wù)
* 1、@EnableAsync:開啟異步任務(wù)
* 2、@Async:給希望異步執(zhí)行的方法標(biāo)注
*/
@Slf4j
@Component
@EnableScheduling
public class HelloScheduled {
/**
* 1、在Spring中表達(dá)式是6位組成,不允許第七位的年份
* 2、在周幾的的位置,1-7代表周一到周日
* 3、定時(shí)任務(wù)不該阻塞。默認(rèn)是阻塞的
* 1)、可以讓業(yè)務(wù)以異步的方式,自己提交到線程池
* CompletableFuture.runAsync(() -> {
* },execute);
*
* 2)、支持定時(shí)任務(wù)線程池;設(shè)置 TaskSchedulingProperties
* spring.task.scheduling.pool.size: 5
*
* 3)、讓定時(shí)任務(wù)異步執(zhí)行
* 異步任務(wù)
*
* 解決:使用異步任務(wù) + 定時(shí)任務(wù)來完成定時(shí)任務(wù)不阻塞的功能
*
*/
@Scheduled(cron = "*/1 * * * * ?")
public void hello() {
log.info("hello...");
try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
}
}
定時(shí)任務(wù)默認(rèn)是阻塞的線程,也就是說即使你設(shè)置成每一秒執(zhí)行一次,但是方法內(nèi)部的業(yè)務(wù)時(shí)間需要5秒才能執(zhí)行完,也會造成定時(shí)任務(wù)每6秒才能執(zhí)行一次。
當(dāng)然我們可以開啟異步線程:
@EnableAsync
@Async
實(shí)例:
package com.xunqi.gulimall.seckill.scheduled;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* @Description:
* @Created: with IntelliJ IDEA.
* @author: 夏沫止水
* @createTime: 2020-07-09 18:49
**/
/**
* 定時(shí)任務(wù)
* 1、@EnableScheduling 開啟定時(shí)任務(wù)
* 2、@Scheduled開啟一個(gè)定時(shí)任務(wù)
*
* 異步任務(wù)
* 1、@EnableAsync:開啟異步任務(wù)
* 2、@Async:給希望異步執(zhí)行的方法標(biāo)注
*/
@Slf4j
@Component
@EnableAsync
@EnableScheduling
public class HelloScheduled {
/**
* 1、在Spring中表達(dá)式是6位組成,不允許第七位的年份
* 2、在周幾的的位置,1-7代表周一到周日
* 3、定時(shí)任務(wù)不該阻塞。默認(rèn)是阻塞的
* 1)、可以讓業(yè)務(wù)以異步的方式,自己提交到線程池
* CompletableFuture.runAsync(() -> {
* },execute);
*
* 2)、支持定時(shí)任務(wù)線程池;設(shè)置 TaskSchedulingProperties
* spring.task.scheduling.pool.size: 5
*
* 3)、讓定時(shí)任務(wù)異步執(zhí)行
* 異步任務(wù)
*
* 解決:使用異步任務(wù) + 定時(shí)任務(wù)來完成定時(shí)任務(wù)不阻塞的功能
*
*/
@Async
@Scheduled(cron = "*/1 * * * * ?")
public void hello() {
log.info("hello...");
try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
}
}
這樣就會開啟異步線程,并且是非阻塞線程,因?yàn)槊看味紩_啟一個(gè)線程來執(zhí)行,我們可以看一下源碼配置的截圖,這個(gè)就是異步執(zhí)行的默認(rèn)配置,核心線程數(shù)是8,最大線程數(shù)是無限大,這時(shí)如果一直每秒執(zhí)行一次,則會造成服務(wù)器資源耗盡。

當(dāng)然,我們可以在配置文件中進(jìn)行定時(shí)任務(wù)線程池的設(shè)定:
#核心線程數(shù)
spring.task.execution.pool.core-size=20
#最大線程數(shù)
spring.task.execution.pool.max-size=50
#隊(duì)列大小
spring.task.execution.pool.queue-capacity=10000
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Java?@Scheduled定時(shí)任務(wù)不執(zhí)行解決辦法
- Java實(shí)現(xiàn)定時(shí)任務(wù)的方法總結(jié)
- Java使用quartz實(shí)現(xiàn)定時(shí)任務(wù)示例詳解
- Java實(shí)現(xiàn)定時(shí)任務(wù)最簡單的3種方法
- Java項(xiàng)目實(shí)現(xiàn)定時(shí)任務(wù)的三種方法
- java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決
- Java使用線程池執(zhí)行定時(shí)任務(wù)
- Java中定時(shí)任務(wù)的6種實(shí)現(xiàn)方式
- Java 實(shí)現(xiàn)定時(shí)任務(wù)的三種方法
- java使用@Scheduled注解執(zhí)行定時(shí)任務(wù)
- Java定時(shí)任務(wù)取消的示例代碼
相關(guān)文章
SpringCloud服務(wù)的發(fā)現(xiàn)與調(diào)用詳解
在Java微服務(wù)越來越火的今天。幾乎什么公司都在搞微服務(wù)。而使用的比較多的就是Spring?Cloud技術(shù)棧。今天就來研究一下Spring?Cloud中服務(wù)發(fā)現(xiàn)與調(diào)用的基本原理2022-07-07
Mybatis源碼分析之存儲過程調(diào)用和運(yùn)行流程
這一篇我們學(xué)習(xí)一下Mybatis調(diào)用存儲過程的使用和運(yùn)行流程,首先我們創(chuàng)建一個(gè)簡單的存儲過程,具體創(chuàng)建過程大家可以通過本文學(xué)習(xí)下2016-11-11
Java參數(shù)校驗(yàn)詳解之使用@Valid注解和自定義注解進(jìn)行參數(shù)驗(yàn)證
在后端開發(fā)中,參數(shù)校驗(yàn)是非常普遍的,下面這篇文章主要給大家介紹了關(guān)于Java參數(shù)校驗(yàn)詳解之使用@Valid注解和自定義注解進(jìn)行參數(shù)驗(yàn)證的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
使用自定義Json注解實(shí)現(xiàn)輸出日志字段脫敏
這篇文章主要介紹了使用自定義Json注解實(shí)現(xiàn)輸出日志字段脫敏,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java語言實(shí)現(xiàn)簡單FTP軟件 FTP軟件效果圖預(yù)覽之上傳功能(3)
這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)簡單FTP軟件,F(xiàn)TP軟件效果圖預(yù)覽之上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
解析Spring框架中的XmlBeanDefinitionStoreException異常情況
這篇文章主要介紹了解析Spring框架中的XmlBeanDefinitionStoreException異常情況,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Spring Security注冊過濾器注意事項(xiàng)詳解
前兩天和小伙伴聊了 Spring Security+JWT 實(shí)現(xiàn)無狀態(tài)登錄,然后有小伙伴反饋了一個(gè)問題,感覺這是一個(gè)我們平時(shí)寫代碼容易忽略的問題,所以本文給大家介紹了Spring Security注冊過濾器注意事項(xiàng),需要的朋友可以參考下2024-06-06

