0
点赞
收藏
分享

微信扫一扫

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

(2) 源代码(Java Project)

i) 结构

JMS与Spring之一(用JmsTemplate同步收发消息)_spring

ii) 源代码

.classpath:


Xml代码 ​​

1. <?xml version="1.0" encoding="UTF-8"?>
2.
3. <classpath>
4.
5. <classpathentry kind="src" path="src/main/java"/>
6.
7. <classpathentry kind="src" path="src/main/resources"/>
8.
9. <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
10.
11. <classpathentry exported="true" kind="lib" path="lib/jms-1.1.jar"/>
12.
13. <classpathentry exported="true" kind="lib" path="lib/spring.jar"/>
14.
15. <classpathentry exported="true" kind="lib" path="lib/activemq-all-5.4.0.jar"/>
16.
17. <classpathentry kind="output" path="bin"/>
18.
19. </classpath>


jndi.properties:


Properties代码 ​​



​​

1. java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory 
2.
3. java.naming.provider.url = tcp://localhost:61616
4.
5. java.naming.security.principal=system
6.
7. java.naming.security.credentials=manager
8.
9. connectionFactoryNames = QueueCF
10.
11. queue.queue1 = jms.queue1

app-context.xml:

Xml代码 ​​


1. <?xml version="1.0" encoding="UTF-8"?>
2.
3. <beans xmlns="http://www.springframework.org/schema/beans"
4.
5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6.
7. xmlns:jms="http://www.springframework.org/schema/jms"
8.
9. xsi:schemaLocation="
10.
11. http://www.springframework.org/schema/beans spring-beans-2.0.xsd
12.
13. ​​http://www.springframework.org/schema/jms ​​
14.
15. ​​http://www.springframework.org/schema/jms/spring-jms-2.5.xsd"​​>
16.
17.
18.
19. <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
20.
21. <property name="environment">
22.
23. <props>
24.
25. <prop key="java.naming.factory.initial">
26.
27. org.apache.activemq.jndi.ActiveMQInitialContextFactory</prop>
28.
29. <prop key="java.naming.provider.url">tcp://localhost:61616</prop>
30.
31. <prop key="java.naming.security.principal">system</prop>
32.
33. <prop key="java.naming.security.credentials">manager</prop>
34.
35. </props>
36.
37. </property>
38.
39. </bean>
40.
41. <bean id="jndiQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
42.
43. <property name="jndiTemplate" ref="jndiTemplate"/>
44.
45. <property name="jndiName" value="QueueCF"/>
46.
47. </bean>
48.
49. <bean id="queueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
50.
51. <property name="targetConnectionFactory" ref="jndiQueueConnectionFactory"/>
52.
53. <property name="sessionCacheSize" value="1"/>
54.
55. </bean>
56.
57. <bean id="queueDestination"
58.
59. class="org.springframework.jndi.JndiObjectFactoryBean">
60.
61. <property name="jndiTemplate" ref="jndiTemplate"/>
62.
63. <property name="jndiName" value="queue1"/>
64.
65. </bean>
66.
67. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
68.
69. <property name="connectionFactory" ref="queueConnectionFactory"/>
70.
71. <property name="defaultDestinationName" value="queue1"/>
72.
73. <property name="pubSubDomain" value="false"/>
74.
75. </bean>
76.
77. <bean id="jmsSender" class="com.jms.client.JMSSender">
78.
79. <property name="jmsTemplate" ref="jmsTemplate"/>
80.
81. <property name="queueName" value="queue1"/>
82.
83. </bean>
84.
85. </beans>


JMSReceiverSync.java:


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;

}

}

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理解):

JMS与Spring之一(用JmsTemplate同步收发消息)_JMS与Spring之一用JmsTemp_02

步骤与不使用Spring相似,只是都是通过配置完成的。

3. 疑惑

明明用app-context.xml就包含所有的上下文信息了,可是删掉jndi.properties依然会出错。

举报

相关推荐

0 条评论