最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring學(xué)習(xí)筆記3之消息隊(duì)列(rabbitmq)發(fā)送郵件功能

 更新時(shí)間:2016年07月21日 11:19:38   作者:everSeeker  
這篇文章主要介紹了Spring學(xué)習(xí)筆記3之消息隊(duì)列(rabbitmq)發(fā)送郵件功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

rabbitmq簡(jiǎn)介:

MQ全稱為Message Queue, 消息隊(duì)列(MQ)是一種應(yīng)用程序?qū)?yīng)用程序的通信方法。應(yīng)用程序通過讀寫出入隊(duì)列的消息(針對(duì)應(yīng)用程序的數(shù)據(jù))來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過直接調(diào)用彼此來通信,直接調(diào)用通常是用于諸如遠(yuǎn)程過程調(diào)用的技術(shù)。排隊(duì)指的是應(yīng)用程序通過 隊(duì)列來通信。隊(duì)列的使用除去了接收和發(fā)送應(yīng)用程序同時(shí)執(zhí)行的要求。其中較為成熟的MQ產(chǎn)品有IBM WEBSPHERE MQ。

本節(jié)的內(nèi)容是用戶注冊(cè)時(shí),將郵箱地址先存入rabbitmq隊(duì)列,之后返回給用戶注冊(cè)成功;之后消息隊(duì)列的接收者從隊(duì)列中獲取消息,發(fā)送郵件給用戶。

一、RabbitMQ介紹

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

1、rabbitmq在mac上的安裝。

2、rabbitmq簡(jiǎn)單介紹。

生產(chǎn)者: 負(fù)責(zé)發(fā)送消息到Exchange。

Exchange: 按照一定的策略,負(fù)責(zé)將消息存入到指定的隊(duì)列。

隊(duì)列queue:  負(fù)責(zé)保存消息。

消費(fèi)者: 負(fù)責(zé)從隊(duì)列中提取消息。

binding: 負(fù)責(zé)Exchange和隊(duì)列的關(guān)聯(lián)映射,Exchange和queue是多對(duì)多的關(guān)系。

二、RabbitMQ在Spring中的實(shí)現(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, 則按默認(rèn)值localhost:5672, guest/guest-->
 <!--<connection-factory id="connectionFactory" />-->
 <connection-factory id="connectionFactory"
      host="localhost"
      port="5672"
      username="everSeeker"
      password="333" />
 <!--2、配置隊(duì)列queue, Exchange, 以及將他們結(jié)合在一起的binding-->
 <!--在queue以及exchange中, 有一個(gè)重要的屬性durable, 默認(rèn)為true, 可以防止宕機(jī)后數(shù)據(jù)丟失。-->
 <!--在listener-container中, 有acknowledge屬性, 默認(rèn)為auto, 即消費(fèi)者成功處理消息后必須有個(gè)應(yīng)答, 如果消費(fèi)者程序發(fā)生異?;蛘咤礄C(jī), 消息會(huì)被重新放回隊(duì)列-->
 <admin connection-factory="connectionFactory" />
 <queue id="userAlertEmailQueue" name="user.alerts.email" durable="true" />
 <queue id="userAlertCellphoneQueue" name="user.alerts.cellphone" />  <!--durable默認(rèn)為true-->
 <!--標(biāo)準(zhǔn)的AMQP Exchange有4種: Direct, Topic, Headers, Fanout, 根據(jù)實(shí)際需要選擇。-->
 <!--Direct: 如果消息的routing key與bingding的routing key直接匹配的話, 消息將會(huì)路由到該隊(duì)列上。-->
 <!--Topic: 如果消息的routing key與bingding的routing key符合通配符匹配的話, 消息將會(huì)路由到該隊(duì)列上。-->
 <!--Headers: 如果消息參數(shù)表中的頭信息和值都與binding參數(shù)表中相匹配, 消息將會(huì)路由到該隊(duì)列上。-->
 <!--Fanout: 不管消息的routing key和參數(shù)表的頭信息/值是什么, 消息將會(huì)路由到該隊(duì)列上。-->
 <direct-exchange name="user.alert.email.exchange" durable="true">
  <bindings>
   <binding queue="user.alerts.email" />  <!--默認(rèn)的routing key與隊(duì)列的名稱相同-->
  </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時(shí),采用默認(rèn)的guest/guest賬號(hào)密碼時(shí),有可能會(huì)出現(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.的錯(cuò)誤提示,解決辦法是新建一個(gè)管理員權(quán)限的用戶,并允許訪問虛擬主機(jī)。

步驟如下:

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

2、Admin ——> Users, 新建用戶,administrator權(quán)限。

3、Virtual Hosts,設(shè)置新建用戶允許訪問。

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), 將對(duì)象object封裝成Message對(duì)象后, 發(fā)送給exchange
  rabbit.convertAndSend("user.alert.email.exchange", "user.alerts.email", user);
 }
} 

4、配置消費(fèi)者來接收消息。

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、配置郵件服務(wù)器信息。

@Bean
public MailSender mailSender(Environment env) {
 JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
 //如果為普通郵箱, 非ssl認(rèn)證等, 比如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");
 //如果郵件服務(wù)器采用了ssl認(rèn)證, 增加以下配置, 比如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() + "信息確認(rèn)");
  message.setText(user.toString());
  mailSender.send(message);
 }
} 

4、消費(fèi)者調(diào)用發(fā)送郵件方法即可。

1、參考文獻(xiàn):Spring實(shí)戰(zhàn)(第4版)。

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

以上所述是小編給大家介紹的Spring學(xué)習(xí)筆記3之消息隊(duì)列(rabbitmq)發(fā)送郵件功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • java連接ElasticSearch集群操作

    java連接ElasticSearch集群操作

    這篇文章主要介紹了java連接ElasticSearch集群操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 詳解Spring AOP的實(shí)現(xiàn)方式

    詳解Spring AOP的實(shí)現(xiàn)方式

    AOP是一種思想,是對(duì)某一類事情的集中處理,切面就是指某一類特定的問題,所以AOP可以理解為面向特定方法編程,這篇文章主要介紹了Spring AOP的實(shí)現(xiàn)方式,需要的朋友可以參考下
    2024-02-02
  • springboot上傳文件并返回url過程

    springboot上傳文件并返回url過程

    這篇文章主要介紹了springboot上傳文件并返回url過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 被kafka-client和springkafka版本坑到自閉及解決

    被kafka-client和springkafka版本坑到自閉及解決

    這篇文章主要介紹了被kafka-client和springkafka版本坑到自閉及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例

    MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例

    這篇文章主要介紹了MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 一個(gè)Java配置文件加密解密工具類分享

    一個(gè)Java配置文件加密解密工具類分享

    在 JavaEE 配置文件中,例如 XML 或者 properties 文件,由于某些敏感信息不希望普通人員看見,則可以采用加密的方式存儲(chǔ),程序讀取后進(jìn)行解密
    2014-04-04
  • 用Rational Rose逆向工程(java)生成類圖(教程和錯(cuò)誤解決)

    用Rational Rose逆向工程(java)生成類圖(教程和錯(cuò)誤解決)

    Rational Rose有個(gè)很方便的功能,將項(xiàng)目中的JAVA代碼自動(dòng)轉(zhuǎn)換成UML類圖
    2013-02-02
  • java實(shí)現(xiàn)客房管理系統(tǒng)

    java實(shí)現(xiàn)客房管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)客房管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • java 中歸并排序算法詳解

    java 中歸并排序算法詳解

    這篇文章主要介紹了java 中歸并排序算法詳解的相關(guān)資料,歸并排序算法又稱為合并排序算法,是一種時(shí)間復(fù)雜度為O(N logN)的排序算法,因而其在平常生活工作中應(yīng)用非常廣泛,需要的朋友可以參考下
    2017-09-09
  • 基于Java實(shí)現(xiàn)五子棋小游戲(附源碼)

    基于Java實(shí)現(xiàn)五子棋小游戲(附源碼)

    這篇文章主要為大家介紹了如何通過Java實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java游戲開發(fā)有一定幫助,需要的可以參考一下
    2022-11-11

最新評(píng)論

定安县| 广灵县| 仙居县| 平和县| 双鸭山市| 夏津县| 安国市| 扎兰屯市| 灵川县| 东源县| 陆丰市| 祁阳县| 鄂州市| 郧西县| 定南县| 山西省| 视频| 腾冲县| 澄江县| 韶山市| 兰考县| 昭觉县| 江西省| 澎湖县| 从江县| 东阿县| 习水县| 青浦区| 全州县| 太保市| 锦屏县| 云林县| 抚远县| 昭平县| 三都| 卫辉市| 鄯善县| 青岛市| 桂平市| 八宿县| 富宁县|