springboot(2.1.5)與任務方法的相關內容(異步任務,簡單定時任務,郵箱任務)

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);
    }
}

本項目github代碼地址

springboot idea 熱部署小技巧
如果配置了devtool依賴,那麼在開啓項目之後,修改源代碼再ctrl+F9就可自動編譯熱部署了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章