2009-09-03 2 views
10

Я читаю Spring Framework reference, глава о интеграции JMS. Есть несколько примеров для отправки текстовых сообщений и асинхронного приема их (слушателями). И есть также пример для функции JmsTemplateconvertAndSend, которая преобразует данный объект в сообщение. В справочнике указывается:Как получить то, что было отправлено convertAndSend?

Используя конвертер, вы и ваш код приложения можете сфокусироваться на бизнес-объекте, который отправляется или принимается через JMS, и не беспокоиться о деталях того, как он представлен как сообщение JMS ,

Но нет такого примера для получения таких сообщений. Они упоминают функцию receiveAndConvert, но, к сожалению, она получает синхронно.
Так как я могу получить его асинхронно? Должен ли я быть в курсе, что когда я convertAndSend a Map, результирующее сообщение будет MapMessage и просто зарегистрируйте мой слушатель для этого типа сообщения и обработайте его? Но они пообещали, что я не буду беспокоиться о том, как он представлен как сообщение JMS.
Так есть лучший способ?

ответ

9

В то время как JmsTemplate предоставляет базовые синхронные методы приема, асинхронный прием является намного более сложным и выходит за рамки JmsTemplate.

Асинхронный прием сообщений JMS выполняется весной, используя Message Listener Containers, которые асинхронно принимают сообщения от адреса JMS и передают их в ваше приложение. Вы можете подключить MessageConverter к своему контейнеру прослушивателя сообщений через MessageListenerAdapter (подключите конвертер к адаптеру, подключите слушателя вашего приложения к адаптеру, затем подключите адаптер к контейнеру слушателя).

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? – luksmir

+0

@luksmir, я не знаком с Spring Integration, но http://stackoverflow.com/questions/10351948/using-spring-integration-with-rabbitmq может вам помочь? –

Смежные вопросы