????歡迎光臨,終于等到你啦????
??我是蘇澤,一位對(duì)技術(shù)充滿熱情的探索者和分享者。????
??持續(xù)更新的專欄《Spring 狂野之旅:從入門到入魔》 ??
本專欄帶你從Spring入門到入魔?
這是蘇澤的個(gè)人主頁(yè)可以看到我其他的內(nèi)容哦????
努力的蘇澤http://suzee.blog.csdn.net/
簡(jiǎn)介
本篇詳細(xì)講解定時(shí)任務(wù)如何構(gòu)建? 文末有詳細(xì)的實(shí)戰(zhàn)案例 定時(shí)發(fā)送郵件?
目錄
簡(jiǎn)介
介紹
定時(shí)任務(wù)調(diào)度技術(shù)是一種用于在預(yù)定時(shí)間或間隔時(shí)間執(zhí)行任務(wù)的技術(shù)。
Spring中的定時(shí)任務(wù)調(diào)度模塊簡(jiǎn)介
?編輯
Spring Schedule的基本用法
Cron表達(dá)式詳解
?編輯
定時(shí)任務(wù)的參數(shù)和返回值處理
處理定時(shí)任務(wù)方法的返回值:
定時(shí)任務(wù)的錯(cuò)誤處理與異常處理:
處理定時(shí)任務(wù)方法中的異常:
定時(shí)任務(wù)的錯(cuò)誤處理策略:
配置多個(gè)定時(shí)任務(wù):
并發(fā)執(zhí)行多個(gè)定時(shí)任務(wù):
控制定時(shí)任務(wù)的執(zhí)行順序:
實(shí)戰(zhàn)案例:定時(shí)發(fā)送郵箱
去QQ郵箱
開(kāi)啟這個(gè)服務(wù)
介紹
定時(shí)任務(wù)調(diào)度技術(shù)是一種用于在預(yù)定時(shí)間或間隔時(shí)間執(zhí)行任務(wù)的技術(shù)。
它允許開(kāi)發(fā)人員根據(jù)特定的時(shí)間表安排任務(wù)的執(zhí)行,可以是一次性任務(wù)或周期性任務(wù)。定時(shí)任務(wù)調(diào)度技術(shù)通常用于需要定期執(zhí)行的任務(wù),例如數(shù)據(jù)備份、定時(shí)報(bào)告生成、定時(shí)數(shù)據(jù)同步等。
Spring中的定時(shí)任務(wù)調(diào)度模塊簡(jiǎn)介
定時(shí)任務(wù)調(diào)度技術(shù)提供了一種方便和可靠的方式來(lái)執(zhí)行重復(fù)性或定期性的任務(wù)。它可以幫助開(kāi)發(fā)人員自動(dòng)化一些常規(guī)的任務(wù),減少人工干預(yù)和減輕人力負(fù)擔(dān)。
Spring Schedule的基本用法
需要在項(xiàng)目的 Maven 依賴中添加 Spring Schedule 的相關(guān)依賴項(xiàng)??梢栽陧?xiàng)目的 pom.xml 文件中添加以下依賴項(xiàng):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
然后,您需要在 Spring 配置文件中啟用定時(shí)任務(wù)調(diào)度功能??梢酝ㄟ^(guò)在配置類上添加注解?@EnableScheduling
?來(lái)啟用定時(shí)任務(wù)調(diào)度。
- 創(chuàng)建定時(shí)任務(wù)方法:
在您的 Spring Bean 中創(chuàng)建一個(gè)方法,該方法將作為定時(shí)任務(wù)的執(zhí)行體??梢酝ㄟ^(guò)在方法上添加注解?@Scheduled
?來(lái)標(biāo)識(shí)該方法是一個(gè)定時(shí)任務(wù)。
@Component
public class MyTask {
@Scheduled(fixedDelay = 5000) // 每隔5秒執(zhí)行一次
public void doTask() {
// 執(zhí)行任務(wù)的邏輯
}
}
- 配置定時(shí)任務(wù)執(zhí)行時(shí)間表達(dá)式:
可以使用?@Scheduled
?注解的屬性來(lái)配置定時(shí)任務(wù)的執(zhí)行時(shí)間表達(dá)式。例如,可以使用?fixedDelay
?屬性來(lái)指定任務(wù)的執(zhí)行間隔時(shí)間,或者使用?cron
?屬性來(lái)指定任務(wù)的執(zhí)行時(shí)間規(guī)則。
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class MyTask {
// 固定延遲執(zhí)行,每隔5秒執(zhí)行一次
@Scheduled(fixedDelay = 5000)
public void fixedDelayTask() {
System.out.println("Fixed delay task executed.");
}
// 固定頻率執(zhí)行,每隔3秒執(zhí)行一次
@Scheduled(fixedRate = 3000)
public void fixedRateTask() {
System.out.println("Fixed rate task executed.");
}
// Cron 表達(dá)式執(zhí)行,每分鐘的第30秒執(zhí)行一次
@Scheduled(cron = "30 * * * * *")
public void cronTask() {
System.out.println("Cron task executed.");
}
}
- 運(yùn)行定時(shí)任務(wù):
當(dāng) Spring 應(yīng)用啟動(dòng)時(shí),定時(shí)任務(wù)將自動(dòng)開(kāi)始執(zhí)行。您可以查看日志或其他輸出來(lái)確認(rèn)定時(shí)任務(wù)的執(zhí)行情況。
定時(shí)任務(wù)的執(zhí)行方式:
在 Spring Schedule 中,有幾種常見(jiàn)的定時(shí)任務(wù)執(zhí)行方式:
- 固定延遲執(zhí)行(fixedDelay):在當(dāng)前任務(wù)完成后,等待一定的延遲時(shí)間后再次執(zhí)行任務(wù)。
- 固定頻率執(zhí)行(fixedRate):以固定的頻率執(zhí)行任務(wù),不考慮任務(wù)的執(zhí)行時(shí)間。
- Cron 表達(dá)式執(zhí)行:使用標(biāo)準(zhǔn)的 Cron 表達(dá)式配置任務(wù)的執(zhí)行時(shí)間規(guī)則,可以實(shí)現(xiàn)更靈活的定時(shí)任務(wù)調(diào)度。
fixedDelayTask()
?方法使用?@Scheduled(fixedDelay = 5000)
?注解,配置了任務(wù)的執(zhí)行間隔為每隔5秒執(zhí)行一次。當(dāng)任務(wù)執(zhí)行完成后,會(huì)等待5秒再次執(zhí)行。
fixedRateTask()
?方法使用?@Scheduled(fixedRate = 3000)
?注解,配置了任務(wù)的執(zhí)行頻率為每隔3秒執(zhí)行一次。不考慮任務(wù)的執(zhí)行時(shí)間,即使上一次任務(wù)還未完成,也會(huì)按照固定頻率執(zhí)行。
cronTask()
?方法使用?@Scheduled(cron = "30 * * * * *")
?注解,配置了任務(wù)的執(zhí)行時(shí)間規(guī)則為每分鐘的第30秒執(zhí)行一次。使用標(biāo)準(zhǔn)的 Cron 表達(dá)式可以實(shí)現(xiàn)更靈活的定時(shí)任務(wù)調(diào)度。
Cron表達(dá)式詳解
?
-
定時(shí)任務(wù)的參數(shù)和返回值處理
定時(shí)任務(wù)方法可以接受參數(shù),并且可以有返回值。下面是對(duì)定時(shí)任務(wù)參數(shù)和返回值的處理方式的講解:
- 傳遞參數(shù)給定時(shí)任務(wù)方法:
定時(shí)任務(wù)方法可以接受參數(shù),您可以在方法的參數(shù)列表中聲明所需的參數(shù)。例如,如果您希望定時(shí)任務(wù)方法接受一個(gè)字符串參數(shù),可以按如下方式定義方法:
@Scheduled(fixedDelay = 5000)
public void myTask(String parameter) {
// 使用接收到的參數(shù)執(zhí)行任務(wù)邏輯
}
當(dāng)定時(shí)任務(wù)被觸發(fā)時(shí),Spring Schedule 將自動(dòng)將參數(shù)傳遞給定時(shí)任務(wù)方法。您可以根據(jù)需要在方法內(nèi)部使用這些參數(shù)。
-
處理定時(shí)任務(wù)方法的返回值:
定時(shí)任務(wù)方法可以有返回值,但是返回值通常被忽略,因?yàn)槎〞r(shí)任務(wù)的執(zhí)行是異步的,沒(méi)有實(shí)際的調(diào)用方來(lái)處理返回值。因此,通常情況下,定時(shí)任務(wù)方法的返回值應(yīng)該為?void
。
定時(shí)任務(wù)的錯(cuò)誤處理與異常處理:
在定時(shí)任務(wù)的執(zhí)行過(guò)程中,可能會(huì)出現(xiàn)錯(cuò)誤或異常。下面是對(duì)定時(shí)任務(wù)錯(cuò)誤處理和異常處理的講解:
-
處理定時(shí)任務(wù)方法中的異常:
如果定時(shí)任務(wù)方法中拋出了異常,Spring Schedule 將捕獲這些異常并記錄日志。默認(rèn)情況下,異常不會(huì)向上層傳播,也不會(huì)打斷定時(shí)任務(wù)的執(zhí)行。因此,您可以在定時(shí)任務(wù)方法中處理異常,例如進(jìn)行異常日志記錄或錯(cuò)誤處理。
@Scheduled(fixedDelay = 5000)
public void myTask() {
try {
// 執(zhí)行任務(wù)邏輯
} catch (Exception e) {
// 處理異常,例如記錄日志或進(jìn)行錯(cuò)誤處理
}
}
-
定時(shí)任務(wù)的錯(cuò)誤處理策略:
如果您希望在定時(shí)任務(wù)方法拋出異常時(shí)中斷任務(wù)的執(zhí)行,并采取特定的錯(cuò)誤處理策略,可以通過(guò)配置?@EnableScheduling
?注解的?exceptionHandler
?屬性來(lái)實(shí)現(xiàn)。
@Configuration
@EnableScheduling(exceptionHandler = "myExceptionHandler")
public class MySchedulingConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
return scheduler;
}
public void myExceptionHandler(Throwable error) {
// 錯(cuò)誤處理邏輯,例如記錄日志或發(fā)送通知
}
}
在上述示例中,我們創(chuàng)建了一個(gè)名為?MySchedulingConfig
?的配置類,并在其中配置了一個(gè)?TaskScheduler
?bean。通過(guò)在?@EnableScheduling
?注解上指定?exceptionHandler
?屬性,將錯(cuò)誤處理邏輯與定時(shí)任務(wù)調(diào)度器關(guān)聯(lián)起來(lái)。
配置多個(gè)定時(shí)任務(wù):
如果您需要配置多個(gè)定時(shí)任務(wù),可以在同一個(gè)類中定義多個(gè)定時(shí)任務(wù)方法,或者創(chuàng)建多個(gè)帶有定時(shí)任務(wù)注解的 Spring Bean。
@Component
public class MyTasks {
@Scheduled(fixedDelay = 5000)
public void task1() {
// 執(zhí)行任務(wù)1的邏輯
}
@Scheduled(cron = "0 0 12 * * ?")
public void task2() {
// 執(zhí)行任務(wù)2的邏輯
}
}
并發(fā)執(zhí)行多個(gè)定時(shí)任務(wù):
默認(rèn)情況下,Spring Schedule 使用單個(gè)線程執(zhí)行所有的定時(shí)任務(wù)。如果您需要并發(fā)執(zhí)行多個(gè)定時(shí)任務(wù),可以配置一個(gè)具有適當(dāng)線程池大小的任務(wù)調(diào)度器。
@Configuration
@EnableScheduling
public class MySchedulingConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10); // 設(shè)置線程池大小為10
return scheduler;
}
}
控制定時(shí)任務(wù)的執(zhí)行順序:
Spring Schedule 默認(rèn)情況下不提供顯式的控制定時(shí)任務(wù)執(zhí)行順序的方式。定時(shí)任務(wù)的執(zhí)行順序取決于任務(wù)調(diào)度器的實(shí)現(xiàn)和底層線程池的行為。
如果您需要在定時(shí)任務(wù)之間確保特定的執(zhí)行順序,可以考慮使用互斥或其他同步機(jī)制來(lái)實(shí)現(xiàn)。例如,您可以使用?synchronized
?關(guān)鍵字或?Lock
?接口來(lái)控制任務(wù)的互斥執(zhí)行。
@Component
public class MyTasks {
private final Object lock1 = new Object();
private final Object lock2 = new Object();
@Scheduled(fixedDelay = 5000)
public void task1() {
synchronized (lock1) {
// 執(zhí)行任務(wù)1的邏輯
}
}
@Scheduled(fixedDelay = 5000)
public void task2() {
synchronized (lock2) {
// 執(zhí)行任務(wù)2的邏輯
}
}
}
實(shí)戰(zhàn)案例:定時(shí)發(fā)送郵箱
首先引入依賴
dependency>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-starter-mailartifactId>
dependency>
去QQ郵箱
開(kāi)啟這個(gè)服務(wù)
自己收一下驗(yàn)證碼 確認(rèn) 就OK了
配置你的的基本配置
編寫(xiě)郵箱發(fā)送方法
@Component
@ConfigurationProperties(prefix = "email.config")
public class EmailUtil {
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* 驗(yàn)證碼長(zhǎng)度
*/
private int codeLen=6;
/**
* 發(fā)送郵箱驗(yàn)證碼的qq號(hào)
*/
private String qq;
/**
* 發(fā)送郵件的郵箱
*/
private String toSendEmail;
/**
* 發(fā)件人
*/
private String sender;
/**
* 開(kāi)啟IMAP/SMTP服務(wù)獲取的授權(quán)碼
*/
private String authPwd;
/**
* 郵件的主題
*/
private String title;
/**
* 郵件的內(nèi)容
*/
private String content;
@Scheduled(cron = "0 34 21 * * ?")
public void SendEmail(String email){
String authCode=RandomUtil.randomNumbers(6);
stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY+email,authCode,10, TimeUnit.MINUTES); //將驗(yàn)證碼存入緩存,10分鐘失效
try {
sendAuthCodeEmail(email,authCode);
} catch (Exception e) {
e.printStackTrace();
return Result.fail("發(fā)送失敗");
}
return Result.ok();
}
/**
* 發(fā)送郵箱驗(yàn)證碼
* @param email
* @param authCode
*/
public String sendAuthCodeEmail(String email, String authCode) {
try {
SimpleEmail mail = new SimpleEmail();
mail.setHostName("smtp.qq.com");//發(fā)送郵件的服務(wù)器
mail.setAuthentication(qq, authPwd);//第一個(gè)參數(shù)是發(fā)送郵箱驗(yàn)證碼的qq號(hào),第二個(gè)參數(shù)是開(kāi)啟IMAP/SMTP服務(wù)獲取的授權(quán)碼
mail.setFrom(toSendEmail, sender); //第一個(gè)參數(shù)是發(fā)送郵件的郵箱,第二個(gè)參數(shù)是發(fā)件人
mail.setSSLOnConnect(true); //使用安全鏈接
mail.addTo(email);//接收的郵箱
mail.setSubject(title);//設(shè)置郵件的主題
mail.setMsg(content + authCode);//設(shè)置郵件的內(nèi)容
mail.send();//發(fā)送
} catch (EmailException e) {
e.printStackTrace();
}
return ;
}
最終效果?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-839913.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-839913.html
到了這里,關(guān)于Spring Schedule:Spring boot整合Spring Schedule實(shí)戰(zhàn)講解定時(shí)發(fā)送郵件的功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!