原文链接:http://blog.csdn.net/dwc_fly/article/details/11096071
前几章都是直接发送MapMessage类型的数据,拿前面的例子来讲,如果生产者发送的是TextMessage,消费者也是必须TextMessage;如果我们自己要发送的数据不是TextMessage类型,而消费者还是TextMessage的,那该怎么办?难道每次接受后都要增加一个转换方法么?其实spring早就考虑到这种情况了。转化器在很多组件中都是必不缺少的东西Spring的MessageConverter接口提供了对消息转换的支持。
1、转换类的相关代码POJO
新建一个类MsgPoJo,就是一个简单的Pojo类。具体代码如下:
- package jms.mq.spring;
- import java.io.Serializable;
- public class MsgPoJo implements Serializable{
- private String id;
- private String text;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getText() {
- return text;
- }
- public void setText(String text) {
- this.text = text;
- }
- }
2.转换类的实现
新建一个类MsgConverter.java,实现MessageConverter接口。生成的代码如下
- package jms.mq.spring;
- import javax.jms.JMSException;
- import javax.jms.Message;
- import javax.jms.Session;
- import javax.jms.TextMessage;
- import org.springframework.jms.support.converter.MessageConversionException;
- import org.springframework.jms.support.converter.MessageConverter;
- public class MsgConverter implements MessageConverter{
- @Override
- public Object fromMessage(Message message) throws JMSException,
- MessageConversionException {
- if (!(message instanceof TextMessage)) {
- throw new MessageConversionException("Message is not TextMessage");
- }
- System.out.println("--转换接收的消息--");
- TextMessage textMessage = (TextMessage) message;
- MsgPoJo msgPojo = new MsgPoJo();
- String[] texts=textMessage.getText().split(",");
- msgPojo.setId(texts[0]);
- msgPojo.setText(texts[1]);
- return msgPojo;
- }
- @Override
- public Message toMessage(Object object, Session session) throws JMSException,
- MessageConversionException {
- if (!(object instanceof MsgPoJo)) {
- throw new MessageConversionException("obj is not MsgPojo");
- }
- System.out.println("--转换发送的消息--");
- MsgPoJo msgPojo = (MsgPoJo) object;
- TextMessage textMessage = session.createTextMessage();
- textMessage.setText(msgPojo.getId()+","+msgPojo.getText());
- return textMessage;
- }
- }
代码很简单就是做些转换,有fromMessage和toMessage两个方法,真好对应发送转换toMessage和接受转换fromMessage。此时,发送和接收消息要换成template.convertAndSend(message);template.receiveAndConvert()。接下来我做一些配置,让spring知道我们的转换类。修改applicationContext.xml中jms模版配置的代码,修改后的代码如下:
- <!-- 类转换 -->
- <bean id="msgConverter" class="jms.mq.spring.MsgConverter"></bean>
- <!-- 配置Jms模板 -->
- <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
- <property name="connectionFactory" ref="connectionFactory" />
- <property name="defaultDestination" ref="queueDest" />
- <!--<property name="receiveTimeout" value="10000" /> -->
- <!-- 类转换 -->
- <property name="messageConverter" ref="msgConverter"></property>
- </bean>
注意:如果你有队列监听容器配置,配置jmsQueueTemplate和jmsTopicTemplate可能与队列容器配置冲突。
3、业务相关代码和配置
在QueueProducerService.java增加convertAndSend()方法并在其实现类中实现,实现类的代码如下:
- package jms.mq.spring;
- import java.util.Date;
- import javax.jms.Destination;
- 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 QueueProducerService{
- JmsTemplate jmsTemplate;
- Destination destination;
- public void send() {
- MessageCreator messageCreator = new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- TextMessage message = session.createTextMessage();
- message.setText("QueueProducerService发送消息"+new Date());
- return message;
- }
- };
- jmsTemplate.send(this.destination,messageCreator);
- }
- public void convertAndSend(){
- MsgPoJo msgPojo = new MsgPoJo();
- msgPojo.setId("1");
- msgPojo.setText("first msg");
- System.out.println("--发送消息:msgPojo.id为"+msgPojo.getId()+";msgPojo.text为"+msgPojo.getText());
- jmsTemplate.convertAndSend(this.destination, msgPojo);
- }
- public void setJmsTemplate(JmsTemplate jmsTemplate) {
- this.jmsTemplate = jmsTemplate;
- }
- public void setDestination(Destination destination) {
- this.destination = destination;
- }
- }
同样在QueueConsumerService.java中增加receiveAndConvert()方法并在其实现类中实现,实现类的代码如下:
- package jms.mq.spring;
- import javax.jms.Destination;
- import javax.jms.JMSException;
- import javax.jms.TextMessage;
- import org.springframework.jms.core.JmsTemplate;
- public class QueueConsumerService{
- JmsTemplate jmsTemplate;
- Destination destination;
- public void receive() {
- TextMessage message = (TextMessage) jmsTemplate.receive();
- try {
- System.out.println("QueueConsumerService收到消息:"+message.getText());
- } catch (JMSException e) {
- e.printStackTrace();
- }
- }
- public void receiveAndConvert() {
- MsgPoJo msgPojo = (MsgPoJo)jmsTemplate.receiveAndConvert();
- if(msgPojo!=null){
- System.out.println("--收到消息:msgPojo.id为"+msgPojo.getId()+";msgPojo.text为"+msgPojo.getText());
- }
- }
- public void setJmsTemplate(JmsTemplate jmsTemplate) {
- this.jmsTemplate = jmsTemplate;
- }
- public void setDestination(Destination destination) {
- this.destination = destination;
- }
- }
修改我们的两个测试类,增加对转换方法的调用,不再赘述,直接上代码:
QueueConsumerTest.java测试类
- package jms.mq.spring;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class QueueConsumerTest {
- private static ApplicationContext appContext = new ClassPathXmlApplicationContext( "applicationContext.xml");
- private static void receive() {
- QueueConsumerService consumerService = (QueueConsumerService) appContext.getBean("queueConsumerService");
- consumerService.receive();
- }
- private static void receiveAndConvert() {
- QueueConsumerService consumerService = (QueueConsumerService) appContext.getBean("queueConsumerService");
- consumerService.receiveAndConvert();
- }
- public static void main(String[] args) {
- //receive();
- receiveAndConvert();
- }
- }
QueueProducerTest.java测试类
- package jms.mq.spring;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class QueueProducerTest {
- private static ApplicationContext appContext = new ClassPathXmlApplicationContext( "applicationContext.xml");
- private static void send() {
- QueueProducerService producerService = (QueueProducerService) appContext.getBean("queueProducerService");
- producerService.send();
- }
- private static void convertAndSend() {
- QueueProducerService producerService = (QueueProducerService) appContext.getBean("queueProducerService");
- producerService.convertAndSend();
- }
- public static void main(String[] args) {
- //send();
- convertAndSend();
- }
- }
代码编写完毕,我们看一下我们的劳动成果。首先运行生产者类和消费者控制台信息如下:
收到的内容与发的内容相同,说明转换成功了。如果这一部分的程序使用的队列跟上面的一样,那你会发现发送的时候打印出的信息不值上面的一个,还包括一个接收的信息,这是为什么呢?了解spring原理的人应该知道,spring是把所有类都加载到内容中,当然也包括我们上门写的按个实现MessageListener的一个消费者类,他们也在运行,如果监听的地址跟你送的地址正好相同的话,他也有可能收到这个信息。所以在测试的时候要注意修改配置文件。
- <bean id="queueProducerService" class="jms.mq.spring.QueueProducerService">
- <property name="jmsTemplate" ref="jmsQueueTemplate" />
- <property name="destination" ref="queueDest" />
- </bean>
- <bean id="queueConsumerService" class="jms.mq.spring.QueueConsumerService">
- <property name="jmsTemplate" ref="jmsQueueTemplate" />
- <property name="destination" ref="queueDest" />
- </bean>
4、监听器上的使用方式
我再来学习一下跟监听器联合使用的方式,只在发布订阅者模式上演示一下。我们先来修改发布者的实现方式,在发布者中增加convertAndSend方法并在其实现类中实现,订阅者监听器没有类转换,不用修改,发布者修改后的代码如下:
- package jms.mq.spring;
- import java.util.Date;
- import javax.jms.Destination;
- import javax.jms.JMSException;
- import javax.jms.MapMessage;
- import javax.jms.Message;
- import javax.jms.Session;
- import javax.jms.TextMessage;
- import org.springframework.jms.core.JmsTemplate;
- import org.springframework.jms.core.MessageCreator;
- import jms.spring.QueueProducerService;
- public class TopicPublisherService{
- JmsTemplate jmsTemplate;
- Destination destination;
- public void send() {
- MessageCreator messageCreator = new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- TextMessage message = session.createTextMessage();
- message.setText("QueueProducerService发送消息"+new Date());
- return message;
- }
- };
- jmsTemplate.send(this.destination,messageCreator);
- }
- public void convertAndSend(Object obj) {
- System.out.println("--发送PoJo对象...");
- jmsTemplate.convertAndSend(destination, obj);
- }
- public void setJmsTemplate(JmsTemplate jmsTemplate) {
- this.jmsTemplate = jmsTemplate;
- }
- public void setDestination(Destination destination) {
- this.destination = destination;
- }
- }
发布订阅者配置文件如下
- <!-- 配置TopicJms模板 -->
- <bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
- <property name="connectionFactory" ref="connectionFactory" />
- <property name="defaultDestination" ref="topicDest" />
- <!-- 配置是否为发布订阅者模式,默认为false -->
- <property name="pubSubDomain" value="true" />
- <!--<property name="receiveTimeout" value="10000" /> -->
- <property name="messageConverter" ref="msgConverter"></property>
- </bean>
- <bean id="topicPublisherService" class="jms.mq.spring.TopicPublisherService">
- <property name="jmsTemplate" ref="jmsTopicTemplate" />
- <!-- <property name="destination" ref="topicDest" /> -->
- <property name="destination" ref="topicSubscriberMessageListenerDest" />
- </bean>
- <bean id="topicSubscriberService" class="jms.mq.spring.TopicSubscriberService">
- <property name="jmsTemplate" ref="jmsTopicTemplate" />
- <property name="destination" ref="topicDest" />
- </bean>
修改上面的发布测试类,修改增加对新增方法的调用,修改后的内容如下:
- package jms.mq.spring;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class TopicPublisherTest {
- private static ApplicationContext appContext = new ClassPathXmlApplicationContext( "applicationContext.xml");
- private static void send() {
- TopicPublisherService topicPublisherService = (TopicPublisherService) appContext.getBean("topicPublisherService");
- topicPublisherService.send();
- }
- private static void convertAndSend() {
- TopicPublisherService topicPublisherService = (TopicPublisherService) appContext.getBean("topicPublisherService");
- MsgPoJo msgPoJo = new MsgPoJo();
- msgPoJo.setId("1");
- msgPoJo.setText("测试内容");
- topicPublisherService.convertAndSend(msgPoJo);
- }
- public static void main(String[] args) {
- //send();
- convertAndSend();
- }
- }
运行发布测试类,运行结果如下:
写在到这里,ActiveMQ与spring整合就讲完了,主要讲了ActiveMQ与spring的简单整合,监听器和类转换这些主要功能.
呵呵,写到不好,请大家不要拍砖。
相关推荐
通过这个Demo,开发者可以学习到如何在实际项目中整合Spring和ActiveMQ,从而利用消息中间件提升系统的可伸缩性和可靠性。在理解这些核心概念后,你可以根据项目需求进行更复杂的配置和优化,例如使用Spring Boot...
在Java世界中,ActiveMQ和Spring的整合是企业级应用中常见的消息中间件解决方案,用于实现JMS(Java Message Service)消息传递。本教程将深入探讨如何将这两个强大的工具结合在一起,以创建一个简单的发送JMS消息的...
1. **ActiveMQ**: ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它遵循Java Message Service (JMS) 规范,提供可靠的消息传递服务,支持多种协议,如OpenWire、AMQP、STOMP等。在Spring框架中整合ActiveMQ...
Spring还提供了丰富的模块,如数据访问、Web、测试等,其中Spring JMS模块专门用于集成消息中间件,使得与ActiveMQ的整合变得简单。 三、ActiveMQ与Spring的整合 1. 添加依赖:首先,在项目中引入ActiveMQ和Spring...
Spring提供了JMS模块,通过`org.springframework.jms`包中的类和接口,简化了与JMS提供者(如ActiveMQ)的交互。例如,`JmsTemplate`是核心工具类,用于发送和接收消息。 2. **配置ActiveMQ**: 在Spring配置文件...
将ActiveMQ与Spring进行整合,可以方便地在Spring应用中使用消息队列功能。 本案例主要展示了如何在Spring应用中集成ActiveMQ,实现消息的发送和接收。首先,我们需要在项目中引入ActiveMQ的相关依赖。在Maven工程...
ActiveMQ作为Apache软件基金会的一个项目,是一款开源的消息中间件,支持多种协议,如AMQP、STOMP、MQTT等,并且与Java平台紧密结合。Spring框架则是一个广泛使用的Java企业级应用开发框架,提供了一整套的解决方案...
首先,ActiveMQ与Spring的整合主要基于Spring的JMS(Java Message Service)支持。Spring通过`ConnectionFactory`和`Destination`接口来抽象JMS提供者的具体实现,使得我们能够轻松地更换消息中间件,而无需修改大量...
在IT行业中,Spring框架是Java领域最广泛应用的轻量级框架之一,而JMS(Java Message Service)则是一种标准接口,用于在分布式系统中进行异步消息传递。ActivemQ是Apache软件基金会的一个项目,它实现了JMS规范,...
【ActiveMQ和Spring整合JMS】的文档主要介绍了消息中间件的基本概念,特别是重点讨论了ActiveMQ和JMS的相关知识。消息中间件是用于不同分布式系统之间数据交流的工具,通过消息传递机制来扩展进程间的通信。ActiveMQ...
Apache ActiveMQ是开源的、高性能的消息中间件,它支持多种消息协议,如OpenWire、AMQP、STOMP等。在企业级应用中,ActiveMQ常被用来实现应用程序间的异步通信,提高系统的响应速度和并发处理能力。Spring框架是Java...
Java中间件领域的ActiveMQ是一款由Apache开发的开源消息中间件,它为企业级应用提供高效、可扩展、稳定且安全的消息通信服务。ActiveMQ的核心目标是实现标准的、面向消息的集成,支持多语言环境,确保不同平台之间的...
Spring整合JMS基于ActiveMQ实现是一项常见的企业级应用开发任务,它涉及到Spring框架、Java消息服务(JMS)以及ActiveMQ消息中间件的使用。在本文中,我们将深入探讨这三个关键概念,以及如何将它们有效地结合在一起...
首先,ActiveMQ整合Spring涉及到的是Spring的JMS(Java Message Service)模块。Spring对JMS提供了一套抽象层,简化了与消息中间件的交互。在配置中,我们需要在Spring的XML配置文件或Java配置类中定义一个...
标题 "jms Spring+ActiveMQ 5.4.2" 涉及的是Java消息服务(JMS)在Spring框架中的应用,以及ActiveMQ作为消息代理的使用。在这个主题下,我们将深入探讨JMS的基本概念、Spring对JMS的支持以及ActiveMQ 5.4.2版本的...
《ActiveMQ 5.5.1与Spring模板的深度整合》 在当今的企业级应用开发中,消息中间件起着至关重要的作用,它能够有效地解耦应用程序,提高系统的可扩展性和可靠性。Apache ActiveMQ作为开源社区中最受欢迎的消息...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而ActiveMQ则是Apache组织开发的一款开源消息中间件,常用于实现应用程序间的异步通信。本文将深入探讨如何将Spring与ActiveMQ进行整合,以提升系统的...
**JMS+ActiveMQ+Spring 完整样例代码详解** 在Java世界中,消息队列(Message Queue,简称MQ)是一种重要的中间件技术,它允许应用程序之间通过异步通信来解耦系统组件。Java消息服务(Java Message Service,简称...
将JMS、ActiveMQ和Spring整合,首先需要在Spring配置文件中定义ConnectionFactory,这是与消息服务器建立连接的工厂类。接着,创建目的地(Destination)配置,包括队列(Queue)和主题(Topic)。然后,定义Message...