`

JMS学习笔记 (四)Spring与ActiveMQ结合

    博客分类:
  • JMS
 
阅读更多
一 实验环境

 1.jdk1.6

  2.spring 2.5

  3.apache-activemq-5.10.0


二 点对点消息模型的收发消息示例


负责发送消息的ProductService具体代码


package com.testactivemq;
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 ProductService {
  private  JmsTemplate jmsTemplate;
  
  
  /****
   * 向默认队列发送信息,默认队列即是注入jmsTemplate中的消息队列
   * @param msg
   * @return
   */
    public void sendMessage(final String msg) {
      String destination =  jmsTemplate.getDefaultDestination().toString();
      System.out.println("向队列" +destination+ "发送了消息: " + msg);
     
      jmsTemplate.send(new MessageCreator() {
        public Message createMessage(Session session) throws JMSException {
        	 TextMessage tx=session.createTextMessage();
        	 tx.setText(msg);
         return tx;
        }
      });
   
    }
    /***
     * 向指定队列发送消息
     * @param destination
     * @param msg
     */
    public void sendMessage(String destination,final String msg)
    {
    	
    	 System.out.println("向队列" +destination+ "发送了消息:" + msg);
    	jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
            	 TextMessage tx=session.createTextMessage();
            	 tx.setText(msg);
            	 return tx;
               }
             });
    	
    }

public JmsTemplate getJmsTemplate() {
	return jmsTemplate;
}

public void setJmsTemplate(JmsTemplate jmsTemplate) {
	this.jmsTemplate = jmsTemplate;
}
  
}




负责接收消息的ConsumerService具体代码
package com.testactivemq;
import javax.jms.JMSException;
import javax.jms.TextMessage;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
public class ConsumerService {

	private JmsTemplate jmsTemplate;
	 
	 /****
	  * 接收默认的消息
	  */
	 public void receive()
	 {
		
		 
		 TextMessage tm = (TextMessage)jmsTemplate.receive();
		 String destinationName=jmsTemplate.getDefaultDestination().toString();
		 try {
			System.out.println("从队列" + destinationName + "收到了消息: "+tm.getText());
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 }
	 
	 /***
	  * 接收指定消息队列
	  * @param destination
	  */
	 public void receive(String destination)
	 {
		 
		 TextMessage tm = (TextMessage) jmsTemplate.receive(destination);
		 try {
				System.out.println("从队列" + destination + "收到了消息:"+tm.getText());
			} catch (JMSException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	 }
	 
	 public static void main(String[] args) 
	 {
                  //读取spring配置文件的路径
		 ApplicationContext ac = new FileSystemXmlApplicationContext("F:\\workerspace\\MyTest\\WEB-INF\\classes\\applicationContext.xml");
		 ProductService ps= (ProductService) ac.getBean("productService");
		 ConsumerService cs1=(ConsumerService) ac.getBean("consumerService");
		ps.sendMessage("哈哈");
		 cs1.receive();
		 
		//以下是从queue2队列发送和读取消息
		 ps.sendMessage("queue2", "萌萌达");
		 cs1.receive("queue2");
	 }
	 
	 public JmsTemplate getJmsTemplate() {
			return jmsTemplate;
		}

		public void setJmsTemplate(JmsTemplate jmsTemplate) {
			this.jmsTemplate = jmsTemplate;
		}
}




在spring的配置文件中加入如下配置信息

 <!-- 配置JMS连接工厂 -->
    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="failover:(tcp://localhost:61616)" />
    </bean>
     
    <!-- 定义消息队列(Queue) -->
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <!-- 设置消息队列的名字 -->
        <constructor-arg>
            <value>queue1</value>
        </constructor-arg>
    </bean>
     
     
    <!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestination" ref="queueDestination" />
        <property name="receiveTimeout" value="10000" />
    </bean>
	
	 <!-- 定义消息队列(Queue) -->
    <bean id="queueDestination2" class="org.apache.activemq.command.ActiveMQQueue">
        <!-- 设置消息队列的名字 -->
        <constructor-arg>
            <value>queue2</value>
        </constructor-arg>
    </bean>
	
	 <!--queue消息生产者 -->
    <bean id="productService" class="com.testactivemq.ProductService">
        <property name="jmsTemplate" ref="jmsTemplate"></property>
    </bean>
 
    <!--queue消息消费者 -->
    <bean id="consumerService" class="com.testactivemq.ConsumerService">
        <property name="jmsTemplate" ref="jmsTemplate"></property>
    </bean>



运行ConsumerService 中的main方法效果如下






点对点的消息模型,除了上面的接收消息方法外Spring JMS提供了消息监听的模式代码和配置如下

package com.testactivemq;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
 
public class QueueMessageListener implements MessageListener {
        //当收到消息时,自动调用该方法,运行后会一直停留在进程当中。
    public void onMessage(Message message) {
        TextMessage tm = (TextMessage) message;
        try {
        	 String destination=tm.getJMSDestination().toString();
            System.out.println("收到["+destination+"]文本消息:" + tm.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
 
}



在spring 的配置文件中配置监听容器以及侦听者
 <!-- 配置消息队列监听者(Queue)-->
    <bean id="queueMessageListener" class="com.testactivemq.QueueMessageListener" />
    
     <!-- 消息监听容器(Queue),配置连接工厂,监听的队列是queue2,监听器是前面定义的监听器 -->
    <bean id="jmsContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="queueDestination2" />
        <property name="messageListener" ref="queueMessageListener" />
    </bean>


public static void main(String[] args) 
	 {
		 ApplicationContext ac = new FileSystemXmlApplicationContext("F:\\workerspace\\MyTest\\WEB-INF\\classes\\applicationContext.xml");
		 ProductService ps= (ProductService) ac.getBean("productService");
		 ConsumerService cs1=(ConsumerService) ac.getBean("consumerService");
				 
		//以下是从queue2队列发送消息,读取消息在QueueMessageListener 中的onMessage方法自动执行
		 ps.sendMessage("queue2", "萌萌达");
			 }


运行后的效果如下



二 主题消息模型的收发消息示例

负责发布主题(消息发布者)TopicProvider代码如下

package com.testactivemq;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
 
public class TopicProvider {
 
    private JmsTemplate topicJmsTemplate;
 
    /**
     * 向指定的topic发布消息
     * 
     * @param topic
     * @param msg
     */
    public void publish(final String topic, final String msg) {
 
    	
        topicJmsTemplate.send(topic, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                System.out.println("主题 是[" + topic  + "],发布消息内容为: " + msg);
                return session.createTextMessage(msg);
            }
        });
    }
    
    public static void main(String[] args) 
	 {
		 ApplicationContext ac = new FileSystemXmlApplicationContext("F:\\workerspace\\MyTest\\WEB-INF\\classes\\applicationContext.xml");
		 TopicProvider tp= (TopicProvider) ac.getBean("topicProvider");
           //test_topic为题的名称是主题的识别标志
		 tp.publish("test_topic", "么么达");
		
	 }
 
    public void setTopicJmsTemplate(JmsTemplate topicJmsTemplate) {
        this.topicJmsTemplate = topicJmsTemplate;
    }
 
}



负责接收已订阅的消息(消息监听者)

package com.testactivemq;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
 *和队列监听的代码一样。
 */
public class TopicMessageListener implements MessageListener {
 
	public void onMessage(Message message) {
        TextMessage tm = (TextMessage) message;
        try {
        	 String destination=tm.getJMSDestination().toString();
            System.out.println("收到["+destination+"],文本消息:" + tm.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
 
}



在spring 的配置中加入以下代码

 <!-- 定义消息主题(Topic) -->
    <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg>
            <value>test_topic</value>
        </constructor-arg>
    </bean>
    <!-- 配置JMS模板(Topic),pubSubDomain="true"-->
    <bean id="topicJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestination" ref="topicDestination" />
        <property name="pubSubDomain" value="true" />
        <property name="receiveTimeout" value="10000" />
    </bean>
    <!--topic消息发布者 -->
    <bean id="topicProvider" class="com.testactivemq.TopicProvider">
        <property name="topicJmsTemplate" ref="topicJmsTemplate"></property>
    </bean>
    
    <!-- 消息主题监听者 和 主题监听容器 ,主题监听容器可以配置多个,即多个订阅者 -->
    <!-- 消息主题监听者(Topic) -->
    <bean id="topicMessageListener" class="com.testactivemq.TopicMessageListener" />
    <!-- 主题监听容器 (Topic),订阅者1 -->
    <bean id="topicJmsContainer1"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="topicDestination" />
        <property name="messageListener" ref="topicMessageListener" />
    </bean>
    
   <!-- 主题监听容器 (Topic),订阅者2 -->	
    <bean id="topicJmsContainer2"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="topicDestination" />
        <property name="messageListener" ref="topicMessageListener" />
    </bean>



运行TopicProvider中的main方法,效果如下



  • 大小: 9.1 KB
  • 大小: 7.1 KB
  • 大小: 8.7 KB
  • 大小: 8.8 KB
分享到:
评论

相关推荐

    jms Spring+ActiveMQ 5.4.2

    标题 "jms Spring+ActiveMQ 5.4.2" 涉及的是Java消息服务(JMS)在Spring框架中的应用,以及ActiveMQ作为消息代理的使用。在这个主题下,我们将深入探讨JMS的基本概念、Spring对JMS的支持以及ActiveMQ 5.4.2版本的...

    Spring和ActiveMQ整合的完整实例

    在IT行业中,Spring框架是Java应用开发中的一个关键组件,它提供了一个全面的编程和配置模型,用于构建灵活、可维护的...这个完整的实例是一个很好的学习资源,可以帮助开发者更好地理解和实践Spring与ActiveMQ的整合。

    spring整合jms+activemq

    本文将深入探讨如何在Spring 3.0中整合JMS与ActivemQ,以及它们在实际应用中的关键知识点。 首先,我们要了解Spring对JMS的支持。Spring通过其`org.springframework.jms`包提供了丰富的JMS抽象,简化了JMS的使用。...

    SpringJMS整合ActiveMQ

    详细内容: SpringJMS整合ActiveMQ.doc 详细说明文档 apache-activemq-5.8.0-bin.zip ActiveMQ安装包 JMSTest.rar MyEclipse8.5下web工程

    JMS之Spring +activeMQ实现消息队列

    通过阅读和理解这些代码,你可以更好地了解Spring与ActiveMQ结合使用时的具体实现细节。 总的来说,通过Spring与ActiveMQ的整合,我们可以构建出可靠、高效的消息队列系统,从而改善系统的响应时间,提高可扩展性和...

    Spring与ActiveMQ整合完整案例

    本案例将详细讲解如何将Spring与ActiveMQ整合,以提升系统的可扩展性和解耦性。 1. **Spring框架**:Spring是一个全方位的开发框架,提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented ...

    spring 与ACTIVEMQ整合

    本文将深入探讨如何将Spring与ActiveMQ进行整合,以提升系统的可扩展性和解耦性。 一、Spring与ActiveMQ整合基础 1. **消息中间件概念**:消息中间件是一种软件,它在不同的应用之间传递消息,实现了应用之间的...

    ActiveMQ学习笔记(二) JMS与Spring

    在本篇ActiveMQ学习笔记中,我们将探讨JMS(Java Message Service)与Spring框架的集成。JMS是一种标准API,用于在分布式环境中进行异步消息传递,而Spring框架则为开发人员提供了强大的依赖注入和管理服务的能力。...

    Spring集成ActiveMQ配置

    Spring与ActiveMQ的集成,不仅简化了JMS消息的处理流程,还提高了系统的可扩展性和可靠性。通过上述步骤,开发者可以轻松地在自己的应用中实现消息队列的功能,无论是用于任务调度、异步处理还是分布式系统之间的...

    spring使用activeMQ实现消息发送

    综上所述,Spring与ActiveMQ的结合使用能帮助开发者构建高效、可靠的分布式系统,通过消息队列进行异步通信,提高了系统的并发能力和容错性。在实际项目中,可以根据具体需求调整配置和代码,实现复杂的消息处理场景...

    spring2 activemq5 tomcat6构建jms

    5. **事务管理**: 如果需要确保消息的一致性,可以结合Spring的事务管理功能,将消息发送与业务操作置于同一个事务中。 6. **测试和优化**: 测试消息系统的可靠性、性能和容错能力,根据需要进行调整和优化。 在...

    spring+activemq

    接下来,**Spring与ActiveMQ的集成**:在Spring应用中配置ActiveMQ,通常需要在Spring配置文件中定义`JmsTemplate`和`DefaultMessageListenerContainer`。`JmsTemplate`用于发送消息,而`...

    Spring和ActiveMQ的整合实例源码

    当我们谈论Spring与ActiveMQ的整合时,主要涉及的是Spring的JMS模块。这个模块允许我们轻松地与消息中间件如ActiveMQ进行交互,从而实现解耦和异步处理。下面将详细介绍这个整合过程中的关键知识点: 1. **JMS...

    spring整合Activemq源码

    本文将详细探讨Spring与ActiveMQ的整合过程,以及相关的知识点。 1. **Spring框架**:Spring是Java开发中的一个全功能框架,提供依赖注入(Dependency Injection)、面向切面编程(AOP)、事务管理等核心功能,广泛...

    spring整合activemq的maven工程

    现在,我们将深入探讨如何将Spring与ActiveMQ整合,并使用Maven进行项目构建。 首先,我们需要理解Spring与ActiveMQ整合的基本概念。Spring通过其`spring-jms`模块提供了对JMS的支持,可以方便地与消息代理如...

    多个spring 和ActiveMQ结合的项目

    当我们谈到"多个Spring和ActiveMQ结合的项目"时,这意味着我们正在探讨如何在多个Spring应用中集成ActiveMQ来实现高效的通信和数据交换。 首先,Spring框架提供了一个名为Spring Integration的模块,它支持与各种...

    JMS之ActiveMQ与Spring整合源码

    将ActiveMQ与Spring整合,可以方便地在Spring应用中使用JMS,实现消息驱动的架构。 本文将深入探讨ActiveMQ与Spring整合的关键知识点: 1. **Spring对JMS的支持**: Spring提供了`org.springframework.jms`包,该...

    spring配置activemq详解

    总之,"spring配置activemq详解"是一个涵盖Spring与ActiveMQ整合的深度话题,涉及了从项目配置到消息生产和消费的全过程。通过理解和实践这些知识点,开发者能够构建出稳定、高效的分布式消息处理系统。

Global site tag (gtag.js) - Google Analytics