SpringBoot-11 擴展功能

SpringBoot-11 擴展功能

異步

同步就是一個任務的完成須要依賴另一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。要麼成功都成功,失敗都失敗,兩個任務的狀態能夠保持一致。java

異步是不須要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工做,依賴的任務也當即執行,只要本身完成了整個任務就算完成了。至於被依賴的任務最終是否真正完成,依賴它的任務沒法肯定,因此它是不可靠的任務序列。git

可是在某些時刻,線程進行休眠,若是不進行異步編程,你就要等待休眠時間過去,程序才能夠進行。spring

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

打開本身的郵箱,設置中開啓:springboot

1

開啓以後,通過驗證,會出現受權碼;受權碼填入後面的密碼處:app

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 注入報錯。異步編程

解決方法:spring-boot

1、測試

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <scope>test</scope>
</dependency>

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

2、

配置文件中沒加入 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」,則表示星期1、星期三和星期五。
斜槓(/):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」 每週1、2、3、4、五的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

相關文章
相關標籤/搜索