本篇博文是「Java秒殺系統實戰系列文章」的第九篇,在這篇文章中咱們將繼續完善秒殺系統中的核心處理邏輯,即「用戶秒殺~搶單」的業務邏輯!本文咱們將基於JavaMail服務,開發一個通用的發送郵件服務,用於發送郵件通知消息,並與上一篇章中已經實現的RabbitMQ異步發送消息的邏輯進行整合,完全實現「用戶秒殺成功後,異步發送郵件通知消息給到用戶郵箱,告知用戶儘快進行付款」的功能!git
對於發送郵件服務,相信各位小夥伴並不陌生,本篇博文咱們將開發一個通用的發送郵件服務,用於「用戶秒殺成功以後異步發送郵件消息給到用戶」。spring
(1)一樣的道理,首先咱們須要加入發送郵件服務的依賴,其依賴的版本號跟SpringBoot的版本號一直,爲1.5.7.RELEASE,以下所示:數據庫
<!--mail--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>${spring-boot.version}</version> </dependency>
緊接着,咱們須要在application.properties配置文件中加入「發送郵件服務」所須要的額外的支持配置信息:後端
#發送郵件配置 spring.mail.host=smtp.qq.com spring.mail.username=1974544863@qq.com spring.mail.password=cmtvsjvhonkjdaje spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true mail.send.from=1974544863@qq.com mail.kill.item.success.subject=商品搶購成功 mail.kill.item.success.content=您好,您已成功搶購到商品: <strong style="color: red">%s</strong> ,複製該連接並在瀏覽器採用新的頁面打開,便可查看搶購詳情:${system.domain.url}/kill/record/detail/%s,並請您在1個小時內完成訂單的支付,超時將失效該訂單哦!祝你生活愉快!
在本秒殺系統中,發送郵件的服務咱們是採用 QQ郵箱 做爲主郵箱帳號,相應的SMTP服務器也是採用QQ郵箱的!其中,spring.mail.password 指的是在QQ郵箱後臺開通POP3/SMTP服務 時騰訊官方給的「密鑰」(受權碼),在這裏,Debug就貢獻了上面那個密鑰~受權碼 給各位使用了,而真正在企業生產環境中,實際上是須要去申請一個主郵箱帳號的,至於如何申請,在這裏就不贅述了!瀏覽器
(2)接下來,咱們就能夠大顯伸手一番了!咱們在MailService中開發了兩種發送郵件的功能,一種發送簡單文本的功能(即純文字的、很死板、高冷風的那種),另外一種是發送帶HTML標籤的花哨文本的功能(即帶樣式的、比較俏皮的、有溫度的那種),以下所示:服務器
//通用的發送郵件服務 @Service @EnableAsync public class MailService { private static final Logger log= LoggerFactory.getLogger(MailService.class); @Autowired private JavaMailSender mailSender; @Autowired private Environment env; //發送簡單文本文件 @Async public void sendSimpleEmail(final MailDto dto){ try { SimpleMailMessage message=new SimpleMailMessage(); message.setFrom(env.getProperty("mail.send.from")); message.setTo(dto.getTos()); message.setSubject(dto.getSubject()); message.setText(dto.getContent()); mailSender.send(message); log.info("發送簡單文本文件-發送成功!"); }catch (Exception e){ log.error("發送簡單文本文件-發生異常: ",e.fillInStackTrace()); } } //發送花哨郵件 @Async public void sendHTMLMail(final MailDto dto){ try { MimeMessage message=mailSender.createMimeMessage(); MimeMessageHelper messageHelper=new MimeMessageHelper(message,true,"utf-8"); messageHelper.setFrom(env.getProperty("mail.send.from")); messageHelper.setTo(dto.getTos()); messageHelper.setSubject(dto.getSubject()); messageHelper.setText(dto.getContent(),true); mailSender.send(message); log.info("發送花哨郵件-發送成功!"); }catch (Exception e){ log.error("發送花哨郵件-發生異常: ",e.fillInStackTrace()); } } }
其中,MailDto類主要統一封裝了在發送郵件時所須要的字段信息,好比接收人、郵件標題、郵件內容等等(提現了面向對象的重要特性)!其源代碼以下所示:微信
/**統一封裝了在發送郵件時所須要的字段信息 * @Author:debug (SteadyJack) * @Date: 2019/6/22 10:11 **/ @Data @ToString @AllArgsConstructor @NoArgsConstructor public class MailDto implements Serializable{ //郵件主題 private String subject; //郵件內容 private String content; //接收人 private String[] tos; }
(3)最後是在「RabbitMQ通用的消息接收服務類」 RabbitReceiverService 的接收消息邏輯中整合進「發送郵件服務」的邏輯,以下所示:app
@Autowired private MailService mailService; @Autowired private Environment env; /** * 秒殺異步郵件通知-接收消息 */ @RabbitListener(queues = {"${mq.kill.item.success.email.queue}"},containerFactory = "singleListenerContainer") public void consumeEmailMsg(KillSuccessUserInfo info){ try { log.info("秒殺異步郵件通知-接收消息:{}",info); //TODO:真正的發送郵件.... //簡單文本 //MailDto dto=new MailDto(env.getProperty("mail.kill.item.success.subject"),"這是測試內容",new String[]{info.getEmail()}); //mailService.sendSimpleEmail(dto); //花哨文本 final String content=String.format(env.getProperty("mail.kill.item.success.content"),info.getItemName(),info.getCode()); MailDto dto=new MailDto(env.getProperty("mail.kill.item.success.subject"),content,new String[]{info.getEmail()}); mailService.sendHTMLMail(dto); }catch (Exception e){ log.error("秒殺異步郵件通知-接收消息-發生異常:",e.fillInStackTrace()); } }
(4)至此,關於通用的發送郵件服務的代碼實戰,咱們就介紹到這裏了,接下來咱們進入測試環節。點擊「搶購」,若是用戶秒殺成功,系統後端會在數據庫錄入一筆秒殺成功後的訂單,同時user表中「郵箱字段值」對應的郵箱會受到一封郵件,以下圖所示:dom
好了,歡樂的擼碼時光老是短暫的,本篇文章咱們就介紹到這裏了!下篇博文咱們將繼續咱們的「秒殺系統實戰」之旅!異步
一、目前,這一秒殺系統的總體構建與代碼實戰已經所有完成了,完整的源代碼數據庫地址能夠來這裏下載:gitee.com/steadyjack/… 記得Fork跟Star啊!!
二、最後,不要忘記了關注一下Debug的技術微信公衆號: