二、Spring整合JMS(一)——基于ActiveMQ实现
四、Spring整合JMS(三)——MessageConverter消息转换器
消息转换器MessageConverter
MessageConverter的作用主要有两方面,一方面它可以把我们的非标准化Message对象转换成我们的目标Message对象,这主要是用在发送消息的时候;另一方面它又可以把我们的Message对象转换成对应的目标对象,这主要是用在接收消息的时候。
下面我们就拿发送一个对象消息来举例,假设我们有这样一个需求:我们平台有一个发送邮件的功能,进行发送的时候我们只是把我们的相关信息封装成一个JMS消息,然后利用JMS进行发送,在对应的消息监听器进行接收到的消息处理时才真正的进行消息发送。
假设我们有这么一个Email对象:
package cn.tzz.jms.activemq.spring.obj; import java.io.Serializable; public class Email implements Serializable { private static final long serialVersionUID = 1L; private String receiver; private String title; private String content; public Email(String receiver, String title, String content) { this.receiver = receiver; this.title = title; this.content = content; } public String getReceiver() { return receiver; } public void setReceiver(String receiver) { this.receiver = receiver; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } @Override public String toString() { return "Email [receiver=" + receiver + ", title=" + title + ", content=" + content + "]"; } }
这个时候我们就需要定义我们的MessageConverter了。要定义自己的MessageConverter很简单,只需要实现Spring为我们提供的MessageConverter接口即可。我们先来看一下Spring MessageConverter接口的定义:
import java.io.Serializable; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.ObjectMessage; import javax.jms.Session; import org.springframework.jms.support.converter.MessageConverter; public class EmailMessageConverter implements MessageConverter { public Message toMessage(Object object, Session session) { ObjectMessage objectMessage = null; try { objectMessage = session.createObjectMessage((Serializable) object); } catch (JMSException e) { e.printStackTrace(); } return objectMessage; } public Object fromMessage(Message message) { ObjectMessage objMessage = null; Serializable serializable = null; try { objMessage = (ObjectMessage) message; serializable = objMessage.getObject(); } catch (JMSException e) { e.printStackTrace(); } return serializable; } }
这样当我们利用JmsTemplate的convertAndSend方法发送一个Email对象的时候就会把对应的Email对象当做参数调用我们定义好的EmailMessageConverter的toMessage方法。
定义好我们的EmailMessageConverter之后就需要指定我们用来发送Email对象的JmsTemplate对象的messageConverter为EmailMessageConverter,这里我们在Spring的配置文件中定义JmsTemplate bean的时候就指定:
<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 --> <property name="connectionFactory" ref="connectionFactory" /> <!-- 消息转换器 --> <property name="messageConverter" ref="emailMessageConverter"/> </bean> <!-- 类型转换器 --> <bean id="emailMessageConverter" class="cn.tzz.jms.activemq.spring.obj.service.impl.EmailMessageConverter"/>
上面destination对应的接收处理的MessageListener方法如下所示:
public class ConsumerObjMessageListener implements MessageListener { public void onMessage(Message message) { if (message instanceof ObjectMessage) { ObjectMessage objMessage = (ObjectMessage) message; try { Object obj = objMessage.getObject(); Email email = (Email) obj; System.out.println("接收到一个ObjectMessage,包含Email对象。"); System.out.println(email); } catch (JMSException e) { e.printStackTrace(); } } } }
之前说了MessageConverter有两方面的功能,除了把Java对象转换成对应的Jms Message之外还可以把Jms Message转换成对应的Java对象。我们看上面的消息监听器在接收消息的时候接收到的就是一个Jms Message,如果我们要利用MessageConverter来把它转换成对应的Java对象的话,只能是我们往里面注入一个对应的MessageConverter,然后在里面手动的调用,如:
当我们使用MessageListenerAdapter来作为消息监听器的时候,我们可以为它指定一个对应的MessageConverter,这样Spring在处理接收到的消息的时候就会自动地利用我们指定的MessageConverter对它进行转换,然后把转换后的Java对象作为参数调用指定的消息处理方法。这里我们再把前面讲解MessageListenerAdapter时定义的MessageListenerAdapter拿来做一个测试,我们指定它的MessageConverter为我们定义好的EmailMessageConverter。
然后在我们的真正用于处理接收到的消息的ConsumerListener中添加一个receiveMessage方法,添加后其代码如下所示:
然后我们定义如下测试代码:
因为我们给MessageListenerAdapter指定了一个MessageConverter,而且是一个EmailMessageConverter,所以当MessageListenerAdapter接收到一个消息后,它会调用我们指定的MessageConverter的fromMessage方法把它转换成一个Java对象,根据定义这里会转换成一个Email对象,然后会把这个Email对象作为参数调用我们通过defaultListenerMethod属性指定的默认处理器方法,根据定义这里就是receiveMessage方法,但是我们可以看到在ConsumerListener中我们一共定义了两个receiveMessage方法,因为是通过转换后的Email对象作为参数进行方法调用的,所以这里调用的就应该是参数类型为Email的receiveMessage方法了。
上述测试代码运行后会输出如下结果:
接收到一个ObjectMessage,包含Email对象。
Email [receiver=test@qq.com, title=测试, content=HellWorld]
说到这里可能有读者就会有疑问了,说我们在之前讲解MessageListenerAdapter的时候不是没有指定对应的MessageConverter,然后发送了一个TextMessage,结果Spring还是把它转换成一个String对象,调用了ConsumerListener参数类型为String的receiveMessage方法吗?那你这个MessageConverter在MessageListenerAdapter进行消息接收的时候也没什么用啊。
其实还是有用的,在我们使用MessageListenerAdapter时,在对其进行初始化也就是调用其构造方法时,它会默认new一个Spring已经为我们实现了的MessageConverter——SimpleMessageConverter作为其默认的MessageConverter,这也就是为什么我们在使用MessageListenerAdapter的时候不需要指定MessageConverter但是消息还是会转换成对应的Java对象的原因。所以默认情况下我们使用MessageListenerAdapter时其对应的MessageListener的处理器方法参数类型必须是一个普通Java对象,而不能是对应的Jms Message对象。
那如果我们在处理Jms Message的时候想使用MessageListenerAdapter,然后又希望处理最原始的Message,而不是经过MessageConverter进行转换后的Message该怎么办呢?这个时候我们只需要在定义MessageListenerAdapter的时候指定其MessageConverter为空就可以了。
<!-- 消息监听适配器 --> <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <property name="delegate"> <bean class="com.tiantian.springintejms.listener.ConsumerListener"/> </property> <property name="defaultListenerMethod" value="receiveMessage"/> <property name="messageConverter"> <null/> </property> </bean>
那么这个时候我们的真实MessageListener的处理器方法参数类型就应该是Jms Message或对应的Jms Message子类型了,不然就会调用不到对应的处理方法了。这里因为我们发送的是一个ObjectMessage,所以这里就添加一个对应的参数类型为ObjectMessage的receiveMessage方法了。
public void receiveMessage(ObjectMessage message) throws JMSException { System.out.println(message.getObject()); }
刚刚讲到Spring已经为我们实现了一个简单的MessageConverter,即org.springframework.jms.support.converter.SimpleMessageConverter,其实Spring在初始化JmsTemplate的时候也指定了其对应的MessageConverter为一个SimpleMessageConverter,所以如果我们平常没有什么特殊要求的时候可以直接使用JmsTemplate的convertAndSend系列方法进行消息发送,而不必繁琐的在调用send方法时自己new一个MessageCreator进行相应Message的创建。
相关推荐
Spring提供了对JMS的全面支持,包括连接工厂配置、消息生产者、消费者以及消息转换器等。JMS允许应用程序通过消息中间件进行解耦通信,提高系统的可扩展性和可靠性。Spring JMS抽象了JMS API,提供了更易于使用的...
这可以通过实现`MessageConverter`接口或使用内置的转换器如`SimpleMessageConverter`来完成。 综上所述,Spring整合JMS和ActivemQ提供了一套完整的解决方案,帮助开发者轻松地在应用中实现消息的发送和接收。通过...
**ActiveMQ与Spring集成实例——使用消息转换器** 在企业级应用开发中,消息队列(Message Queue,MQ)作为一种解耦和异步处理的重要工具,被广泛应用。Apache ActiveMQ 是一个开源的消息中间件,它支持多种消息...
4. **消息转换**:Spring还提供了`MessageConverter`接口,用于在消息对象和应用程序对象之间进行转换,这在处理不同格式的消息时非常有用。 5. **JMS模板的使用**:`JmsTemplate`提供了多种发送消息的方法,如`...
当我们谈论"Spring整合JMS"时,意味着我们要将Spring框架与Java消息服务(Java Message Service)进行集成,以便利用JMS的异步通信能力来处理应用程序中的消息传递。 **JMS简介** JMS是一种标准API,用于在分布式...
3. **消息转换**: Spring JMS支持消息与应用程序对象之间的转换,通过MessageConverter接口实现。这使得可以将Java对象序列化为消息体,反之亦然。 4. **事务管理**: Spring JMS允许与Spring的声明式事务管理集成,...
5. 配置和定制:Spring JMS提供了一系列的配置选项,如目的地的定义、事务策略、消息选择器等,理解这些配置如何影响Spring JMS的行为。 通过对Spring JMS源码的深入学习,我们可以更深入地理解其工作原理,从而更...
- **消息转换**:`org.springframework.jms.support.converter.MessageConverter`接口可以用于在Java对象和JMS消息之间进行转换。 - **目的地管理**:`org.springframework.jms.support.destination`包提供了一系列...
Spring提供了一些内置的转换器,如`SimpleMessageConverter`和`JsonMessageConverter`。 在Spring中,通过XML配置或者Java配置可以轻松地设置这些组件。例如,你可以定义一个`ConnectionFactory`,配置一个`...
同时,Spring JMS 也提供了 MessageConverter 抽象,以在 Java 对象和 JMS 消息之间进行转换。 在 Spring JMS 中,还提供了管理 JMS 目标的不同策略,比如针对 JNDI 中保存的目标的服务定位器。同时,Spring JMS 也...
- `MessageConverter`转换消息对象,如将Java对象转换为JMS消息格式。 2. **WebLogic Server中的JMS服务**: - WebLogic Server提供了一个完整的JMS实现,包括队列、主题和消息代理。 - 配置JMS资源,如创建JMS...
- Spring支持与JMS的事务整合,可以确保消息的可靠传递,即使在系统故障时也能保证数据一致性。 7. **异常处理**: - 消息监听器可以抛出异常来拒绝消息,Spring提供了一套完整的异常处理机制。 8. **消息选择器...
Spring允许自定义消息转换器,将对象转换为JMS消息或反之。常用的转换器有SimpleMessageConverter和JsonMessageConverter,分别处理字符串和JSON格式的数据。 三、Spring集成JMS的配置 1. 配置ConnectionFactory ...
6. **消息转换**:Spring还支持消息转换,例如将JSON或XML字符串转换为Java对象,这可以通过`MessageConverter`实现。 在提供的文件名"activemq-provider"中,我们可以推测这是实现消息生产者的一端,可能包含配置...
Spring框架提供了对JMS的全面支持,使得开发者可以方便地集成和管理消息传递系统。在本文中,我们将探讨如何在Spring中使用JMS进行异步传输,以及与ActiveMQ的结合实例。 首先,我们需要配置Spring的JMS支持。在...
其实在使用MessageListenerAdapter时,Spring默认为我们提供了SimpleMessageConverter转换器.. 事务(无代码): 在Spring整合JMS的应用中,如果我们要进行本地的事务管理的话非常简单,只需要在定义对应的消息监听...
3. `MessageConverter`: 负责将对象转换为消息,反之亦然,使得不同格式的数据可以作为消息进行传输。 4. `MessageBroker`: 是Spring消息传递的核心,它负责路由消息到正确的消费者,可以是简单的点对点模型,也...
- Spring支持消息转换,比如将JSON字符串转换为Java对象,这通过`MessageConverter`实现。默认的`SimpleMessageConverter`支持基本类型和String的转换。 - 异常处理可以通过自定义`MessageListenerAdapter`,并...
Spring的`MessageConverter`接口允许我们将Java对象与JMS消息进行转换,使得业务对象可以直接作为消息发送和接收,无需手动处理消息格式。 7. **容器集成** Spring提供多种容器集成,如`...
五、消息转换器与消息模板 Spring Messaging提供了`MessageConverter`接口,用于在消息体和Java对象之间进行转换。常见的实现有`SimpleMessageConverter`和`Jackson2JsonMessageConverter`,分别支持基本类型和JSON...