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) 结构

ii) 源代码

.classpath:

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <classpath>
  3. <classpathentry kind="src" path="src/main/java"/>
  4. <classpathentry kind="src" path="src/main/resources"/>
  5. <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
  6. <classpathentry exported="true" kind="lib" path="lib/jms-1.1.jar"/>
  7. <classpathentry exported="true" kind="lib" path="lib/spring.jar"/>
  8. <classpathentry exported="true" kind="lib" path="lib/activemq-all-5.4.0.jar"/>
  9. <classpathentry kind="output" path="bin"/>
  10. </classpath>

jndi.properties:

Properties代码 复制代码 收藏代码
  1. java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
  2. java.naming.provider.url = tcp://localhost:61616
  3. java.naming.security.principal=system
  4. java.naming.security.credentials=manager
  5. connectionFactoryNames = QueueCF
  6. queue.queue1 = jms.queue1

app-context.xml:

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jms="http://www.springframework.org/schema/jms"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans spring-beans-2.0.xsd
  7. http://www.springframework.org/schema/jms
  8. http://www.springframework.org/schema/jms/spring-jms-2.5.xsd">
  9. <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
  10. <property name="environment">
  11. <props>
  12. <prop key="java.naming.factory.initial">
  13. org.apache.activemq.jndi.ActiveMQInitialContextFactory</prop>
  14. <prop key="java.naming.provider.url">tcp://localhost:61616</prop>
  15. <prop key="java.naming.security.principal">system</prop>
  16. <prop key="java.naming.security.credentials">manager</prop>
  17. </props>
  18. </property>
  19. </bean>
  20. <bean id="jndiQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
  21. <property name="jndiTemplate" ref="jndiTemplate"/>
  22. <property name="jndiName" value="QueueCF"/>
  23. </bean>
  24. <bean id="queueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
  25. <property name="targetConnectionFactory" ref="jndiQueueConnectionFactory"/>
  26. <property name="sessionCacheSize" value="1"/>
  27. </bean>
  28. <bean id="queueDestination"
  29. class="org.springframework.jndi.JndiObjectFactoryBean">
  30. <property name="jndiTemplate" ref="jndiTemplate"/>
  31. <property name="jndiName" value="queue1"/>
  32. </bean>
  33. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  34. <property name="connectionFactory" ref="queueConnectionFactory"/>
  35. <property name="defaultDestinationName" value="queue1"/>
  36. <property name="pubSubDomain" value="false"/>
  37. </bean>
  38. <bean id="jmsSender" class="com.jms.client.JMSSender">
  39. <property name="jmsTemplate" ref="jmsTemplate"/>
  40. <property name="queueName" value="queue1"/>
  41. </bean>
  42. </beans>

JMSReceiverSync.java:

Java代码 复制代码 收藏代码
  1. package com.jms.server;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import org.springframework.jms.core.JmsTemplate;
  5. public class JMSReceiverSync {
  6. public static void main(String[] args) {
  7. try {
  8. ApplicationContext ctx =
  9. new ClassPathXmlApplicationContext("app-context.xml");
  10. JmsTemplate jmsTemplate = (JmsTemplate)ctx.getBean("jmsTemplate");
  11. int counter = 0;
  12. while(counter < 10) {
  13. Object msg = jmsTemplate.receiveAndConvert();
  14. if (msg instanceof String) {
  15. System.out.println("Received: " + msg);
  16. }
  17. counter++;
  18. }
  19. System.exit(0);
  20. } catch (Exception up) {
  21. up.printStackTrace();
  22. }
  23. }
  24. }
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:

Java代码 复制代码 收藏代码
  1. package com.jms.client;
  2. import javax.jms.JMSException;
  3. import javax.jms.Message;
  4. import javax.jms.Session;
  5. import javax.jms.TextMessage;
  6. import org.springframework.jms.core.JmsTemplate;
  7. import org.springframework.jms.core.MessageCreator;
  8. public class JMSSender {
  9. public void sendMessage() throws Exception {
  10. MessageCreator msg = new MessageCreator() {
  11. public Message createMessage(Session session)throws JMSException {
  12. TextMessage msg = session.createTextMessage("TEST 1");
  13. return msg;
  14. }
  15. };
  16. jmsTemplate.send(queueName, msg);
  17. System.out.println("Message Sent...");
  18. }
  19. public JmsTemplate jmsTemplate = null;
  20. public String queueName = null;
  21. public void setJmsTemplate(JmsTemplate jmsTemplate) {
  22. this.jmsTemplate = jmsTemplate;
  23. }
  24. public void setQueueName(String queueName) {
  25. this.queueName = queueName;
  26. }
  27. }
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:

Java代码 复制代码 收藏代码
  1. package com.jms.client;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class JMSSenderApp {
  5. public static void main(String[] args) {
  6. try {
  7. ApplicationContext ctx =
  8. new ClassPathXmlApplicationContext("app-context.xml");
  9. JMSSender jmsSender = (JMSSender)ctx.getBean("jmsSender");
  10. jmsSender.sendMessage();
  11. System.exit(0);
  12. } catch (Exception exception) {
  13. exception.printStackTrace();
  14. }
  15. }
  16. }
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依然会出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值