1. 程式人生 > >activeMQ開發筆記,activeMQy與Spring框架整合

activeMQ開發筆記,activeMQy與Spring框架整合

MQ開發其實很簡單:

本文以最新版本的ActiveMQ為例子,介紹了安裝和開發第一個MQ程式。

準備環境,JDK8,activeMQ 5.14.3,WIN7測試環境,Spring 4.3.4

首先是安裝 :

安裝MQ非常簡單,下載連結:https://activemq.apache.org/download.html

如果,系統的java環境沒有配置錯誤,執行D:\greenPro\mq514\bin\win64下的

activemq.bat

即可啟動成功。

啟動完成後,可以本地訪問mq控制檯:

http://localhost:8161/

預設使用者名稱和密碼:

admin/admin


點選:Manage ActiveMQ broker就可以進入佇列配置介面:


這裡我定義了一個自己的佇列myQuery1,便於後面開發和測試:

為了簡化原來程式,做了以下改進,去掉了無用的郵件傳送類和執行緒池,將客戶端和服務端程式碼整合在一起了。

修改了pom.xml更新為最新的依賴包,去掉了一些無用的包。

最新原始碼上傳於我的空間:

如果要只發送不接收,則可以註釋掉spring-mq.xml最後幾行,禁止ConsumerSessionAwareMessageListener啟動,測試訊息堆積於佇列中的情況。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
           http://www.springframework.org/schema/aop   
           http://www.springframework.org/schema/aop/spring-aop-3.2.xsd  
           http://www.springframework.org/schema/tx  
           http://www.springframework.org/schema/tx/spring-tx-3.2.xsd  
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-3.2.xsd"
    default-autowire="byName" default-lazy-init="false">
    
    <!-- 基於Dubbo的分散式系統架構視訊教程,吳水成,

[email protected],學習交流QQ群:367211134 -->

    <!-- 真正可以產生Connection的ConnectionFactory,由對應的 JMS服務廠商提供 -->
    <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <!-- ActiveMQ服務地址 -->
        <property name="brokerURL" value="${mq.brokerURL}" />
        <property name="userName" value="${mq.userName}"></property>
        <property name="password" value="${mq.password}"></property>
    </bean>

    <!--
        ActiveMQ為我們提供了一個PooledConnectionFactory,通過往裡面注入一個ActiveMQConnectionFactory
        可以用來將Connection、Session和MessageProducer池化,這樣可以大大的減少我們的資源消耗。
        要依賴於 activemq-pool包
     -->
    <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
        <property name="connectionFactory" ref="targetConnectionFactory" />
        <property name="maxConnections" value="${mq.pool.maxConnections}" />
    </bean>

    <!-- Spring用於管理真正的ConnectionFactory的ConnectionFactory -->
    <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
        <!-- 目標ConnectionFactory對應真實的可以產生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="pooledConnectionFactory" />
    </bean>
    
    <!-- Spring提供的JMS工具類,它可以進行訊息傳送、接收等 -->
    
    <!-- 佇列模板 -->
    <bean id="activeMqJmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
        <!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory物件 -->  
        <property name="connectionFactory" ref="connectionFactory"/>  
        <property name="defaultDestinationName" value="${queueName}"></property>
    </bean>


<!--這個是sessionAwareQueue目的地 -->
    <bean id="sessionAwareQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg>
            <value>${queueName}</value>
        </constructor-arg>
    </bean>

     <!-- 可以獲取session的MessageListener -->
<!--     <bean id="consumerSessionAwareMessageListener" class="wusc.edu.demo.mqtest.listener.ConsumerSessionAwareMessageListener"></bean> -->

<!--     <bean id="sessionAwareListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> -->
<!--         <property name="connectionFactory" ref="connectionFactory" /> -->
<!--         <property name="destination" ref="sessionAwareQueue" /> -->
<!--         <property name="messageListener" ref="consumerSessionAwareMessageListener" /> -->
<!--     </bean> -->

</beans>

紅字部分為註釋掉的內容。

反覆執行MQProducerTest,可以不斷髮訊息,佇列堆積後,可以從管理控制檯看到:

需要接收訊息,將紅色註釋開啟,再次執行MQProducerTest,就可以了。從控制檯看到輸出內容如下:

一月 16, 2017 3:58:24 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
資訊: Refreshing org[email protected]7a07c5b4: startup date [Mon Jan 16 15:58:24 CST 2017]; root of context hierarchy
一月 16, 2017 3:58:24 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from class path resource [spring/spring-context.xml]
一月 16, 2017 3:58:24 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from class path resource [spring/spring-mq.xml]
一月 16, 2017 3:58:24 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory registerBeanDefinition
資訊: Overriding bean definition for bean 'consumerSessionAwareMessageListener' with a different definition: replacing [Generic bean: class [wusc.edu.demo.mqtest.listener.ConsumerSessionAwareMessageListener]; scope=singleton; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\worksapce2MVN\MyJava\target\classes\wusc\edu\demo\mqtest\listener\ConsumerSessionAwareMessageListener.class]] with [Generic bean: class [wusc.edu.demo.mqtest.listener.ConsumerSessionAwareMessageListener]; scope=; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [spring/spring-mq.xml]]
一月 16, 2017 3:58:24 下午 org.springframework.context.support.PropertySourcesPlaceholderConfigurer loadProperties
資訊: Loading properties file from class path resource [mq.properties]
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
一月 16, 2017 3:58:25 下午 org.springframework.context.support.DefaultLifecycleProcessor start
資訊: Starting beans in phase 2147483647
一月 16, 2017 3:58:25 下午 org.springframework.jms.connection.SingleConnectionFactory initConnection
資訊: Established shared JMS Connection: PooledConnection { ConnectionPool[ActiveMQConnection {id=ID:zhouxj-PC-58711-1484553505143-1:1,clientId=null,started=false}] }
一月 16, 2017 3:58:25 下午 org.springframework.context.support.DefaultLifecycleProcessor start
資訊: Starting beans in phase 2147483647
==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.05456176353420983","subject":"ActiveMQ測試34234","to":"[email protected]"}
一月 16, 2017 3:58:25 下午 wusc.edu.demo.mqtest.listener.ConsumerSessionAwareMessageListener onMessage
資訊: ==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.05456176353420983","subject":"ActiveMQ測試34234","to":"[email protected]"}
Reciver2:通過ActiveMQ非同步傳送郵件!0.05456176353420983
一月 16, 2017 3:58:25 下午 wusc.edu.demo.mqtest.listener.ConsumerSessionAwareMessageListener onMessage
資訊: ==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.25300105506652026","subject":"ActiveMQ測試34234","to":"[email protected]"}
一月 16, 2017 3:58:25 下午 wusc.edu.demo.mqtest.listener.ConsumerSessionAwareMessageListener onMessage
資訊: ==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.33069073442419183","subject":"ActiveMQ測試34234","to":"[email protected]"}
一月 16, 2017 3:58:25 下午 wusc.edu.demo.mqtest.listener.ConsumerSessionAwareMessageListener onMessage
資訊: ==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.9560044771945856","subject":"ActiveMQ測試34234","to":"[email protected]"}
一月 16, 2017 3:58:25 下午 wusc.edu.demo.mqtest.listener.ConsumerSessionAwareMessageListener onMessage
資訊: ==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.1364193001852111","subject":"ActiveMQ測試34234","to":"[email protected]"}
一月 16, 2017 3:58:25 下午 wusc.edu.demo.mqtest.listener.ConsumerSessionAwareMessageListener onMessage
資訊: ==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.7340194987950655","subject":"ActiveMQ測試34234","to":"[email protected]"}
send:通過ActiveMQ非同步傳送郵件!0.7340194987950655
==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.25300105506652026","subject":"ActiveMQ測試34234","to":"[email protected]"}
Reciver2:通過ActiveMQ非同步傳送郵件!0.25300105506652026
==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.33069073442419183","subject":"ActiveMQ測試34234","to":"[email protected]"}
Reciver2:通過ActiveMQ非同步傳送郵件!0.33069073442419183
==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.9560044771945856","subject":"ActiveMQ測試34234","to":"[email protected]"}
Reciver2:通過ActiveMQ非同步傳送郵件!0.9560044771945856
==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.1364193001852111","subject":"ActiveMQ測試34234","to":"[email protected]"}
Reciver2:通過ActiveMQ非同步傳送郵件!0.1364193001852111
==>receive message:{"content":"通過ActiveMQ非同步傳送郵件!0.7340194987950655","subject":"ActiveMQ測試34234","to":"[email protected]"}
Reciver2:通過ActiveMQ非同步傳送郵件!0.7340194987950655
一月 16, 2017 3:58:25 下午 org.springframework.context.support.DefaultLifecycleProcessor stop
資訊: Stopping beans in phase 2147483647
一月 16, 2017 3:58:26 下午 wusc.edu.demo.mqtest.MQProducerTest main
資訊: ===>System.exit

附件Maven依賴包截圖:


相關推薦

activeMQ開發筆記activeMQySpring框架整合

MQ開發其實很簡單: 本文以最新版本的ActiveMQ為例子,介紹了安裝和開發第一個MQ程式。 準備環境,JDK8,activeMQ 5.14.3,WIN7測試環境,Spring 4.3.4 首先是安裝 : 安裝MQ非常簡單,下載連結:https://activemq

javaEE Freemarker模板引擎FreemarkerSpring整合生成靜態頁面

applicationContext.xml(Spring配置檔案): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/sche

activeMQ訊息中介軟體的spring整合

activemq是基於jetty服務容器的,可在原始碼中發現。 1.maven依賴jar <!-- ActiveMQ --> <dependency> <groupId>org.apache.activemq</group

JavaEE MyBatisSpring整合——基於mapper介面方式開發(教材學習筆記

在MyBatis與Spring的整合開發中雖然可以通過傳統的DAO開發方式,但是採用DAO方式會產生大量的重複程式碼,因此學習另外一種程式設計方式就很重要了,即Mapper介面程式設計(本章程式碼是基於上一篇部落格的點這裡) 一、基於MapperFactoryBean的整合 Mapper

javaEE MybatisMybatisSpring整合之傳統Dao開發(不推薦)。SqlSessionDaoSupport(Mybatis提供的Dao層基類)

src/applicationContext.xml(Spring核心配置檔案): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.or

使用AspectJ需要匯入Spring AOP和Aspectj相關jar包新版本Spring框架建議使用AspectJ方式開發AOP

Spring JDBC是Spring提供的持久層技術簡化JDBC API開發,使用上和Apache公司的DBUtils框架非常類似匯入必要jar包到工程目錄匯入Spring核心開發包到建立工程spring-beans-3.2.0.RELEASE.jarspring-conte

Android源碼開發筆記 軟鍵盤內置物理鍵盤共存以及外接藍牙鍵盤不共存邏輯

icon eva boolean 功能實現 小鍵盤 nokey top apps 需求 需求1: android設備自帶九鍵的小鍵盤,此時小鍵盤被識別為HW Keyboard,默認與軟鍵盤不能共存,需要使軟鍵盤與物理鍵盤共存。 實現: 在網上找的別人總結的Android5.

架構師入門:Spring Cloud系列HystrixEureka的整合

    和Ribbon等元件一樣,在專案中,Hystrix一般不會單獨出現,而是會和Eureka等元件配套出現。在Hystrix和Eureka整合後的框架裡,一般會用到Hystrix的斷路器以及合併請求等特性,而在Web框架裡,大多會有專門的快取元件,所以不怎麼會用到Hystri

一種古老的技術:axis1.4操作WebService實現Spring整合

這是pom檔案中需要的axis需要的依賴 <dependency> <groupId>org.springframework</groupId> <artifactId>spr

架構師系列文:通過Spring Cloud元件Hystrix合併請求 架構師入門:Spring Cloud系列HystrixEureka的整合

    在前文裡,我們講述了通過Hystrix進行容錯處理的方式,這裡我們將講述通過Hystrix合併請求的方式     哪怕一個URL請求呼叫的功能再簡單,Web應用服務都至少會開啟一個執行緒來提供服務,換句話說,有效降低URL請求數能很大程度上降低系統的負載。通過

複習電商筆記-35-常見問題、RedisCluster和Spring框架整合

  常見問題     another app is currently holding the yum…. 直接 ps –ef|grep yum 殺掉就行了 ERR Slot 5798 is already busy   Ca

activemq 學習系列(五) activemq spring boot 整合

-a pool autowire mapping pri control ESS fin tid activemq 與 spring boot 整合 1、添加依賴 <dependency> <groupId>

SpringStruts框架整合

out user list oid work vat ack default plugin Spring,負責對象對象創建 Struts, 用Action處理請求 Spring與Struts框架整合, 關鍵點:讓struts框架action對象

javaEE MybatisMybatisSpring整合之動態代理方式(推薦),自動建立Dao層實現類

src/applicationContext.xml(Spring核心配置檔案): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.or

訊息中介軟體系列六rabbitspring整合實戰

本專案是rabbit和spring整合的實戰學習專案,模擬電商下單和庫存管理的過程,看過前面幾篇部落格的同學,相信這篇部落格對你不會再難了。一些和本章學習不太相關的內容不會做過多說明,需要的朋友可以下載原始碼自己檢視執行:rabbit與spring整合實戰原始

3 Spring框架整合WEB 1(struts2整合

使用spring與struts2整合 web.xml的配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-in

Spring CredHub 2.0.0 釋出提升 Spring 兼用型

   Spring CredHub 2.0.0釋出,主要更新了以下功能: 支援 CredHub 1.x 和 2.x 的伺服器版本,以及 CreHub v1 和 v2 API。 提升 CredHub 與 Spring Framework 5.1 S和 Spring Boot

JavaBeanPOJO的簡單理解 JavaBeanSpring中bean的區別

本文是我查閱多篇部落格總結下來的,不過有些概念可能理解還不夠準確,歡迎大家糾錯改正。 Java的一個特性,資料與行為相分離。資料就是成員變數,行為就是setter和getter方法 JavaBean是Java中開發的可以跨平臺的重要元件,在JSP中常用來 封裝業務邏輯

Spring Cloud微服務系列文HystrixEureka的整合

和Ribbon等元件一樣,在專案中,Hystrix一般不會單獨出現,而是會和Eureka等元件配套出現。在Hystrix和Eureka整合後的框架裡,一般會用到Hystrix的斷路器以及合併請求等特性,而在Web框架裡,大多會有專門的快取元件,所以不怎麼會用到Hystrix的快取特性。 1 準備

四:redis主從讀寫分離哨兵模式spring整合

本篇主要介紹redis實現主從讀寫分離,採用哨兵模式後如何與spring整合在專案中進行開發 主要依賴的jar包,其他專案中實際依賴的jar包很多這裡就不一一列舉了: jar包依賴 <dependency> <grou