JMS與Spring之一(用JmsTemplate同步收發訊息)
本文主要講述用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
相關推薦
JMS與Spring之一(用JmsTemplate同步收發訊息)
在Spring框架中使用JMS傳遞訊息有兩種方式:JMS template和message listener container,前者用於同步收發訊息,後者用於非同步收發訊息。 本文主要講述用JMS template同步收發訊息。 1. JMS templat
用Spring的jmsTemplate同步傳送訊息
首先是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入門 - CXF與Spring整合 (maven專案)
可參考CXF官網-使用Spring編寫服務文件:http://cxf.apache.org/docs/writing-a-service-with-spring.html 1.新增依賴 <!-- spring與cxf 整合webservice 所需 -->
spring boot(用postman來測試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開發,能
RocketMQ與Spring整合(含生產者消費者)
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
mybatis與spring整合(基於配置檔案)
本文主要介紹瞭如何將mybatis和spring整合在一起使用,本人使用的是mybatis3.05 + spring3.1.0M2 ,使用dbcp作為資料庫連線池。1.編寫資料訪問介面(UserDao.java)package com.mybatis;publicinterf
Mybatis與Spring整合(一)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 <
位運算(&、|、^)與邏輯運算(&&、 ||)差別
邏輯與 清空 作用 一個數 總結 與運算 位或 定位 按位與 剛無意在一篇文章中看到了位運算(&、|)和邏輯運算(&&、||)的介紹。想起了自己薄弱的基礎知識。於是百度了幾把總結了下。 首先從概念上區分下,位
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新建的數據庫一枚。 創建批處理文