2009-09-03 3 views
10

Ich lese Spring Framework reference, Kapitel über JMS-Integration. Es gibt einige Beispiele für das Senden von Textnachrichten und das asynchrone Empfangen von ihnen (durch Listener). Und es gibt auch ein Beispiel für JmsTemplate Funktion convertAndSend, die angegebene Objekt in eine Nachricht konvertiert. Die Referenz sagt:Wie erhält man, was von convertAndSend gesendet wurde?

Durch den Konverter verwenden, können Sie und Ihr Anwendungscode können auf dem Business-Objekt konzentrieren, die über JMS gesendet oder empfangen werden und nicht mit den Details befassen, wie es als eine JMS-Nachricht dargestellt wird, .

Aber es gibt kein Beispiel für den Empfang solcher Nachrichten. Sie erwähnen Funktion receiveAndConvert, aber leider empfängt es synchron.
Also, wie soll ich es asynchron erhalten? Muss ich bedenken, dass, wenn ich convertAndSend ein Map, die resultierende Nachricht wird ein MapMessage, und nur in meinem Listener für diese Art von Nachricht einchecken und damit umgehen? Aber sie haben versprochen, dass ich mich nicht um die Details kümmern muss, wie es als JMS-Nachricht dargestellt wird.
Also gibt es einen besseren Weg?

Antwort

9

Während JmsTemplate grundlegende synchrone Empfangsverfahren bietet, ist der asynchrone Empfang sehr viel komplizierter und geht über den Umfang von JmsTemplate hinaus.

Der asynchrone Empfang von JMS-Nachrichten erfolgt im Frühjahr unter Verwendung von Message Listener Containers, die asynchron Nachrichten vom JMS-Ziel entgegennimmt und sie an Ihre Anwendung weiterleitet. Sie können eine MessageConverter in Ihrem Message-Listener-Container über eine MessageListenerAdapter verbinden (stecken Sie den Konverter in den Adapter, stecken Sie den Listener der Anwendung in den Adapter und dann den Adapter in den Listener-Container).

11

Ich weiß, es ist eine Weile her, seit das gefragt wurde, aber ich hatte das gleiche Problem, löste es und wollte hier ein explizites Codebeispiel geben.

Hier ist meine MessageListener. Dies implementiert die onMessage(Message)-Methode zum asynchronen Abfangen von Nachrichten.

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()); 
     } 
} 

Die Nachrichten werden dann umgewandelt, um die Standard-JsonMessageConvertor in meinem Fall mit, da dies die messageConvertor ich in meine rabbitTemplate Bohne eingesteckt ist.

<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> 

Hoffe, das hilft jemandem! Owen

+0

Wie Nachrichten mit einem Service-Aktivator von MessageListener empfangen werden? – luksmir

+0

@luksmir, ich bin nicht vertraut mit Spring Integration, aber http://stackoverflow.com/questions/10351948/using-spring-integration-with-rabbitmq kann Ihnen helfen? –