天天看點

SpringBoot異步任務

目錄

  • 簡介
  • 異步任務
  • 郵件任務
  • 定時任務

場景1 當使用者在前台頁面使用郵件發送功能,這個請求會交于後端處理,如果采用同步任務,在這段時間内,前台的頁面都是等待狀态的,使用者還會以為卡死,耗費時間和資源。

場景2使用者上傳Excel表格,後端需要先解析并且插入到資料庫中,這個任務量是巨大的,是以這些均需要做異步處理。

......

以上這些場景使用多線程也是能解決的,這裡簡單記錄一下,springBoot的異步使用方式。

在SpringBoot中開啟異步任務很簡單,兩個注解搞定

@EnableAsync

Async

。這裡簡單寫個案例

1、需要執行的異步方法
@Async  //方法加上這個注解,SpringBoot會開啟一個新的線程來處理,也就不會有白屏等待時間
    public void insertExcel() {
        // 假如這個方法中執行一段耗時的邏輯代碼 比如excel表格的讀取與插入
        // 這裡使用線程休眠來模拟,執行到這裡,前台會白屏5秒
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("資料正在進行中...");
    }
           
2、啟動類開啟異步注解功能
@EnableAsync  //開啟異步注解
@SpringBootApplication
@MapperScan("com.qd.springboot.mapper")
public class SpringbootApplication {

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

執行此方法後,控制台會直接列印内容,而無需等待時間,就是這麼的香~

發送郵件任務也是開發中經常使用的,在SpringBoot中也比較簡單

1、導入依賴
<!--jakarta.mail -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-mail</artifactId>
   <version>2.5.2</version>
</dependency>
           
2、檢視官方配置類
SpringBoot異步任務
3、調用的方法
SpringBoot異步任務
4、配置郵箱部分,開啟協定并且生成授權碼
SpringBoot異步任務
5、配置yml
spring:
  mail:
    username: [email protected]  # 郵箱号
    password:   					# 授權碼
    host: smtp.qq.com     # 發送的伺服器
    properties: {mail.smtp.ssl.enable:true}   # 開啟安全驗證 部分郵箱沒有
           
6、簡單郵箱實作
@SpringBootTest
public class Test1 {
    @Autowired
    private JavaMailSenderImpl mailSender;

  
     /**
     * 簡單郵件
     */
    @Test
    public void sendMail01() {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setSubject("java郵件測試"); //主題
        message.setText("試搞一個ava的郵件發送測試,你能猜出我是誰嗎???"); //内容
        message.setTo("[email protected]"); //接收人,是一個可變參數
        message.setFrom("[email protected]"); // 發送者,必須與配置檔案中一緻
        message.setTo();
        mailSender.send(message);
    }
  
      /**
     * 複雜郵件
     */
    @Test
    public void sendMail02() throws MessagingException {
        // 可以直接傳入檔案
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
        helper.setSubject("java郵件測試");
        String content = "内容";
        helper.setText("<div style='width: 100%;min-height: 250px;background-color: rgb(227,242,253);'> <h2 style='text-align: center;color: rgb(187, 70, 70);'>xxx服務郵件通知</h2><div style='width: 100%;min-height: 150px;margin: 20px 0px;background-color: white;'><h3>尊敬的使用者:</h3> <p style='padding: 0px 20px;'>" + content + "</p><p style='padding: 0px 20px;'>此緻(本郵件由程式自動發送,您無需回複)</p></div><footer style='text-align: center;color: rgb(92, 96, 99);'><a href=\"#\">xxxx公司</a></footer></div>\n", true);
//        helper.addAttachment("附件名",new File("附件位址"));
        helper.setTo("[email protected]");
        helper.setFrom("[email protected]");
        mailSender.send(message);
    }
}
           

ps:為了友善開發可以抽取成為工具類

在日常項目運作中,我們總會有需求在某一時間段周期性的執行某個動作。比如每天在某個時間段導出報表,或者每隔多久統計一次現在線上的使用者量等。

在Spring Boot 中有Java自帶的java.util.Timer類,也有強大的排程器Quartz,還有SpringBoot 自帶的Scheduled 來實作。Scheduled在Spring5.引入,預設SpringBoot 自帶該功能,使用起來也很簡單,在啟動類級别添加@EnableScheduling注解即可引入定時任務環境,但遺憾的是Scheduled 預設不支援分布式環境,這裡簡單測試下。

1、開啟注解支援
@EnableScheduling // 開啟注解支援
@SpringBootApplication
@MapperScan("com.qd.springboot.mapper")
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
}
           
2、cron表達式
// cron表達式
// cron = "0 * * * * 0-7"
// 秒 分 時 日 月 周幾
           
@Service
public class ScheduledService {
  
    /**
     * 定時執行任務
     * 每天的0點30分會自動執行
     */
    @Scheduled(cron = "30 0 0 * * * *")
    public void hello(){
        System.out.println("在一個特定的時間裡執行這個方法");
    }
}