我正在阅读Spring Framework reference,关于JMS集成的章节。有一些示例用于发送文本消息并异步接收它们(由侦听器)。并且还有JmsTemplate
函数convertAndSend
的示例,它将给定对象转换为消息。参考文献说:
通过使用转换器,您和您的应用程序代码可以专注于通过JMS发送或接收的业务对象,而不关心它如何表示为JMS消息的详细信息。
但是没有接收此类消息的示例。他们提到了函数receiveAndConvert
,但不幸的是,它同步接收
那我怎么异步接收呢?我必须知道,当我convertAndSend
Map
时,生成的消息将是MapMessage
,只需在我的监听器中检查此类消息并处理它吗?但是他们承诺我不会关心它如何被表示为JMS信息的细节
那么有更好的方法吗?
答案 0 :(得分:12)
我知道已经有一段时间了,但是我遇到了同样的问题,解决了它,并想在这里给出一个明确的代码示例。
这是我的MessageListener
。这实现了onMessage(Message)
方法异步拦截消息。
package com.package.amqp;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.support.converter.JsonMessageConverter;
import com.package.model.User;
public class TestListener implements MessageListener {
public void onMessage(Message message) {
JsonMessageConverter jmc = new JsonMessageConverter();
User u = (User)jmc.fromMessage(message);
System.out.println("received: " + u.getFirstName());
}
}
然后在我的情况下使用标准JsonMessageConvertor
转换消息,因为这是我插入messageConvertor
bean的rabbitTemplate
。
<bean id="rabbitConnectionFactory" class="org.springframework.amqp.rabbit.connection.SingleConnectionFactory">
<constructor-arg value="10.10.1.2"/>
<property name="username" value="guest"/>
<property name="password" value="guest"/>
</bean>
<bean class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">
<property name="connectionFactory" ref="rabbitConnectionFactory"/>
<property name="queueName" value="queue.helloWorld"/>
<property name="messageListener" ref="someListener"/>
</bean>
<bean id="someListener" class="com.package.amqp.TestListener"></bean>
<bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate">
<property name="connectionFactory" ref="rabbitConnectionFactory"/>
<property name="messageConverter">
<bean class="org.springframework.amqp.support.converter.JsonMessageConverter"/>
</property>
</bean>
希望这有助于某人! 欧文
答案 1 :(得分:10)
虽然JmsTemplate
提供了基本的同步接收方法,但异步接收要复杂得多,超出了JmsTemplate
的范围。
JMS消息的异步接收是在Spring中使用Message Listener Containers完成的,它以异步方式从JMS目标接收消息并将它们传递给您的应用程序。您可以通过MessageListenerAdapter将MessageConverter
插入到消息侦听器容器中(将转换器插入适配器,将应用程序的侦听器插入适配器,然后将适配器插入侦听器容器中)。