Spring學習筆記3之消息隊列(rabbitmq)發(fā)送郵件功能
rabbitmq簡介:
MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序?qū)贸绦虻耐ㄐ欧椒?。應用程序通過讀寫出入隊列的消息(針對應用程序的數(shù)據(jù))來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進行通信,而不是通過直接調(diào)用彼此來通信,直接調(diào)用通常是用于諸如遠程過程調(diào)用的技術。排隊指的是應用程序通過 隊列來通信。隊列的使用除去了接收和發(fā)送應用程序同時執(zhí)行的要求。其中較為成熟的MQ產(chǎn)品有IBM WEBSPHERE MQ。
本節(jié)的內(nèi)容是用戶注冊時,將郵箱地址先存入rabbitmq隊列,之后返回給用戶注冊成功;之后消息隊列的接收者從隊列中獲取消息,發(fā)送郵件給用戶。
一、RabbitMQ介紹
如果之前對rabbitmq不了解,推薦先看一下RabbitMQ Quick(快速手冊)。
1、rabbitmq在mac上的安裝。
2、rabbitmq簡單介紹。
生產(chǎn)者: 負責發(fā)送消息到Exchange。
Exchange: 按照一定的策略,負責將消息存入到指定的隊列。
隊列queue: 負責保存消息。
消費者: 負責從隊列中提取消息。
binding: 負責Exchange和隊列的關聯(lián)映射,Exchange和queue是多對多的關系。
二、RabbitMQ在Spring中的實現(xiàn)
1、引入依賴包。
<dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-amqp</artifactId> <version>1.6.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.6.0.RELEASE</version> </dependency>
2、rabbitmq配置文件。
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/rabbit" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--1、配置連接工廠, 如果不配置host, port, username, passowrd, 則按默認值localhost:5672, guest/guest--> <!--<connection-factory id="connectionFactory" />--> <connection-factory id="connectionFactory" host="localhost" port="5672" username="everSeeker" password="333" /> <!--2、配置隊列queue, Exchange, 以及將他們結(jié)合在一起的binding--> <!--在queue以及exchange中, 有一個重要的屬性durable, 默認為true, 可以防止宕機后數(shù)據(jù)丟失。--> <!--在listener-container中, 有acknowledge屬性, 默認為auto, 即消費者成功處理消息后必須有個應答, 如果消費者程序發(fā)生異?;蛘咤礄C, 消息會被重新放回隊列--> <admin connection-factory="connectionFactory" /> <queue id="userAlertEmailQueue" name="user.alerts.email" durable="true" /> <queue id="userAlertCellphoneQueue" name="user.alerts.cellphone" /> <!--durable默認為true--> <!--標準的AMQP Exchange有4種: Direct, Topic, Headers, Fanout, 根據(jù)實際需要選擇。--> <!--Direct: 如果消息的routing key與bingding的routing key直接匹配的話, 消息將會路由到該隊列上。--> <!--Topic: 如果消息的routing key與bingding的routing key符合通配符匹配的話, 消息將會路由到該隊列上。--> <!--Headers: 如果消息參數(shù)表中的頭信息和值都與binding參數(shù)表中相匹配, 消息將會路由到該隊列上。--> <!--Fanout: 不管消息的routing key和參數(shù)表的頭信息/值是什么, 消息將會路由到該隊列上。--> <direct-exchange name="user.alert.email.exchange" durable="true"> <bindings> <binding queue="user.alerts.email" /> <!--默認的routing key與隊列的名稱相同--> </bindings> </direct-exchange> <direct-exchange name="user.alert.cellphone.exchange"> <bindings> <binding queue="user.alerts.cellphone" /> </bindings> </direct-exchange> <!--3、配置RabbitTemplate發(fā)送消息--> <template id="rabbitTemplate" connection-factory="connectionFactory" /> <!--4、配置監(jiān)聽器容器和監(jiān)聽器來接收消息--> <beans:bean id="userListener" class="com.everSeeker.alerts.UserAlertHandler" /> <listener-container connection-factory="connectionFactory" acknowledge="auto"> <listener ref="userListener" method="handleUserAlertToEmail" queues="userAlertEmailQueue" /> <listener ref="userListener" method="handleUserAlertToCellphone" queues="userAlertCellphoneQueue" /> </listener-container> </beans:beans>
如果配置connection-factory時,采用默認的guest/guest賬號密碼時,有可能會出現(xiàn)org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.的錯誤提示,解決辦法是新建一個管理員權限的用戶,并允許訪問虛擬主機。
步驟如下:
2、Admin ——> Users, 新建用戶,administrator權限。
3、Virtual Hosts,設置新建用戶允許訪問。
3、生產(chǎn)者發(fā)送消息到exchange。
@Service("userAlertService") public class UserAlertServiceImpl implements UserAlertService { private RabbitTemplate rabbit; @Autowired public UserAlertServiceImpl(RabbitTemplate rabbit) { this.rabbit = rabbit; } public void sendUserAlertToEmail(User user) { //convertAndSend(String exchange, String routingKey, Object object), 將對象object封裝成Message對象后, 發(fā)送給exchange rabbit.convertAndSend("user.alert.email.exchange", "user.alerts.email", user); } }
4、配置消費者來接收消息。
public class UserAlertHandler { public void handleUserAlertToEmail(User user) { System.out.println(user); }
三、通過javax.mail來發(fā)送郵件
1、引入依賴包。
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
2、配置郵件服務器信息。
@Bean public MailSender mailSender(Environment env) { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); //如果為普通郵箱, 非ssl認證等, 比如163郵箱 mailSender.setHost(env.getProperty("mailserver.host")); mailSender.setPort(Integer.parseInt(env.getProperty("mailserver.port"))); mailSender.setUsername(env.getProperty("mailserver.username")); mailSender.setPassword(env.getProperty("mailserver.password")); mailSender.setDefaultEncoding("utf-8"); //如果郵件服務器采用了ssl認證, 增加以下配置, 比如gmail郵箱, qq郵箱 Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.port", "465"); mailSender.setJavaMailProperties(props); return mailSender; }
3、發(fā)送郵件。
@Component("userMailService") public class UserMailServiceImpl implements UserMailService { private MailSender mailSender; @Autowired public UserMailServiceImpl(MailSender mailSender) { this.mailSender = mailSender; } public void sendSimpleUserMail(String to, User user) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("xxxxxxxx@qq.com"); message.setTo(to); message.setSubject(user.getUsername() + "信息確認"); message.setText(user.toString()); mailSender.send(message); } }
4、消費者調(diào)用發(fā)送郵件方法即可。
1、參考文獻:Spring實戰(zhàn)(第4版)。
2、完整代碼在github,地址:https://github.com/everseeker0307/register。
以上所述是小編給大家介紹的Spring學習筆記3之消息隊列(rabbitmq)發(fā)送郵件功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
非常全面的Java?SpringBoot點贊功能實現(xiàn)
但是這些功能再項目中是高頻出現(xiàn)的,如果直接操作數(shù)據(jù)庫的話,對數(shù)據(jù)庫壓力太大。那遇到這個問題怎么解決?這篇文章主要給大家介紹了關于Java?SpringBoot點贊功能實現(xiàn)?的相關資料,需要的朋友可以參考下2022-01-01Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能
這篇文章主要介紹了Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能,使用步驟是先創(chuàng)建一個線程池的配置,讓Spring Boot加載,用來定義如何創(chuàng)建一個ThreadPoolTaskExecutor,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2022-08-08Java實現(xiàn)生產(chǎn)者消費者問題與讀者寫者問題詳解
這篇文章主要介紹了Java實現(xiàn)生產(chǎn)者消費者問題與讀者寫者問題詳解,小編覺得挺不錯的,這里分享給大家,供需要的親朋好友參考。2017-11-11Java工具之ja-netfilter?2022.1?配置教程
這篇文章主要介紹了Java工具之ja-netfilter?2022.1?配置教程,本防火墻基于javaagent,所以目前只有基于java的程序能夠使用,需要的朋友可以參考下2022-04-04SpringBoot的@ControllerAdvice處理全局異常詳解
這篇文章主要介紹了SpringBoot的@ControllerAdvice處理全局異常詳解,但有時卻往往會產(chǎn)生一些bug,這時候就破壞了返回數(shù)據(jù)的一致性,導致調(diào)用者無法解析,所以我們常常會定義一個全局的異常攔截器,需要的朋友可以參考下2024-01-01