2009-09-03 677 views
10

我在阅读Spring Framework reference,关于JMS集成的章节。有一些发送短信和异步接收它们的例子(听众)。 JmsTemplate函数convertAndSend也有一个例子,它将给定的对象转换为消息。基准说:如何接收convertAndSend发送的内容?

使用转换器,您和您的应用程序代码可以专注于通过JMS发送或接收,不与它是如何表示为JMS消息的细节有关的业务对象。

但是没有接收这种消息的例子。他们提到功能receiveAndConvert,但不幸的是,它同步接收。
那么我如何异步接收它?我必须知道,当我convertAndSend a Map,产生的消息将是一个MapMessage,只是检查我的听众这种类型的消息,并处理它?但他们承诺我不会关心它是如何表现为JMS消息的细节。
那么还有更好的方法吗?

回答

9

虽然JmsTemplate提供了基本的同步接收方法,但异步接收更加复杂,超出了JmsTemplate的范围。

JMS消息的异步接收是在Spring中使用Message Listener Containers完成的,它从JMS目标异步接收消息并将它们传递给您的应用程序。您可以通过MessageListenerAdapter(将转换器插入适配器,将应用程序的侦听器插入适配器,然后将适配器插入侦听器容器)将MessageConverter插入到消息侦听器容器中。

11

我知道这已经有一段时间了,但是我遇到了同样的问题,解决了这个问题,并希望在此给出一个明确的代码示例。

这是我的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插入到我的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> 

希望这可以帮助别人! Owen

+0

如何使用MessageListener的service-activator instea接收消息? – luksmir 2013-07-18 10:48:04

+0

@luksmir,我不熟悉Spring集成,但http://stackoverflow.com/questions/10351948/using-spring-integration-with-rabbitmq可能会帮助你? – 2013-07-22 22:15:30