【问题标题】:How to receive what was sent by convertAndSend?如何接收 convertAndSend 发送的内容?
【发布时间】:2010-11-25 07:15:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring jms


    【解决方案1】:

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

    这是我的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 转换消息,因为这是我插入到 rabbitTemplate bean 中的 messageConvertor

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

    希望这对某人有所帮助! 欧文

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-10
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多