程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring進修筆記3之新聞隊列(rabbitmq)發送郵件功效

Spring進修筆記3之新聞隊列(rabbitmq)發送郵件功效

編輯:關於JAVA

Spring進修筆記3之新聞隊列(rabbitmq)發送郵件功效。本站提示廣大學習愛好者:(Spring進修筆記3之新聞隊列(rabbitmq)發送郵件功效)文章只能為提供參考,不一定能成為您想要的結果。以下是Spring進修筆記3之新聞隊列(rabbitmq)發送郵件功效正文


rabbitmq簡介:

MQ全稱為Message Queue, 新聞隊列(MQ)是一種運用法式對運用法式的通訊辦法。運用法式經由過程讀寫收支隊列的新聞(針對運用法式的數據)來通訊,而無需公用銜接來鏈接它們。新聞傳遞指的是法式之間經由過程在新聞中發送數據停止通訊,而不是經由過程直接挪用彼此來通訊,直接挪用平日是用於諸如長途進程挪用的技巧。列隊指的是運用法式經由過程 隊列來通訊。隊列的應用除去了吸收和發送運用法式同時履行的請求。個中較為成熟的MQ產物有IBM WEBSPHERE MQ。

本節的內容是用戶注冊時,將郵箱地址先存入rabbitmq隊列,以後前往給用戶注冊勝利;以後新聞隊列的吸收者從隊列中獲得新聞,發送郵件給用戶。

1、RabbitMQ引見

    假如之前對rabbitmq不懂得,推舉先看一下RabbitMQ Quick(疾速手冊)。

1、rabbitmq在mac上的裝置。

2、rabbitmq簡略引見。

臨盆者: 擔任發送新聞到Exchange。

Exchange: 依照必定的戰略,擔任將新聞存入到指定的隊列。

隊列queue:  擔任保留新聞。

花費者: 擔任從隊列中提撤消息。

binding: 擔任Exchange和隊列的聯系關系映照,Exchange和queue是多對多的關系。

2、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);
}

3、經由過程javax.mail來發送郵件

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

@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("[email protected]");
  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)發送郵件功效,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved