ActiveMQ學習(四)Spring整合ActiveMQ
因為2018年的第一場雪,比以往時候來的更晚一些,所以,本篇文章隔了近5個月才更新,抱歉來的有點晚了各位,
不是人造革,皮是真的皮,啊彌陀佛,罪過罪過……本篇,將繼續跟隨以往的腳步,使用Spring MVC+ActiveMQ+Maven+Tomcat,做一個整合的簡單例項。
1. 開發環境
1.1 版本工具
- Spring 4.1.8
- ActiveMQ 5.14.5
- JDK 1.7
- Tomcat 7
- Eclipse Mars+Maven
- ActiveMQ服務已經啟動
1.2 專案結構
1.3 Maven依賴
推薦使用介個:
<!-- ActiveMQ -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring</artifactId>
<version>5.14.5</version>
</dependency>
不推薦使用介個(FAQ中說明):
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId >activemq-all</artifactId>
<version>5.14.5</version>
</dependency>
2. 專案配置
為了簡單粗暴及猿友們易懂,我就直接上程式碼了,程式碼中有詳細的註釋,重要的地方我也會在文章中指出。
2.1 配置AMQ(spring-amq.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context ="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.14.5.xsd">
<!-- 1、定義ActiveMQ服務廠商提供的連線工廠 ,這才是真正實現JMS的 -->
<amq:connectionFactory id="amqConnectionFactory"
brokerURL="tcp://localhost:61616" userName="admin" password="admin" />
<!-- 2、定義Spring內部的連線工廠,並引用上面的AMQ的連線工廠; Spring使用CachingConnectionFactory來管理實際的AMQ工廠 -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- 通過此屬性引用AMQ的連線工廠 -->
<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
<!-- 也可以這樣 -->
<!-- <constructor-arg ref="amqConnectionFactory" /> -->
<!-- 配置Session快取數量 -->
<property name="sessionCacheSize" value="100" />
</bean>
<!-- 3、定義JmsTemplate的Queue型別 -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory物件 -->
<constructor-arg ref="connectionFactory" />
<!-- false,表示非pub/sub模型(釋出/訂閱),即佇列 -->
<property name="pubSubDomain" value="false" />
</bean>
<!-- 4、定義JmsTemplate的Topic型別 -->
<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory物件 -->
<constructor-arg ref="connectionFactory" />
<!-- true,表示pub/sub模型(釋出/訂閱) -->
<property name="pubSubDomain" value="true" />
</bean>
<!-- 5、定義Queue監聽器 -->
<jms:listener-container destination-type="queue"
container-type="default" connection-factory="connectionFactory"
acknowledge="auto">
<jms:listener destination="my.queue" ref="queueReceiver1" />
<jms:listener destination="my.queue" ref="queueReceiver2" />
</jms:listener-container>
<!-- 6、定義Topic監聽器 -->
<jms:listener-container destination-type="topic"
container-type="default" connection-factory="connectionFactory"
acknowledge="auto">
<jms:listener destination="my.topic" ref="topicReceiver1" />
<jms:listener destination="my.topic" ref="topicReceiver2" />
</jms:listener-container>
</beans>
來,看黑板,敲重點:
(1)首先配置AMQ的連線工廠,在上篇文章的程式碼中,我們首先建立的就是此物件。
(2)配置Spring內部的連線工廠,主要是對AMQ的工廠進行了封裝,便於管理;Spring提供了多種連線工廠,介紹如下兩個:
- SingleConnectionFactory;
對於建立JMS伺服器連結的請求會一直返回同一個連結,並且會忽略Connection的close方法呼叫。 - CachingConnectionFactory;
繼承了SingleConnectionFactory,擁有前者的所有功能,同時它新增了快取,可以提升效率,它和AMQ的PooledConnectionFactory都是比較推薦的。
(3)配置生產者
在Spring中,我們不再使用AMQ的原生物件進行訊息的傳送,而是使用Spring提供的一個模板類,噹噹噹當——JmsTemplate。它就相當於我們之前使用過的
HibernateTemplate
,所以,配置生產者最核心的就是配置JmsTemplate
;對於訊息傳送者而言,它在傳送訊息的時候要知道自己該往哪裡發,為此,我們在定義
JmsTemplate
的時候需要注入一個Spring提供的ConnectionFactory
物件。另外,配置
JmsTemplate
時,需要知道傳送哪種型別的訊息,一是點對點,二是訂閱/釋出,表現出來就是通過JmsTemplate
的pubSubDomain
屬性來定義。
(4)配置消費者
- 在實際使用中,我們一般不使用消費者物件去手動獲取訊息,而是通過訊息監聽器(MessageListenerContainer)來實現,通過
destination
屬性來指定其要監聽的目的地。 - 除了監聽目的地之外,還需要知道到哪裡監聽,所以指定一個
connection-factory
就是理所應當的了。 - 另外就是監聽器對應我們的實際處理類,通過
ref
進行引用。 - 推薦使用DefaultMessageListenerContainer,它允許非同步接收訊息並快取session和訊息consumer,而且還可以根據訊息數量動態的增加或縮減監聽器的數量。
2.2 配置Spring MVC
除了spring-amq.xml是重中之重,其他的都沒有什麼特別的配置,在此不再做詳細說明,更多配置請檢視原始碼。
(1)spring-main.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
<!-- 掃描元件 -->
<context:component-scan base-package="com.jastar.demo.amq" />
</beans>
(2)spring-mvc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<!-- 掃描controller -->
<context:component-scan base-package="com.jastar.demo.ctrl" />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/res/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3. 編寫程式碼
同樣,大部分程式碼較為簡單,在此只展示部分,更多請檢視原始碼。
3.1 訊息生產者
QueueSender.java:
package com.jastar.demo.amq.producer;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
/**
* 佇列訊息生產者
*
* @author Jastar·Wang
* @date 2018年4月4日
* @since 1.0
*/
@Component
public class QueueSender {
@Autowired
@Qualifier("jmsQueueTemplate")
private JmsTemplate jmsTemplate;
/**
* 傳送一條訊息到指定的佇列(目標)
*
* @param queueName
* 佇列名稱
* @param message
* 訊息內容
*/
public void send(String queueName, final String message) {
jmsTemplate.send(queueName, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
// 其他的還有createXXXMessage(...)
return session.createTextMessage(message);
}
});
}
}
3.2 訊息消費者
QueueReceiver1.java:
package com.jastar.demo.amq.consumer.queue;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.springframework.stereotype.Component;
/**
* 佇列訊息消費者1
*
* @author Jastar·Wang
* @date 2018年4月4日
* @since 1.0
*/
@Component
public class QueueReceiver1 implements MessageListener {
@Override
public void onMessage(Message message) {
try {
/*
* 實際專案中拿到String型別的message(通常是JSON字串)之後,會進行反序列化成物件,做進一步的處理
*/
System.out.println("QueueReceiver1接收到訊息:" + ((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
4. 測試
Pass、過、要不起……
港真,私下已測試success,在此就不再放到這裡來說了,執行專案訪問首頁即可,傻瓜式操作。
5. FAQ
5.1 關於AMQ的jar包依賴
答:市面上出現了使用activemq-all.jar
和不使用它的方式(如我開頭提到的),在這裡,我個人推薦使用“activemq-spring”的形式,因為:
- activemq-all.jar中整合了很多的東西,例如Spring,如果再引用Spring本身的話,可能會導致jar包衝突而出錯,另外,還整合了其他一系列框架。(整合Spring是從activemq-all.jar的5.12.0的版本開始的,其他的就不知道了)
- activemq-all.jar足足有15M大,而需要什麼引用什麼頂多了幾M,單看這點,滋滋滋……
5.2 關於spring-amq.xml的配置形式
答:市面上同樣存在著兩種配置形式,一種是使用amq和jms形式的標籤(本文即是)
,另一種是使用spring的傳統bean
的配置形式,雖然配置不同,但兩者效果都一樣,都正確,不過個人覺得前者略簡單,不過需要注意引用namespace:
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.14.5.xsd
5.3 關於本文
答:博主菜鳥一隻,本文的部分內容及大部分程式碼都是參考csdn於亮 大神的文章,包括JSP頁面,沒懶得改,專案使用了maven進行升級,對理論部分略有完善,在此只作為學習總結使用。
5.4 原始碼
傳送門:戳我戳我
……
“紙上得來終覺淺,絕知此事要躬行。——魯迅”
“魯迅:這話我真沒說過。”
……
相關推薦
ActiveMQ學習(四)Spring整合ActiveMQ
因為2018年的第一場雪,比以往時候來的更晚一些,所以,本篇文章隔了近5個月才更新,抱歉來的有點晚了各位,不是人造革,皮是真的皮,啊彌陀佛,罪過罪過……本篇,將繼續跟隨以往的腳步,使用Spring MVC+ActiveMQ+Maven+Tomcat,做一個
ActiveMQ學習總結(二)——spring整合ActiveMQ
本文有兩篇參考文獻,因此有兩個例項,專案結構如下圖所示:3.例項1資訊傳送者:HelloSender.javapackage edu.sjtu.erplab.springactivemq;import javax.jms.JMSException;import javax.jms.Session;import
SpringBoot(四)springboot整合ActiveMQ
訊息佇列中介軟體是分散式系統中重要的元件,主要解決應用耦合,非同步訊息,流量削鋒等問題。實現高效能,高可用,可伸縮和最終一致性架構。是大型分散式系統不可缺少的中介軟體。訊息形式支援點對點和訂閱-釋出。 ActiveMQ是什麼 ActiveMQ是訊息佇列技術,
Spring框架學習(4)spring整合hibernate
location host mage too 自動 exception 4.0 數據庫連接 find 內容源自:spring整合hibernate spring整合註解形式的hibernate 這裏和上一部分學習一樣用了模板模式, 將hibernate開發流程封裝在O
spring學習(七)spring整合JDBC
Spring中封裝了一個可操作資料庫的物件,該物件封裝了JDBC技術 使用資料庫 一、導包(IDEA的maven工程,在pom.xml檔案中匯入依賴,必須注意依賴,不然會報各種異常) <?xml version="1.0" encoding="UTF-8"?> &l
Mybatis學習(六)————— Spring整合mybatis
一、Spring整合mybatis思路 非常簡單,這裡先回顧一下mybatis最基礎的根基, mybatis,有兩個配置檔案 全域性配置檔案SqlMapConfig.xml(配置資料來源,全域性變數,載入對映檔案等東西) 對映檔案xxxM
maven 專案(四) spring整合springMVC開發統一接入API(準備工作:第二部分)
介面虛擬碼流程(為啥是虛擬碼,這裡就是很一般的寫法,給人蔘考吧):/** @Controller:宣告是springMVC的響應元件 @RequestMapping(value = "/apicenter"):定義介面路徑 */ @Controller public class Api
SSM進階(四)Spring整合Mybatis-----Aop事務
Spring整合Mybatis-----Aop事務 首先對於Spring整合Mybatis有兩種方式那就是使用sql絕對定位以及使用Mapper代理來進行開發,本篇博文先來介紹第一種。 所謂的Sql絕對定位就是namespace+id得方式來進行定位
Spring Boot學習之旅:(四)springboot 整合 fastjson
springboot 預設使用的 jackson 但是聽說某寶的fastjson 效能很好,而且平時用的習慣,所以來整合一下。 首先在pom 中匯入依賴 <dependency> <groupId>
Spring Boot 構建企業級部落格學習(四)- Spting Boot 整合Thymeleaf模板
Spting Boot 整合Thymeleaf模板 理解Thymeleaf的概念、用法 Thymeleaf 與 Spring Boot 整合 Thymeleaf 實戰 Thymeleaf概念 理解Thymeleaf Thymeleaf是一種
6、ActiveMQ入門教程(六)Spring與ActiveMQ整合
在這一篇部落格分享一下消費者,使用監聽的實現方式。 1. pom.xml 2. 生產者 package org.ygy.mq.lesson04; import javax.jms.JMSException; import javax.jms.Mes
Spring學習之路(四)spring對數據庫操作
date val mapr text core 導入 sed package assert 1、導入jdbc.jar、tx. jar包 2、測試 package com.junit; import static org.junit.Assert.*;
Spring Boot學習(四)
自動配置 pat xml配置 XML 入口 spa ges auto classpath @SpringBootApplication 每一個Spring Boot項目都有一個名為*Application的入口類,入口類中有個main方法,在main方法中使用: Sprin
Spring學習之旅(四)Spring工作原理再探
容器 mxml 實現 span ssp express 16px 部分 做了 上篇博文對Spring的工作原理做了個大概的介紹,想看的同學請出門左轉。今天詳細說幾點。 (一)Spring IoC容器及其實例化與使用 Spring IoC容器負責Bean的實例化、配置和組裝工
Ehcache學習筆記(1)--spring整合
一:spring整合ehcache 1、spring整合的ehcache是2.10.x版,jar包要對。 <!--ehcache --> <dependency> <groupId>net.sf.ehcache</gr
shiro學習筆記(6)--spring整合及可能遇到的問題小結
上篇spring整合shiro後續… spring整合shiro主要是org.apache.shiro.web.filter.authc.FormAuthenticationFilter類。 1、controller @Controller public class HelloSsm {
shiro學習筆記(5)--spring整合
spring整合shiro(1) 1、jar <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</art
ActiveMQ學習(八)
Consumer的高階特性 獨有消費者: Consumer訊息的非同步分發: Consumer的優先順序: 管理持久化訊息: 持久化傳送端: 持久化接收端: 執行程式,從介面上檢視訂閱者,20秒之後再重新整理介面就可以看到這個不活躍的
SSH框架學習(三)——struts整合spring
SSH框架學習(三)——struts整合spring 建立包結構 struts整合spring 建立提交頁面 編寫domain 編寫dao 編寫service 編寫action 配置applicationCo
Spring Boot學習(四):使用@SpringBootTest註解進行單元測試
一、簡介 專案中經常會遇到需要單元測試的情況,那麼SpringBoot如何實現這種需求,使用@SpringBootTest註解可以執行環境,測試後臺程式碼。 二、環境準備 eclipse + maven + Spring Boot 三、程式碼示例 pom.xml