1、 異步任務
單個用戶進行請求的時候對任務進行異步處理
對於初學者來說,多個用戶對一個controller進行請求會堵塞嗎?
這個需要理解web中的 顧慮器,攔截器以及轉發器的應用才能解答,這裏按揭不表
1. 需要開啓@EnableAsync
2. 在同步方法上添加註解 @Async
見項目 aysnc
可以不用等待就能返回結果
2、 簡單定時任務(後續增加quartz任務)
定時任務,使用@Scheduled 任務
1. @EnableScheduling 開啓定時任務
2. 在方法上使用 @Scheduled
3. 學習表達式
-
0 * * * * MON-FRI # 星期一到星期五 每次的0秒執行一次
-
0,1,2,3,4 * * * * MON-FRI # 星期一到星期五 每次的0,1,2,3,4秒都執行一次
等效於 **0-4 * * * * MON-FRI**
@Scheduled(cron = "0,1,2,3,4 * * * * MON-FRI")
public void hello() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "hello。。。。");
}
}
=========》 只執行了兩次,一次是0秒的時候等待3秒之後執行的一次,第二次爲第3 秒的時候執行一次
=========》 並不會在0 1 2 3 4 秒均執行一次
2019-06-17 15:46:03hello。。。。
2019-06-17 15:46:07hello。。。。
========= 如何解決上面的問題? ==============
使用異步任務解決
@Async
@Scheduled(cron = "0,1,2,3,4 * * * * MON-FRI")
public void hello() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "hello。。。。");
}
}
=========》 並會在0 1 2 3 4 秒均執行一次
2019-06-17 15:49:03hello。。。。
2019-06-17 15:49:04hello。。。。
2019-06-17 15:49:05hello。。。。
2019-06-17 15:49:06hello。。。。
2019-06-17 15:49:07hello。。。。
-
/ 間隔步長
0/4 * * * * MON-FRI 在星期一☞星期五 每隔4秒執行一次 -
? 當日 (第四個參數)、 星期(第六個參數) 衝突的時候使用?來避免衝突,類似於*
* * * ? * MON 在第四個參數中不能用 * ,因爲不是每天都是星期一 ,所以使得日失效 * * * 1 * ? 在表明每月1號執行任務的時候,第六個參數也要使用?
-
SUN-SAT 週日到週六 在 springboot的內置定時任務中 0與7代表星期日, 1,2,3,4 分別代表相應的星期
與 Quartz[1-7 中 1代表週日] 不一樣,需要區別待遇,也就是說springboot內置的更人性化國際化
練習題
- 【 0 0/5 14,18 * * ?】 每天的 14 與 18 點 ,每隔5分鐘執行一次
- 【 0 15 10 ? * 1-6】 每個月的週一至週六的10點 15分執行一次
- 【 0 0 2 ? * 6L】每個月的最後一個星期六2點執行一次
- 【 0 0 2 LW * ?】每個月的最後一個工作日2點執行一次
- 【 0 0 2-4 ? * 1#1】每個月的第一個週一 2點到4點的整點執行一次 (4#2 代表第二個星期四)
3、 郵件任務
a) 引入依賴
官網地址
spring 郵箱官網
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
b) 配置郵箱的賬戶和密碼
自動配置屬性 application.properties
[email protected]
# 密碼需要自己在第三方登錄QQ郵箱,可能存在郵件泄露風險,甚至危害Apple ID安全,建議使用QQ郵箱手機版登錄。
# 繼續獲取授權碼登錄第三方客戶端郵箱 。 生成授權碼
spring.mail.password=xxxx
spring.mail.host=smtp.qq.com
spring.mail.properties.mail.smtp.ssl.enable=true
c) 測試發送郵箱
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootTestMail {
@Autowired
JavaMailSender javaMailSender;
@Test
public void contextLoads() {
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("通知"); // 標題
message.setText("今晚7:30開會"); // 內容
message.setTo("[email protected]"); // 接收方
message.setFrom("[email protected]"); // 來自於哪裏,必須要與發送方一致
javaMailSender.send(message);
}
}
springboot idea 熱部署小技巧
如果配置了devtool依賴,那麼在開啓項目之後,修改源代碼再ctrl+F9就可自動編譯熱部署了