如何接收convertAndSend发送的内容?

时间:2009-09-03 13:50:06

标签: java spring jms

我正在阅读Spring Framework reference,关于JMS集成的章节。有一些示例用于发送文本消息并异步接收它们(由侦听器)。并且还有JmsTemplate函数convertAndSend的示例,它将给定对象转换为消息。参考文献说:

  

通过使用转换器,您和您的应用程序代码可以专注于通过JMS发送或接收的业务对象,而不关心它如何表示为JMS消息的详细信息。

但是没有接收此类消息的示例。他们提到了函数receiveAndConvert,但不幸的是,它同步接收 那我怎么异步接收呢?我必须知道,当我convertAndSend Map时,生成的消息将是MapMessage,只需在我的监听器中检查此类消息并处理它吗?但是他们承诺我不会关心它如何被表示为JMS信息的细节 那么有更好的方法吗?

2 个答案:

答案 0 :(得分:12)

我知道已经有一段时间了,但是我遇到了同样的问题,解决了它,并想在这里给出一个明确的代码示例。

这是我的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 bean的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>

希望这有助于某人! 欧文

答案 1 :(得分:10)

虽然JmsTemplate提供了基本的同步接收方法,但异步接收要复杂得多,超出了JmsTemplate的范围。

JMS消息的异步接收是在Spring中使用Message Listener Containers完成的,它以异步方式从JMS目标接收消息并将它们传递给您的应用程序。您可以通过MessageListenerAdapterMessageConverter插入到消息侦听器容器中(将转换器插入适配器,将应用程序的侦听器插入适配器,然后将适配器插入侦听器容器中)。