Spring學習筆記3之訊息佇列(rabbitmq)發送郵件功能_java

來源:互聯網
上載者:User

rabbitmq簡介:

MQ全稱為Message Queue, 訊息佇列(MQ)是一種應用程式對應用程式的通訊方法。應用程式通過讀寫出入隊列的訊息(針對應用程式的資料)來通訊,而無需專用連線來連結它們。訊息傳遞指的是程式之間通過在訊息中發送資料進行通訊,而不是通過直接調用彼此來通訊,直接調用通常是用於諸如遠端程序呼叫的技術。排隊指的是應用程式通過 隊列來通訊。隊列的使用除去了接收和發送應用程式同時執行的要求。其中較為成熟的MQ產品有IBM WEBSPHERE MQ。

本節的內容是使用者註冊時,將郵箱地址先存入rabbitmq隊列,之後返回給使用者註冊成功;之後訊息佇列的接收者從隊列中擷取訊息,發送郵件給使用者。

一、RabbitMQ介紹

    如果之前對rabbitmq不瞭解,推薦先看一下RabbitMQ Quick(快速手冊)。

1、rabbitmq在mac上的安裝。

2、rabbitmq簡單介紹。

生產者: 負責發送訊息到Exchange。

Exchange: 按照一定的策略,負責將訊息存入到指定的隊列。

隊列queue:  負責儲存訊息。

消費者: 負責從隊列中提取訊息。

binding: 負責Exchange和隊列的關聯映射,Exchange和queue是多對多的關係。

二、RabbitMQ在Spring中的實現

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, 以及將他們結合在一起的binding--> <!--在queue以及exchange中, 有一個重要的屬性durable, 預設為true, 可以防止宕機後資料丟失。--> <!--在listener-container中, 有acknowledge屬性, 預設為auto, 即消費者成功處理訊息後必須有個應答, 如果消費者程式發生異常或者宕機, 訊息會被重新放回隊列--> <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, 根據實際需要選擇。--> <!--Direct: 如果訊息的routing key與bingding的routing key直接匹配的話, 訊息將會路由到該隊列上。--> <!--Topic: 如果訊息的routing key與bingding的routing key符合萬用字元匹配的話, 訊息將會路由到該隊列上。--> <!--Headers: 如果訊息參數表中的頭資訊和值都與binding參數表中相匹配, 訊息將會路由到該隊列上。--> <!--Fanout: 不管訊息的routing key和參數表的頭資訊/值是什麼, 訊息將會路由到該隊列上。--> <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發送訊息--> <template id="rabbitTemplate"    connection-factory="connectionFactory" /> <!--4、配置監聽器容器和監聽器來接收訊息--> <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帳號密碼時,有可能會出現org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.的錯誤提示,解決辦法是建立一個管理員權限的使用者,並允許訪問虛擬機器主機。

步驟如下:

1、開啟http://localhost:15672/

2、Admin ——> Users, 建立使用者,administrator許可權。

3、Virtual Hosts,設定建立使用者允許訪問。

3、生產者發送訊息到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對象後, 發送給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來發送郵件

1、引入依賴包。

<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version></dependency> 

2、配置郵件伺服器資訊。

@Beanpublic 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、發送郵件。

@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、消費者調用發送郵件方法即可。

1、參考文獻:Spring實戰(第4版)。

2、完整代碼在github,地址:https://github.com/everseeker0307/register。

以上所述是小編給大家介紹的Spring學習筆記3之訊息佇列(rabbitmq)發送郵件功能,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.