1. 程式人生 > >SpringBoot(十) 非同步任務,定時任務和郵件任務

SpringBoot(十) 非同步任務,定時任務和郵件任務

非同步任務

“非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回結果就執行後面的程式。

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