1. 程式人生 > 其它 >SpringBoot 非同步、定時任務和郵件傳送

SpringBoot 非同步、定時任務和郵件傳送

任務

非同步任務

定時任務

郵件傳送


SpringBoot 非同步任務

我們有這樣一個情況:

// API 程式碼
@RequestMapping("/hello")
public String sayHello() {
    myService.printHello();
    return "OK";
}

// 業務程式碼
public void printHello() {
    try {
        Thread.sleep(3 * 1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("處理完成");
}

正常執行的話瀏覽器必須要在業務程式碼處理完之後才能載入到OK,非常不合理!


當然,我們可以使用多執行緒來解決這個問題——讓業務程式碼起新的執行緒執行,不過這樣原生的方法似乎有些麻煩,Spring 早就為我們準備好了非同步任務的實現,只需要在方法上使用 @Async註解並且在啟動類上啟用 Async 就可以將方法設定成非同步執行:

@EnableAsync
@SpringBootApplication
public class MissionApplication {

	public static void main(String[] args) {
		SpringApplication.run(MissionApplication.class, args);
	}

}

@Async
public void printHello() {
    try {
        Thread.sleep(3 * 1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("處理完成");
}

這樣一來瀏覽器就不需要等到伺服器端業務程式碼執行完畢才能收到結果。


SpringBoot 郵件任務

在 Spring 中使用郵件簡直不要太簡單。首先匯入依賴:

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

進行一些簡單的配置,注意這裡的 password 是使用 SMTP/POP3 的密碼,不是郵箱密碼:

spring:
  mail:
    username: [email protected]
    password: xxxxx
    host: smtp.qq.com
    # 開啟加密驗證,qq 郵箱需要
    properties:
      mail:
        smtp:
          ssl:
            enable: true

然後在需要傳送郵件的地方注入JavaMailSenderImpl類,使用方法如下:

void contextLoads1() {
    // 一個簡單的郵件
    SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
    simpleMailMessage.setSubject("通知");
    simpleMailMessage.setText("你好世界");
    simpleMailMessage.setTo();
    simpleMailMessage.setFrom("[email protected]");
    simpleMailMessage.setTo("[email protected]");
    mailSender.send(simpleMailMessage);
}

void contextLoads2() {
		// MIME 郵件
		try {
			MimeMessage mimeMessage = mailSender.createMimeMessage();
			MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
			mimeMessageHelper.setSubject("退學通知");
			mimeMessageHelper.setText("<h1>通知</h1><p style='color:red'>xxx:\n\txxx,xxx,xxx!</p><img src='xxx'>", true);
			mimeMessageHelper.addAttachment("icon", new File("xxxx"));
			mimeMessageHelper.setFrom("[email protected]");
			mimeMessageHelper.setTo("[email protected]");
			mailSender.send(mimeMessage);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

SpringBoot 定時任務

第一步先在主啟動類上開啟定時:

@EnableScheduling

然後在要被定時執行的方法上啟用定時註解並且制定 cron 表示式:

@Scheduled(cron = "3/10 * * * * ?")

有關 cron 表示式的內容不做贅述,網上資料、轉換器成堆,在這裡列一些常用的:

(1)0 0 2 1 * ? 表示在每月的1日的凌晨2點調整任務

(2)0 15 10 ? * MON-FRI 表示週一到週五每天上午10:15執行作業

(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每個月的最後一個星期五上午10:15執行作

(4)0 0 10,14,16 * * ? 每天上午10點,下午2點,4點

(5)0 0/30 9-17 * * ? 朝九晚五工作時間內每半小時

(6)0 0 12 ? * WED 表示每個星期三中午12點

(7)0 0 12 * * ? 每天中午12點觸發

(8)0 15 10 ? * * 每天上午10:15觸發

(9)0 15 10 * * ? 每天上午10:15觸發

(10)0 15 10 * * ? 每天上午10:15觸發

(11)0 15 10 * * ? 2005 2005年的每天上午10:15觸發

(12)0 * 14 * * ? 在每天下午2點到下午2:59期間的每1分鐘觸發

(13)0 0/5 14 * * ? 在每天下午2點到下午2:55期間的每5分鐘觸發

(14)0 0/5 14,18 * * ? 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發

(15)0 0-5 14 * * ? 在每天下午2點到下午2:05期間的每1分鐘觸發

(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44觸發

(17)0 15 10 ? * MON-FRI 週一至週五的上午10:15觸發

(18)0 15 10 15 * ? 每月15日上午10:15觸發

(19)0 15 10 L * ? 每月最後一日的上午10:15觸發

(20)0 15 10 ? * 6L 每月的最後一個星期五上午10:15觸發

(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最後一個星期五上午10:15觸發

(22)0 15 10 ? * 6#3 每月的第三個星期五上午10:15觸發