2009-09-03 11 views
10

Czytam Spring Framework reference, rozdział o integracji JMS. Istnieje kilka przykładów wysyłania wiadomości tekstowych i asynchronicznego odbierania ich (przez słuchaczy). Istnieje również przykład funkcji JmsTemplate, która konwertuje dany obiekt na wiadomość. Odniesienie mówi:Jak otrzymać to, co zostało wysłane przez convertAndSend?

Dzięki zastosowaniu konwertera, Ty i Twój kod aplikacji skupić się na obiekcie biznesowym, które jest wysyłane lub odbierane przez JMS, a nie zajmować się szczegółami, jak to jest reprezentowana jako komunikat JMS .

Ale nie ma przykładu na odbieranie takich wiadomości. Wspominają one o funkcji receiveAndConvert, ale niestety odbierają ją synchronicznie.
Jak mogę je otrzymać asynchronicznie? Czy muszę mieć świadomość, że wynikowy komunikat będzie MapMessage, i po prostu sprawdzić w moim słuchacza dla tego typu wiadomości i obsługiwać go? Ale obiecali, że nie będę się martwił szczegółami tego, jak jest reprezentowana jako wiadomość JMS.
Czy istnieje lepszy sposób?

Odpowiedz

9

Podczas gdy JmsTemplate zapewnia podstawowe metody odbioru synchronicznego, odbiór asynchroniczny jest znacznie bardziej skomplikowany i wykracza poza zakres JmsTemplate.

Asynchroniczny odbiór wiadomości JMS odbywa się wiosną, używając Message Listener Containers, które asynchronicznie odbierają wiadomości od miejsca docelowego JMS i przekazują je do Twojej aplikacji. Możesz podłączyć MessageConverter do kontenera nasłuchującego wiadomości poprzez MessageListenerAdapter (podłącz konwerter do adaptera, podłącz odbiornik aplikacji do adaptera, a następnie podłącz adapter do pojemnika odbiornika).

11

Wiem, że minęło trochę czasu, odkąd o to pytano, ale miałem ten sam problem, rozwiązałem go i chciałem podać tutaj wyraźny przykład kodu.

Oto mój numer MessageListener. To implementuje metodę onMessage(Message) do asynchronicznego przechwytywania wiadomości.

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

Komunikaty są następnie przekształcane przy użyciu standardowego JsonMessageConvertor w moim przypadku, ponieważ jest to messageConvertor I podłączony do mojego rabbitTemplate fasoli.

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

Mam nadzieję, że to komuś pomaga! Owen

+0

Jak odbierać wiadomości za pomocą instancji service-activator MessageListener? – luksmir

+0

@luksmir, nie jestem zaznajomiony z Spring Integration, ale http://stackoverflow.com/questions/10351948/using-spring-integration-with-rabbitmq może ci pomóc? –

Powiązane problemy