1. 程式人生 > >ActiveMQ學習(四)Spring整合ActiveMQ

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時,需要知道傳送哪種型別的訊息,一是點對點,二是訂閱/釋出,表現出來就是通過JmsTemplatepubSubDomain屬性來定義。

(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

SpringBootspringboot整合ActiveMQ

       訊息佇列中介軟體是分散式系統中重要的元件,主要解決應用耦合,非同步訊息,流量削鋒等問題。實現高效能,高可用,可伸縮和最終一致性架構。是大型分散式系統不可缺少的中介軟體。訊息形式支援點對點和訂閱-釋出。 ActiveMQ是什麼 ActiveMQ是訊息佇列技術,

Spring框架學習4spring整合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入門教程SpringActiveMQ整合

在這一篇部落格分享一下消費者,使用監聽的實現方式。 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