`
newleague
  • 浏览: 1504495 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

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

    博客分类:
  • JMS
 
阅读更多

在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 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依然会出错。

分享到:
评论

相关推荐

    JMS与Spring之二(用message listener container异步收发消息)

    JMS与Spring之二(用message listener container异步收发消息) 在本文中,我们将探讨使用 message listener container 在 Spring 框架中异步收发 JMS 消息的方法。Message listener container 是 Spring 提供的一...

    spring整合JMS实现同步收发消息(基于ActiveMQ的实现)

    Spring 整合 JMS 实现同步收发消息是指在 Spring 框架下使用 JMS(Java Message Service)协议来实现消息的同步收发。JMS 是一个基于 Java 的消息服务 API,提供了统一的消息服务模型,能够在不同的应用程序之间进行...

    Spring整合JMS——实现收发消息

    在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而JMS(Java Message Service)则是Java平台上的消息中间件标准,用于应用程序之间的异步通信。本篇文章将详细探讨如何通过Spring框架整合JMS,特别是...

    ActiveMQ结合Spring收发消息的示例代码

    而Spring框架是一个全面的企业级应用开发框架,其提供的Spring JMS模块使得与消息系统如ActiveMQ的集成变得简单。 为了在Spring项目中使用ActiveMQ,我们需要添加相应的依赖。在Maven项目的pom.xml文件中,需要引入...

    Spring 使用ActiveMQ 收发消息实例

    在Spring中,我们可以利用Spring JMS模块来处理与消息服务器的交互。ActiveMQ则作为一个消息代理,负责接收、存储和转发消息,确保数据在应用程序之间安全传输。 集成步骤如下: 1. **配置ActiveMQ**: - 下载并...

    JMS完全实例(八个实例)

    在这些实例中,我们可能会看到如何使用Spring的JmsTemplate或者MessageListenerContainer来注入JMS功能。Spring的依赖注入(Dependency Injection,DI)特性使得配置和管理JMS组件变得更加灵活。 4. **消息监听** ...

    activemq与spring整合

    5. **MessageTemplate**:Spring的JmsTemplate提供了一种简单的API,用于发送消息到目的地,接收消息,或者执行收发操作。 **三、优化整合的关键点** 1. **连接池**:为提高性能,可以使用PooledConnectionFactory...

    springboot集成activemq实现消息接收demo

    而ActiveMQ是Apache出品的一款开源消息中间件,它遵循JMS(Java Message Service)规范,用于处理应用程序之间的异步通信。本教程将详细介绍如何在Spring Boot项目中集成ActiveMQ,实现消息接收的Demo。 首先,我们...

    ActiveMQ与spring集成实例

    通过以上步骤,你已经成功地将ActiveMQ与Spring集成,并实现了基本的消息收发功能。在实际项目中,你可能需要根据需求调整配置,例如设置消息的持久化、事务支持、消息优先级等高级特性。此外,ActiveMQ还提供了管理...

    activemq-spring-1.2_001.jar.zip

    2. **JMS Template**:Spring提供了`JmsTemplate`,这是一个强大的工具,用于发送和接收JMS(Java Message Service)消息。通过它,我们可以以声明式的方式操作消息,简化了代码。 3. **Message Listeners**:我们...

    java实现消息队列的两种方式(小结)

    `JmsTemplate`是Spring中处理JMS的核心工具,它提供了一种声明式的方式来发送和接收消息。 在生产者(消息发送方)代码中,我们创建一个实现了`ProducerService`接口的`ProducerServiceImpl`类。该类注入了`...

Global site tag (gtag.js) - Google Analytics