1. 程式人生 > >spring 整合 activeMQ非同步傳送郵件

spring 整合 activeMQ非同步傳送郵件

一、訊息佇列的作用

1、非同步處理

2、流量削峰

3、應用解耦

4、日誌處理

二、此處展示的是非同步處理場景

1、構建maven專案,此處不做多餘的說明了,匯入MQ相關的jar包,注意版本的問題,這裡費了好多時間解決衝突

<!-- MQ  start-->
//我的spring版本為 4.2.3.RELEASE

// 這裡用了mq為 5.11.1的版本,因為5.15以上的版本,
會包含spring的包,導致與spring的包衝突,各種報錯,
浪費了好多時間去查詢整理

<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-all</artifactId>
  <version>5.11.1</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jms</artifactId>
  <version>${spring.version}</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-messaging</artifactId>
  <version>${spring.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-pool</artifactId>
  <version>5.11.1</version>
</dependency>
	<dependency>
	<groupId>org.apache.xbean</groupId>
	<artifactId>xbean-spring</artifactId>
	<version>4.6</version>
</dependency>
<!-- MQ  end-->

2、寫一個處理郵件訊息佇列的處理類

import javax.jms.Destination;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class EmailProcessor {
	
	@Autowired
	private JmsTemplate jmsTplate;
	
	public void sendEmailInfo2Queue(Destination destination, String message){
		System.out.println("======= 傳送郵件的請求訊息到訊息佇列=======");
		jmsTplate.convertAndSend(destination, message);
	}
}

3、實現訊息監聽器

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

/**
 * 實現 訊息佇列監聽器,監聽訊息佇列
 * 當監聽到佇列中有訊息時,進行訊息消費
 * @author Administrator
 *
 */
@Component
public class DoSendEmail implements MessageListener{
	
	@Autowired
	private EmailSender emailSender;
	
	/**
	 * 監聽的方法實現
	 */
	public void onMessage(Message message) {
		TextMessage textMsg = (TextMessage)message;
		try {
			JSONObject jsonObject = JSON.parseObject(textMsg.getText());
			 emailSender.sendEmail(jsonObject.getString("email"),jsonObject.getString("code"),jsonObject.getString("username"));
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
	
}

4、實現上面使用到的郵件傳送類,使用javax.mail類

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.springframework.stereotype.Component;

@Component
public class EmailSender {
	// 傳送者的郵箱
	private static final String FROM_EMAIL_ADDR = "xxx";
	// 授權碼,即密碼
	public static final String FROM_MAIL_PWD = "xxx";
	
	public void sendEmail(String to, String code, String username) {
		
		//1、建立一個程式與郵件伺服器會話物件 Session
		Properties prop = new Properties();
		prop.setProperty("mail.transport.protocol", "SMTP");
        prop.setProperty("mail.smtp.host","smtp.163.com");
        prop.setProperty("mail.smtp.port", "25");
        // 指定驗證為true
        prop.setProperty("mail.smtp.auth", "true");
        prop.setProperty("mail.smtp.timeout","1000");
        // 驗證賬號及密碼,密碼需要是第三方授權碼
        Authenticator authc = new Authenticator() {
        	@Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(FROM_EMAIL_ADDR, FROM_MAIL_PWD);
            }
		};
		
		Session session = Session.getInstance(prop, authc);
		// 2、建立messege
        Message msg = new MimeMessage(session);
        try {
        	 // 設定傳送者郵箱
			msg.setFrom(new InternetAddress(FROM_EMAIL_ADDR));
			 // 設定傳送方式與接收者
	        msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
	        // 設定主題
	        msg.setSubject("郵件傳送測試");
	        // 設定內容
	        msg.setContent(code, "text/html;charset=utf-8");
	        Transport.send(msg);
		} catch (Exception e) {
			e.printStackTrace();
		} 
        
	}
	
}

5、在使用者登入驗證成功後,加入傳送訊息佇列的程式碼

// 使用者登入後,給使用者傳送郵件,提示使用者登入資訊
//此處程式碼加在驗證使用者成功,返回頁面之前
Destination destination = new ActiveMQQueue("email.queue");
Map<String,String> emailParam = new HashMap<String,String>();
emailParam.put("email","[email protected]");
emailParam.put("code", "ABCDEFG");
emailParam.put("username","FX");
String message = JSON.toJSONString(emailParam);
emailProcessor.sendEmailInfo2Queue(destination,message);

6、配置jms, 本次單獨使用一個spring-jms.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--suppress SpringFacetInspection -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:amq="http://activemq.apache.org/schema/core"
       xmlns:jms="http://www.springframework.org/schema/jms"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/jms
    http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
    http://activemq.apache.org/schema/core
    http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd"
>

	<!-- 連線MQ -->
	<amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://localhost:61616" userName="admin" password="admin"/>
	
	<!-- 交給spring管理 -->
	<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
		<property name="targetConnectionFactory" ref="amqConnectionFactory"/>
		<property name="sessionCacheSize" value="10"/>
	</bean>
	
	<!-- JMS模板 -->
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory" ref="connectionFactory"/>
		<!-- 如果為True,則是Topic;如果是false或者預設,則是queue -->
		<property name="pubSubDomain" value="false"/>
	</bean>
	
	<!-- JMS監聽器 -->
	<jms:listener-container destination-type="queue" connection-factory="connectionFactory">
		<!-- 使用doSendEmail物件  監聽 email.queue 的訊息佇列,當有訊息時,進行消費 -->
		<jms:listener destination="email.queue" ref="doSendEmail"/>
	</jms:listener-container>
	
</beans>

7、當然要在spring的配置檔案中加入

<import resource="spring-jms.xml"/>

8、啟動專案,登入,可以發現郵箱中已經收到郵件了。

相關推薦

spring 整合 activeMQ非同步傳送郵件

一、訊息佇列的作用 1、非同步處理 2、流量削峰 3、應用解耦 4、日誌處理 二、此處展示的是非同步處理場景 1、構建maven專案,此處不做多餘的說明了,匯入MQ相關的jar包,注意版本的問題,這裡費了好多時間解決衝突 <!-- MQ start--&

ActiveMQSpring整合非同步傳送電子郵件

1、ActiveMQ與Spring整合,訊息生產方的程式碼       1.1    專案的目錄       1.2   config.properties  ## ActiveMQ Config activemq.brokerURL=tcp\://192.168.2.

Spring boot 整合JavaMail服務傳送郵件

JavaMail是SUN提供給廣大Java開發人員的一款郵件傳送和接受的一款開源類庫,支援常用的郵件協議,如:SMTP、POP3、IMAP,開發人員使用JavaMail編寫郵件程式時,不再需要考慮底層的通訊細節如:Socket而是關注在邏輯層面。JavaMail可以傳送各種

spring整合activemq傳送MQ訊息[queue模式]例項

queue型別訊息 pom依賴 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId>

spring整合activemq傳送MQ訊息[Topic模式]例項

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSc

SpringBoot2.0高階案例(03):整合 JavaMail ,實現非同步傳送郵件

本文原始碼 碼雲地址:知了一笑 https://gitee.com/cicadasmile/middle-ware-parent

Spring整合activeMQ消息隊列

else finally ant try 工具類 cal 創建 ransac cer 1.配置JMS <!-- Spring提供的JMS工具類,它可以進行消息發送、接收等 --> <bean id="jmsTemplate" class=

記錄一次 .Net 框架 Bug 發現和提交過程:SmtpClient一處程式碼編寫錯誤導致非同步傳送郵件時DeliveryFormat配置項無法正確工作

問題已經發到了開發者社群 developercommunity.visualstudio.com/content/pro… 涉及到的Github倉庫: github.com/xiangyuecn/… .Net開發者社群富文字編輯器太難用了,還是簡書的編輯器好用,然後掘金的版面好看,最後還是喜歡cnb

Spring Boot使用JavaMailSender傳送郵件

http://www.cnblogs.com/wxc-xiaohuang/p/9532631.html https://blog.csdn.net/icannotdebug/article/details/79725297 https://docs.spring.io/spring/docs/4.3.21

SPRING 整合 activemq 的 topic 模式

概要 activemq 支援兩種模式: 1.佇列模式 2. 釋出訂閱者模式,topic有一個主題可以有多個訂閱者。這種情況可以將一個訊息,分發到多個消費者。 實現程式碼 1.生產者 import java.util.Map; import javax.annotation.Resour

Spring cloud admin 配置傳送郵件功能

首先引入pox配置 <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spr

最新javamail 使用方案,可以非同步傳送郵件

*第一步:工程中新增javamail需要的兩個jar  地址:可以再sun官方網上去下載。  list:mail.jar、activation.jar *第二步:寫發郵件的屬性檔案,本人不喜歡硬編碼的方式coding。 mail.properties檔案如下: mail.tr

Django+Celery非同步傳送郵件

安裝 pip install django==1.11.7 pip install celery 專案目錄 AXF ├── alipay_config │   ├── alipay_rsa_public_key.pem │   └──

springboot 整合 activemq傳送自定義物件以及失敗訊息重試

                <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-act

Flask-Mail使用163郵箱非同步傳送郵件

很多型別的應用程式都需要在特定事件發生時提醒使用者,而常用的通訊方法是電子郵件。雖然 Python 標準庫中的 smtplib 包可用在 Flask 程式中傳送電子郵件,但包裝了 smtplib 的Flask-Mail 擴充套件能更好地和 Flask 整合。使用 pip 安裝

spring整合activemq傳遞物件注意事項

初衷:兩個專案分別部署在兩臺伺服器上,專案之間以activemq傳遞object訊息 拓樸結構: 伺服器A:tomcat,專案A--生產者 伺服器B:tomcat、activemq、專案B--消費者 專案A主要程式碼 src/main/resources/ActiveMQ

spring boot 用javaMail傳送郵件,很多坑

直接傳送總是報錯 554 dt:spm 被163攔截,認為非法,抄送一份給自己就解決了。但是顯示抄送人,很煩。 service層 package com.llong.email.mail; import org.springframework.beans.factory.anno

log4j2非同步傳送郵件配置

從高可用性方面考慮,大的平臺通常都會配置錯誤日誌傳送郵件的功能,由於傳送郵件比較慢,同步發郵件會影響使用者體驗,通常會配置成非同步發日誌郵件。網上只有零散的一些文章配置,沒有一個完整的log4j2非同步發郵件的配置說明,下面就詳細說明一下 - log4j2非同步傳送郵件的詳細配置。 1. 環

淺談jms之(通過spring整合activeMQ實現jms)例項

上篇說到使用activemq 實現jms訊息服務 的例項,但是那個是沒有spring進行整合和管理的;其實spring完整提供對jms的支援,所以我們可以通過spring來管理整合activemq 實現jms訊息傳遞服務。 1.建立maven工程(我的專案都是通過maven

flask 非同步傳送郵件

msg = Message('qqq',recipients=['[email protected]']) msg.body = "order" msg.html = 'html' @copy_cur