目錄
- 簡介
- 異步任務
- 郵件任務
- 定時任務
場景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、檢視官方配置類

3、調用的方法
4、配置郵箱部分,開啟協定并且生成授權碼
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("在一個特定的時間裡執行這個方法");
}
}