SpringBoot-11 擴展功能
- 2021 年 4 月 5 日
- 筆記
- springboot
SpringBoot-11 擴展功能
非同步
同步就是一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。要麼成功都成功,失敗都失敗,兩個任務的狀態可以保持一致。
非同步是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了。至於被依賴的任務最終是否真正完成,依賴它的任務無法確定,所以它是不可靠的任務序列。
但是在某些時刻,執行緒進行休眠,如果不進行非同步編程,你就要等待休眠時間過去,程式才可以進行。
Service層
@Service
public class AsynService {
// 要告訴Spring這是一個非同步方法
@Async
public void hello() {
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.printf("數據正在處理。。。。");
}
}
controller層
@RestController
public class AsynController {
@Autowired
AsynService asynService;
@RequestMapping("/hello")
public String hello(){
asynService.hello(); //停止3s
return "OK";
}
}
啟動器
@SpringBootApplication
@EnableAsync // 開啟非同步功能
public class SpringBoot10AsynApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot10AsynApplication.class, args);
}
}
這個時候,不會等待休眠結束才輸出語句。
郵箱
導入依賴
<!-- 郵件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
Test類測試程式碼
1.開啟自己郵件smtp
打開自己的郵箱,設置中開啟:
開啟之後,經過驗證,會出現授權碼;授權碼填入後面的密碼處:
2.配置文件
#qq郵箱就.qq ; 163郵箱就.163
spring.mail.host=smtp.qq.com
[email protected]
#這裡就是授權碼
spring.mail.password=owahyrpgzrtfbaca
spring.mail.default-encoding=utf-8
# 開啟加密驗證
spring.mail.properties.mail.smtp.ssl.enable=true
3.注入郵件類
@Autowired
JavaMailSenderImpl mailSender;
問題:
JavaMailSenderImpl 注入報錯。
解決方法:
一、
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<scope>test</scope>
</dependency>
該依賴中存在
二、
配置文件中沒加入 host
spring.mail.host=xxxx
4.簡單郵件發送
@Test
void contextLoads() {
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("這是一個Test"); // 標題
message.setText("這裡是正文"); // 正文
message.setTo("[email protected]"); // 發送給
message.setFrom("[email protected]"); // 發送來自
mailSender.send(message);
}
5.複雜郵件發送
@Test
void contextLoads1() throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
//組裝
helper.setSubject("這是一個複雜郵件Test");
helper.setText("<h1>這裡是正文</h1>", true); // 正文
//附件
helper.addAttachment("1.jpg", new File("D:\\桌面\\1.jpg"));
helper.setTo("[email protected]"); // 發送給
helper.setFrom("[email protected]"); // 發送來自
mailSender.send(message);
}
定時
可以讓一個操作進行定時開始,或者循環執行。
1.啟動器開啟定時功能
@SpringBootApplication
@EnableScheduling //開啟定時功能
public class SpringBoot10AsynApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot10AsynApplication.class, args);
}
}
2.編寫功能類
@Service
public class ScheduledService {
// cron表達式
// 秒 分 時 日 月 周幾
@Scheduled(cron = "0/2 * * * * ?")
public void hello() {
System.out.println("hello---");
}
}
3.擴展
該功能使用的是cron表達式。
當然,可以直接使用生成器://cron.qqe2.com/
cron表達式格式:
{秒數} {分鐘} {小時} {日期} {月份} {星期} {年份(可為空)}
例 : “0 0 12 ? * WED” ——-> 在每星期三下午12:00 執行(年份通常 省略)
位置 | 時間域名 | 允許值 | 允許的特殊字元 |
---|---|---|---|
1 | 秒 | 0-59 | , – * / |
2 | 分鐘 | 0-59 | , – * / |
3 | 小時 | 0-23 | , – * / |
4 | 日期 | 1-31 | , – * / ? L W C |
5 | 月份 | 1-12 | , – * / |
6 | 星期 | 1-7 | , – * / ? L C # |
7 | 年(可選) | 空值 1970-2099 | , – * / |
Cron表達式的時間欄位除允許設置數值之外,還可以使用一些特殊的字元,提供列表、範圍、通配符等功能:如下:
星號():可用在所有的欄位中,表示對應時間域的每一個時刻。如:在分鐘欄位時,表示「每分鐘」。
問號(?):該字元只在日期和星期欄位中使用,它通常指定為「無意義的值」,想當於佔位符。
減號(-):表達一個範圍。如在小時字斷中使用「10-12」,則表示從10點到12點,即10,11,12.
逗號(,):表示一個列值表。如在星期欄位中使用「MON,WED,FRI」,則表示星期一、星期三和星期五。
斜杠(/):x/y表達一個等步長序列,x為起始值,y為增量步長值。如:在分鐘欄位中使用0/15,則表示0,15,30,和45秒;5/15在分鐘欄位中表示5,20,35和50分鐘。用戶也可以使用*/y,它等同於0/y。
L:該欄位只在日期和星期欄位中使用,代表「Last」的意思,但它在兩個欄位中的意思不同。如果L用在日期欄位中,則表示這個月份的最後一天;如果L用在星期欄位中,則表示星期六,等同於7(這裡的規則是星期六為一星期的最後一天)。如果L出現在星期欄位中,而且前面還有一個數字N,則表示「這個月的最後一個星期N」。例如,6L表示該月的最後一個星期五。
W:該字元只能出現在日期欄位里,是對前導日期的修飾,表示離該日期最近的工作日。如:15W表示離該月15日最近的工作日,如果15日是星期六,則匹配14日星期五;如果15日是星期日,則匹配16日星期一;如果15日是星期二,那結果就是15日星期二。但必須注意到關聯的匹配日期不能跨月,如用戶指定1W,如果1日是星期六,結果匹配的是3日星期一,而非上個月最後一天。W字元只能指定單一日期,而不能指定日期範圍。
LW組合:在日期欄位中可以組合使用LW,它的意思是當月的最後一個工作日。
號:該字元只能在星期欄位中使用,表示當月的某個工作日。如6#3表示當月的第三個星期五(6表示星期五,#3表示當前的第三個),而4#5表示當月的第五個星期三。假設當月沒有第五個星期三,則忽略不觸發。
C:該字元只在日期和星期欄位中使用,代表「Calendar」的意思。它的意思是計劃所關聯的日期,如果日期沒有被關聯,則相當於日曆中的所有日期。例如,5C在日期欄位中相當於5日以後的那一天,1C在星期欄位中相當於星期日後的第一天。
常用的Cron表達式
「0 0 12 * * ?」 每天12:00運行
「0 15 10 ?* *」 每天10:15運行
「0 15 10 * * ?」 每天10:15運行
「0 15 10 * * ? 」 每天10:15運行
「0 15 10 * * ? 2008」 在2008年的每天10:15運行
「0 * 14 * * ?」 每天14點到15點每分鐘運行一次,開始於14:00,結束於14:59
「0 0/5 14 * * ?」 每天14點到15點每5分鐘運行一次,開始於14:00,結束於14:55
「0 0/5 14,18 * * ?」 每天14點到15點每5分鐘運行一次,此外每天18點到19點每5分鐘也運行一次
「0 0-5 14 * * ?」 每天14:00到14:05,每分鐘運行一次
「0 10,44 14 ? 3 WED」 三月每周三的14:10和14:44,運行一次
「0 15 10 ? MON-FRI」 每周一、二、三、四、五的10:15運行
「0 15 10 15 * ?」 每月的15日的10:15運行
「0 15 10 L * ?」 每月最後一天的10:15運行
「0 15 10 ? * 6L」 每月最後一個星期五的10:15運行
「0 15 10 ? * 6L 2014-2016」 2014年、2015年、2016年每月最後一個星期五的10:15運行
「0 15 10 ? * 6#3」 每月第三個星期五的10:15運行
個人部落格為:
MoYu’s HomePage
MoYu’s Gitee Blog