Как получить то, что было отправлено convertAndSend?
Я читаю Spring Ссылка на базовую станцию , главу о интеграции JMS. Есть несколько примеров для отправки текстовых сообщений и асинхронного приема их (слушателями). И есть также пример функции JmsTemplate
convertAndSend
, которая преобразует данный объект в сообщение. В ссылке говорится:
Используя конвертер, вы и ваш код приложения можете сосредоточиться на бизнес-объекте, который отправляется или принимается через JMS, и не беспокоиться о деталях того, как он представлен как сообщение JMS.
Но для получения таких сообщений нет примера. Они упоминают функцию receiveAndConvert
, но, к сожалению, она получает синхронно.
Итак, как я могу получить его асинхронно? Должен ли я знать, что когда я convertAndSend
a Map
, результирующее сообщение будет MapMessage
, и просто проверьте мой слушатель для этого типа сообщения и обработайте его? Но они пообещали, что я не буду беспокоиться о том, как он представлен как сообщение JMS.
Так есть лучший способ?
Ответы
Ответ 1
Хотя JmsTemplate
предоставляет базовые синхронные методы приема, асинхронный прием намного сложнее и выходит за рамки JmsTemplate
.
Асинхронный прием сообщений JMS выполняется в Spring с помощью Контейнеры прослушивателя сообщений, которые асинхронно принимают сообщения из адреса JMS и передают их к вашему приложению. Вы можете подключить MessageConverter
к вашему контейнеру прослушивателя сообщений через MessageListenerAdapter (подключите конвертер к адаптеру, подключите приемник приложений к адаптер, затем подключите адаптер к контейнеру слушателя).
Ответ 2
Я знаю, что прошло некоторое время с тех пор, как это было задано, но у меня была та же проблема, она была решена и я хотел здесь привести пример кода.
Здесь мой 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.
<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>
Надеюсь, это поможет кому-то!
Оуэн