SpringBoot-11 擴充套件功能

zc發表於2021-04-05

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

開啟自己的郵箱,設定中開啟:

1

開啟之後,經過驗證,會出現授權碼;授權碼填入後面的密碼處:

2

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>

該依賴中存在 test,刪除即可。

二、

配置檔案中沒加入 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);
}
3

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

定時

可以讓一個操作進行定時開始,或者迴圈執行

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

相關文章