激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Spring學習筆記3之消息隊列(rabbitmq)發送郵件功能

Spring學習筆記3之消息隊列(rabbitmq)發送郵件功能

2020-05-29 14:46everSeeker JAVA教程

這篇文章主要介紹了Spring學習筆記3之消息隊列(rabbitmq)發送郵件功能的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

rabbitmq簡介:

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

本節的內容是用戶注冊時,將郵箱地址先存入rabbitmq隊列,之后返回給用戶注冊成功;之后消息隊列的接收者從隊列中獲取消息,發送郵件給用戶。

一、RabbitMQ介紹

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

1、rabbitmq在mac上的安裝。

2、rabbitmq簡單介紹。

Spring學習筆記3之消息隊列(rabbitmq)發送郵件功能

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

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

隊列queue:  負責保存消息。

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

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

二、RabbitMQ在Spring中的實現

1、引入依賴包。

?
1
2
3
4
5
6
7
8
9
10
<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配置文件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?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。

?
1
2
3
4
5
6
7
8
9
10
11
12
@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、配置消費者來接收消息。

?
1
2
3
4
public class UserAlertHandler {
 public void handleUserAlertToEmail(User user) {
  System.out.println(user);
}

三、通過javax.mail來發送郵件

1、引入依賴包。

?
1
2
3
4
5
<dependency>
 <groupId>javax.mail</groupId>
 <artifactId>mail</artifactId>
 <version>1.4.7</version>
</dependency>

2、配置郵件服務器信息。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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、發送郵件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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)發送郵件功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cnblogs.com/everSeeker/p/5690984.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲天堂中文字幕在线观看 | 哪里可以看免费的av | 成人做爰s片免费看网站 | 91久久91久久精品免观看 | 久久久成人一区二区免费影院 | h视频在线免费观看 | 久久网页| 免费观看黄色一级视频 | 欧美精品国产综合久久 | 美女在线视频一区二区 | 久久精品视频69 | 国产精品美女久久久久久网站 | 狠狠操电影 | 片在线观看 | 大胆在线日本aⅴ免费视频 美国黄色毛片女人性生活片 | 色阁av| 黄色成年在线观看 | 性高跟鞋xxxxhd4kvideos | 亚洲精品欧美一区二区三区 | 久色网站 | 92看片淫黄大片欧美看国产片 | 99在线精品视频免费观看20 | 欧美日韩一区,二区,三区,久久精品 | 娇妻被各种姿势c到高潮小说 | 在线播放一级片 | 亚洲第九十九页 | 国产成年免费视频 | 久久久久久久一区二区 | 9999久久久久久 | 国产精品久久久久久238 | 麻豆视频在线播放 | 精品黑人一区二区三区国语馆 | 成人偷拍片视频在线观看 | 国产在线一区二区三区 | 久综合| 欧美日韩免费在线观看视频 | 国产精品无码久久久久 | 欧美一区二区三区免费不卡 | 中文字幕在线观看1 | 一级电影免费在线观看 | 国产精品久久久久久影院8一贰佰 |