SpringBoot(十) 非同步任務,定時任務和郵件任務
阿新 • • 發佈:2019-02-01
非同步任務
“非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回結果就執行後面的程式。
@Service public class AsyncService { public void testTask(){ try{ Thread.sleep(3000); }catch (Exception e){ } System.out.println("哈哈哈哈"); } }
上述的同步呼叫雖然順利的執行完了,可以併發執行的話,同步呼叫在執行效率方面就比較差,可以考慮通過非同步呼叫的方式來併發執行。
在Spring Boot中,我們只需要通過使用@Async
註解就能簡單的將原來的同步函式變為非同步函式,主類改在為如下模式:
@EnableAsync //開啟非同步註解 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
service修改如下,加上@Async註解,就能有效的減少了程式的總執行時間。
@Service public class AsyncService { @Async //註解 public void testTask(){ try{ Thread.sleep(3000); }catch (Exception e){ } System.out.println("哈哈哈哈"); } }
注: @Async所修飾的函式不要定義為static型別,這樣非同步呼叫不會生效。
定時任務
在編寫Spring Boot應用中經常會遇到這樣的場景,比如:我需要定時地傳送一些簡訊、郵件之類的操作,也可能會定時地檢查和監控一些標誌、引數等。
1.編寫主程式
@EnableAsync //開啟非同步註解 @EnableScheduling //開啟定時註解 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
2.編寫測試類
@Service public class ScheduledService { /** * 指定定時任務的表示式 * second(秒),minute(分),hour(日),day of month(日),month(月),day of week(周幾)。空格隔開 */ //每5秒走一次 @Scheduled(cron = "*/5 * * * * *") public void hello(){ System.out.println("hello"); } }
@Scheduled(fixedRate = 5000)
:上一次開始執行時間點之後5秒再執行@Scheduled(fixedDelay = 5000)
:上一次執行完畢時間點之後5秒再執行@Scheduled(initialDelay=1000, fixedRate=5000)
:第一次延遲1秒後執行@Scheduled(cron="0/5 * * * * *")
:通過cron表示式定義規則。0秒啟動,每5秒啟動一次
郵件任務
相信使用過Spring的眾多開發者都知道Spring提供了非常好用的JavaMailSender
介面實現郵件傳送。
在Spring Boot的Starter模組中也為此提供了自動化配置。
1.在pom.xml中引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
如其他自動化配置模組一樣,在完成了依賴引入之後,只需要在application.properties
中配置相應的屬性內容。
2.以QQ郵箱為例,在application.properties
中加入如下配置(注意替換自己的使用者名稱和密碼):
spring.mail.host=smtp.qq.com
spring.mail.username=使用者名稱
spring.mail.password=密碼
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
3.編寫測試類
@Service public class ScheduledService { @Autowired JavaMailSenderImpl javaMailSender; public void sendMail(){ SimpleMailMessage message = new SimpleMailMessage(); //郵件設定 標題 message.setSubject("你猜"); //內容 message.setText("你猜我是誰"); //收件人 message.setTo(""); //發件人 message.setFrom(""); javaMailSender.send(message); } }
到這裡,一個簡單的郵件傳送就完成了.
MimeMessage
上面是通過使用SimpleMailMessage
實現了簡單的郵件傳送,但是實際使用過程中,我們還可能會帶上附件、或是使用郵件模組等。這個時候我們就需要使用MimeMessage
來設定複雜一些的郵件內容。
public void sendMail02() throws MessagingException { //建立一個複雜郵件 MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); //郵件設定 標題 helper.setSubject("你猜"); //內容 可以相容html片段 helper.setText("<b>你猜我是誰</b>"); //引數2: 解析HTML helper.setText("<html><body><img src=\"cid:weixin\" ></body></html>", true); //上傳附件 引數1:名稱 引數2:檔案 helper.addAttachment("1.jpg",new File("")); //收件人 helper.setTo(""); //發件人 helper.setFrom(""); javaMailSender.send(mimeMessage); }