javascript
SpringBoot整合异步任务实现发送邮件
異步任務在很多地方都用的特別多,例如注冊發送郵件,發送短信等等。本文是講解一個簡單的SpringBoot異步任務的實現,技術總是慢慢進步的啦。
(狗頭保命)👩?💻
很喜歡一句話:”八小時內謀生活,八小時外謀發展“
我們:"待別日相見時,都已有所成”😁
校園一角
SpringBoot異步任務Async及郵件服務搭配起來更棒哦!!!
- 一、前言
- 1)概述:
- 2)使用場景:
- 二、代碼實現
- 1、步驟:
- 2、導入依賴:
- 3、yml配置文件
- 4、config層
- 5、實體類
- 6、service層
- 7、controller
- 8、測試
- 三、自言自語
一、前言
1)概述:
“異步”(Asynchronous)與“同步”(Synchronous)相對,異步不用阻塞當前線程來等待處理完成,而是允許后續操作,直至其它線程將處理完成,并回調通知此線程。也就是說,異步永遠是非阻塞的(non-blocking)。
異步操作的程序,在代碼執行時,不等待異步調用的語句返回結果就執行后面的程序。當任務間沒有先后順序依賴邏輯的時候,可以使用異步。
同步就是串行。在這里舉個注冊發送郵件的例子:
同步:
異步:
-
主線程:發送注冊請求–>注冊成功–>調用發送郵件方法—>返回信息給前臺
-
線程二:--------------------------------------執行發送郵件方法--------------------------
2)使用場景:
使用到異步任務的地方非常多。
就例如:
二、代碼實現
案例:注冊發送郵件
1、步驟:
2、導入依賴:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> </dependencies>3、yml配置文件
server:port: 8087 spring:application:name: springboot-scheduledmail:# 配置 SMTP 服務器地址host: smtp.qq.com# 發送者郵箱username: 790933839@qq.com# 配置密碼,注意不是真正的密碼,而是剛剛申請到的授權碼password: vjstfghblprwbdbd# 端口號465或587port: 587# 默認的郵件編碼為UTF-8default-encoding: UTF-8# 配置SSL 加密工廠properties:mail:smtp:socketFactoryClass: javax.net.ssl.SSLSocketFactory#表示開啟 DEBUG 模式,這樣,郵件發送過程的日志會在控制臺打印出來,方便排查錯誤debug: true4、config層
ThreadPoolTaskExecutorConfig 線程池配置
@Configuration @EnableAsync // 開啟異步配置 public class ThreadPoolTaskExecutorConfig {@Beanpublic TaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//設置核心線程數executor.setCorePoolSize(10);//設置最大線程數executor.setMaxPoolSize(20);//緩沖隊列200:用來緩沖執行任務的隊列executor.setQueueCapacity(200);//線程活路時間 60 秒executor.setKeepAliveSeconds(60);//線程池名的前綴:設置好了之后可以方便我們定位處理任務所在的線程池executor.setThreadNamePrefix("taskExecutor-");//設置拒絕策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.setWaitForTasksToCompleteOnShutdown(true);return executor;} }5、實體類
@Data @Accessors(chain = true) public class Account {private String username;private String password;private String email; }6、service層
public interface EmailService {/**用于注冊成功后發送郵件 @param account 賬號信息*/void senderEmail(Account account); }@Slf4j @Service public class EmailServiceImpl implements EmailService {@Autowiredprivate JavaMailSender javaMailSender;@Async("taskExecutor")@Overridepublic void senderEmail(Account account) {log.info(Thread.currentThread().getName());//一個復雜的郵件MimeMessage message = this.javaMailSender.createMimeMessage();try {//組裝MimeMessageHelper helper = new MimeMessageHelper(message, true);//正文//主題helper.setSubject("小可愛,歡迎你的到來哦!!!");//開啟html模式helper.setText("<h1>小可愛,我想你一定會喜歡這里吧!!!</h1>" +"<p>你的賬號為:"+account.getUsername()+"</p>" +"<p>你的密碼為:"+account.getPassword()+"</p>", true);//附件helper.addAttachment("1.jpg", new File("C:\\Users\\ASUS\\Desktop\\雜七雜八\\雜圖\\2.gif"));helper.setTo(account.getEmail());helper.setFrom("790933839@qq.com");javaMailSender.send(message);} catch (MessagingException e) {e.printStackTrace();}} }7、controller
@Slf4j @RestController @RequestMapping("/async") public class AsyncController {private static List<Account> accountList=new ArrayList<Account>();@Autowiredprivate TaskExecutor taskExecutor;@Autowiredprivate EmailService emailService;/**寫一個注冊發送郵件的栗子 */@PostMapping("/register")public String register(@RequestBody Account account){accountList.add(account);emailService.senderEmail(account);log.info(Thread.currentThread().getName());return "OK";} }8、測試
我們可以看到在執行發送郵件方法時,并非是主線程在執行,而是從線程池中拉了一個線程來執行,做到了異步操作。
三、自言自語
一個小小的Demo,不足之處,請見諒!
你好,我是博主寧在春😁
如果你看到這篇文章,并且覺得對你有益的話,就給個贊吧,讓我感受一下分享的喜悅吧,蟹蟹。🤗
如若有寫的有誤的地方,也請大家不嗇賜教!!
同樣如若有存在疑惑的地方,請留言或私信,定會在第一時間回復你。
持續更新中
總結
以上是生活随笔為你收集整理的SpringBoot整合异步任务实现发送邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot整合Swagger
- 下一篇: SpringBoot日志收集-Aop方式