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
spring.mail.username=1437101473@qq.com
#這裡就是授權碼
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("1437101473@qq.com"); // 傳送給
message.setFrom("1437101473@qq.com"); // 傳送來自
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("1437101473@qq.com"); // 傳送給
helper.setFrom("1437101473@qq.com"); // 傳送來自
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表示式。
當然,可以直接使用生成器:https://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