同步就是一個任務的完成須要依賴另一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。要麼成功都成功,失敗都失敗,兩個任務的狀態能夠保持一致。java
異步是不須要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工做,依賴的任務也當即執行,只要本身完成了整個任務就算完成了。至於被依賴的任務最終是否真正完成,依賴它的任務沒法肯定,因此它是不可靠的任務序列。git
可是在某些時刻,線程進行休眠,若是不進行異步編程,你就要等待休眠時間過去,程序才能夠進行。spring
@Service public class AsynService { // 要告訴Spring這是一個異步方法 @Async public void hello() { try { Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); } System.out.printf("數據正在處理。。。。"); } }
@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>
打開本身的郵箱,設置中開啓:springboot
開啓以後,通過驗證,會出現受權碼;受權碼填入後面的密碼處:app
#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
@Autowired JavaMailSenderImpl mailSender;
問題:異步
JavaMailSenderImpl 注入報錯。異步編程
解決方法:spring-boot
1、測試
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <scope>test</scope> </dependency>
該依賴中存在
2、
配置文件中沒加入 host
spring.mail.host=xxxx
@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); }
@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); }
可讓一個操做進行定時開始,或者循環執行。
@SpringBootApplication @EnableScheduling //開啓定時功能 public class SpringBoot10AsynApplication { public static void main(String[] args) { SpringApplication.run(SpringBoot10AsynApplication.class, args); } }
@Service public class ScheduledService { // cron表達式 // 秒 分 時 日 月 周幾 @Scheduled(cron = "0/2 * * * * ?") public void hello() { System.out.println("hello---"); } }
該功能使用的是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,它的意思是當月的最後一個工做日。
C:該字符只在日期和星期字段中使用,表明「Calendar」的意思。它的意思是計劃所關聯的日期,若是日期沒有被關聯,則至關於日曆中的全部日期。例如,5C在日期字段中至關於5日之後的那一天,1C在星期字段中至關於星期往後的第一天。
「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