Как получить то, что было отправлено 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>

Надеюсь, это поможет кому-то! Оуэн