2009-09-03 54 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