1. 程式人生 > >JMS與Spring之一(用JmsTemplate同步收發訊息)

JMS與Spring之一(用JmsTemplate同步收發訊息)

 在Spring框架中使用JMS傳遞訊息有兩種方式:JMS template和message listener container,前者用於同步收發訊息,後者用於非同步收發訊息。

本文主要講述用JMS template同步收發訊息。

1.       JMS template綜述

使用JmsTemplate收發訊息可以顯著減少開發的精力投入。使用JmsTemplate時,不需要費心考慮連線到JMS provider(如ActiveMQ),建立JMS Session(如QueueSession),建立訊息生產者(如QueueSender),甚至不用新建一個JMS訊息(如TextMessage)。JmsTemplate能夠自動將各種型別如String、Byte[]等轉換為響應的JMS訊息物件型別,當然也可以自己寫Converter轉換複雜的訊息。

JmsTemplate常用的方法有send、convertAndSend、receive和convertAndReceive。

2.       詳細步驟

下面通過一個例子詳細講解使用JmsTemplate同步收發訊息。

(1)       環境

JMS1.1;apache-activemq-5.4.0;Spring-2.5.4;JDK-1.5;myeclipse7.5

如果引入的是activemq-all-5.5.0.jar這個包,則不需要再引入JMS1.1包,因為all裡面已經包含了jms1.1

(2)       原始碼(Java Project)

i)                結構

ii)              原始碼

.classpath:

<?xml version="1.0" encoding="UTF-8"?>

<classpath>

         <classpathentry kind="src" path="src/main/java"/>

         <classpathentry kind="src" path="src/main/resources"/>

         <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"

/>

         <classpathentry exported="true" kind="lib" path="lib/jms-1.1.jar"/>

         <classpathentry exported="true" kind="lib" path="lib/spring.jar"/>

         <classpathentry exported="true" kind="lib" path="lib/activemq-all-5.4.0.jar"/>

         <classpathentry kind="output" path="bin"/>

</classpath>

jndi.properties:

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory

java.naming.provider.url = tcp://localhost:61616

java.naming.security.principal=system

java.naming.security.credentials=manager

connectionFactoryNames = QueueCF

queue.queue1 = jms.queue1

app-context.xml:

<?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:jms="http://www.springframework.org/schema/jms"

       xsi:schemaLocation="

       http://www.springframework.org/schema/beans spring-beans-2.0.xsd

            http://www.springframework.org/schema/jms

            http://www.springframework.org/schema/jms/spring-jms-2.5.xsd">

         <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">

       <property name="environment">

          <props>

             <prop key="java.naming.factory.initial">

                   org.apache.activemq.jndi.ActiveMQInitialContextFactory</prop>

             <prop key="java.naming.provider.url">tcp://localhost:61616</prop>

             <prop key="java.naming.security.principal">system</prop>

             <prop key="java.naming.security.credentials">manager</prop>

          </props>

       </property>

    </bean>  

         <bean id="jndiQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">

       <property name="jndiTemplate" ref="jndiTemplate"/>

       <property name="jndiName" value="QueueCF"/>

    </bean>  

    <bean id="queueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">

        <property name="targetConnectionFactory" ref="jndiQueueConnectionFactory"/>

        <property name="sessionCacheSize" value="1"/>

    </bean> 

         <bean id="queueDestination"

            class="org.springframework.jndi.JndiObjectFactoryBean">

            <property name="jndiTemplate" ref="jndiTemplate"/>

            <property name="jndiName" value="queue1"/>

         </bean> 

         <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">

            <property name="connectionFactory" ref="queueConnectionFactory"/>

            <property name="defaultDestinationName" value="queue1"/>

            <property name="pubSubDomain" value="false"/>

         </bean>         

         <bean id="jmsSender" class="com.jms.client.JMSSender">

            <property name="jmsTemplate" ref="jmsTemplate"/>

            <property name="queueName" value="queue1"/>

         </bean> 

</beans>

JMSReceiverSync.java:

package com.jms.server; 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.jms.core.JmsTemplate;

public class JMSReceiverSync { 

         public static void main(String[] args) {                  

                   try {

                            ApplicationContext ctx =

                                     new ClassPathXmlApplicationContext("app-context.xml");

                            JmsTemplate jmsTemplate = (JmsTemplate)ctx.getBean("jmsTemplate"); 

                            int counter = 0;

                            while(counter < 10) {

                    Object msg = jmsTemplate.receiveAndConvert();

                    if (msg instanceof String) {

                             System.out.println("Received: " + msg);

                    }

                    counter++;

                            }                           

                            System.exit(0);

                   } catch (Exception up) {

                            up.printStackTrace();

                   }

         }

}

JMSSender.java:

package com.jms.client; 

import javax.jms.JMSException;

import javax.jms.Message;

import javax.jms.Session;

import javax.jms.TextMessage;

import org.springframework.jms.core.JmsTemplate;

import org.springframework.jms.core.MessageCreator; 

public class JMSSender { 

         public void sendMessage() throws Exception { 

                   MessageCreator msg = new MessageCreator() {

                            public Message createMessage(Session session)throws JMSException {

                                     TextMessage msg = session.createTextMessage("TEST 1");

                          return msg;

                 }

                   };                           

                   jmsTemplate.send(queueName, msg);

                   System.out.println("Message Sent...");                                

         }

         public JmsTemplate jmsTemplate = null;

         public String queueName = null;        

         public void setJmsTemplate(JmsTemplate jmsTemplate) {

                   this.jmsTemplate = jmsTemplate;

         }        

         public void setQueueName(String queueName) {

                   this.queueName = queueName;

         }

}

JMSSenderApp.java:

package com.jms.client; 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class JMSSenderApp { 

         public static void main(String[] args) {                  

             try {

                            ApplicationContext ctx =

                                     new ClassPathXmlApplicationContext("app-context.xml");

                            JMSSender jmsSender = (JMSSender)ctx.getBean("jmsSender");

                            jmsSender.sendMessage();

             System.exit(0);

             } catch (Exception exception) {

                 exception.printStackTrace();

             }

         }      

(3)       說明

可以看到,用JmsTemplate收發訊息非常簡單,因為JmsTemplate幾乎幫我們做了大多數的工作,相關關係如下圖所示(可結合app-context.xml理解):

    步驟與不使用Spring相似,只是都是通過配置完成的。

3.       疑惑

明明用app-context.xml就包含所有的上下文資訊了,可是刪掉jndi.properties依然會出錯。

PS:如果專案中引入了weblogic.jar包,則需要引入較高版本的jar(8.1是不行的),因為weblogic包中也有jms程式碼,由於該程式碼版本比較老,所以在執行JMSSenderApp,會提示錯誤:no such method javax.jms.ConnectionFactory.createConnection()Ljavax/jms/Connection

執行的時候,需要啟動ActiveMQ服務!!!啟動以後服務地址:ActiveMQ訊息管理後臺系統:http://localhost:8161/admin

相關推薦

JMSSpring之一JmsTemplate同步收發訊息

 在Spring框架中使用JMS傳遞訊息有兩種方式:JMS template和message listener container,前者用於同步收發訊息,後者用於非同步收發訊息。 本文主要講述用JMS template同步收發訊息。 1.       JMS templat

SpringjmsTemplate同步傳送訊息

首先是spring的配置檔案 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2

資料結構——棧佇列操作棧模擬佇列

【棧與佇列操作】 問題描述:假設有兩個長度相同的棧 S1,S2,已知以下入棧、出棧、判棧滿和判棧空操作: void Push(S,x); Elemtype Pop(S); bool StackFull(S); bool StackEmpty(S); 現用這兩個棧構成一個佇列,實現入佇列、出佇

執行緒同步中wait()和notify()的使用生產者消費者模式解釋

wait()和notify()是什麼 雖然我們一般在多執行緒中使用wait和notify的方法,但其實它們是不屬於Thread類的,他們是Object類中的方法,我們先來看一下API中的解釋: 1、notify():喚醒在此物件監視器上等待的單個執行緒。 2、n

WebService入門 - CXFSpring整合 maven專案

可參考CXF官網-使用Spring編寫服務文件:http://cxf.apache.org/docs/writing-a-service-with-spring.html 1.新增依賴 <!-- spring與cxf 整合webservice 所需 -->

spring bootpostman來測試rest api

前言 我們開發完spring boot rest介面後,需要自測,當然可能通過junit test 來測試service或用restTemplate來測試rest controller方法,但還是和調方的請求方式有差距,這時可以用postman來模擬http請求,是比較方便的 1

Memcached客戶端memcached-Java-client Spring整合單伺服器

Memcached客戶端與Spring整合,客戶端使用的是Memcached-Java-Client-release_2.6.3 1. 配置Maven <!-- Memcached client --> <dependency> <g

C#.架構設計MVVM架構模式在WPF或Silverlight、MVC架構模式在java開發、MVP架構模式在安卓開發的原理區別

轉發https://blog.csdn.net/victoryzn/article/details/78392128 本文將詳細闡述以下MVC、MVP、MVVM三種理念的定義及區別還有他們的適用場合。 MVC MVC模式最初生根於伺服器端的Web開發,後來漸漸能夠勝任客戶端Web開發,能

RocketMQSpring整合含生產者消費者

RocketMQ與Spring整合,採用push方式接收訊息。後面有生產者與Spring整合,以及使用方法。 maven依賴 <dependency> <groupId>com.alib

訊息佇列--spring整合採用註解消費佇列

一、簡介 這裡採用註解方式使用kafka。 二、新增maven依賴 <dependency> <groupId>org.springframework.kafka&l

IE相容問題之一:table--td設定背景顏色or背景圖片,border不能正常顯示的框架是layui

一、問題 table在火狐、谷歌都能正常顯示,只有在IE中不能顯示邊框,無論是IE11還是IE8、IE9。如圖: 正常情況下: https://img-blog.csdn.net/20171027151128133?watermark/2/text/aHR0c

mybatisspring整合基於配置檔案

本文主要介紹瞭如何將mybatis和spring整合在一起使用,本人使用的是mybatis3.05 + spring3.1.0M2 ,使用dbcp作為資料庫連線池。1.編寫資料訪問介面(UserDao.java)package com.mybatis;publicinterf

MybatisSpring整合Mapper介面代理的方式操作SQL語句

一、建立maven工程 建立一個普通的maven工程,基於web 專案目錄: 二、建立資料庫與表 DROP TABLE IF EXISTS `books`; CREATE TABLE `books` ( `id` int(11) NOT NULL AUTO_I

spring整合JMS同步收發訊息(基於ActiveMQ的實現)

1. 安裝ActiveMQ 注意:JDK版本需要1.7及以上才行 bin目錄結構如下: 如果我們是32位的機器,就雙擊win32目錄下的activemq.bat,如果是64位機器,則雙擊win64目錄下的activemq.bat,執行結果如下: 啟動成功!成功之後

php權限管理戶界面實現

子查詢 header 角色 borde char idt data log art 上一篇介紹的是管理員頁面,能完成對用戶的角色修改和保存,這裏來說一下用戶界面,用戶通過登錄,顯示出其對應功能界面。 1.登錄頁面(用的ajax,也可以用php表單提交方式) 1 <

位運算&amp;、|、^邏輯運算&amp;&amp;、 ||差別

邏輯與 清空 作用 一個數 總結 與運算 位或 定位 按位與 剛無意在一篇文章中看到了位運算(&、|)和邏輯運算(&&、||)的介紹。想起了自己薄弱的基礎知識。於是百度了幾把總結了下。 首先從概念上區分下,位

Mysql優化之一優化的目的以及方向

span com mage nbsp 優化 數據 cnblogs strong pan   1.數據庫優化的目的      2.數據庫優化的方向 Mysql優化之一(優化的目的以及方向)

Odoo10學習筆記三:模型結構化的應用數據、視圖戶界面設計

其他 描述 用戶界面 列表 支持 字段 界面設計 允許 學習 一:模型 1:創建模型 模型屬性:模型類可以使用一些屬性來控制它們的一些行為: _name :創建odoo模型的內部標識符,必含項。 _description :當用戶界面顯示模型時,一個方便用戶的模型記錄標題。

Python3 for戶登錄:

urn times nal con 返回 fin pla adl bre # -*- coding: UTF-8 -*-# Author:Chaoimport getpass#訪問用戶文件,並把所有的用戶名和密碼用字典類型存儲並返回這個列表def user_all():

node.js對mongodb的連接&增刪改查附async同步流程控制

color var literal int lba node () n! node.js 1.啟動mongodb數據庫 官網下載mongodb數據庫 在mongodb根目錄下創建文件夾:假設取名為test。 我們認為test就是mongodb新建的數據庫一枚。 創建批處理文