如何使用MessageListenerAdapter在spring amqp中使用带有Message类型参数的pojo?

时间:2014-05-19 13:55:39

标签: java spring spring-amqp

我正处于异常

之下
Caused by: java.lang.NoSuchMethodException: com.stockopedia.symfony.Foundation.importExchange([B)
    at java.lang.Class.getMethod(Class.java:1665)
    at org.springframework.util.MethodInvoker.prepare(MethodInvoker.java:178)
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:466)
    ... 12 more

这就是我发送消息的方式

        MessageProperties props = MessagePropertiesBuilder.newInstance()
                .setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
                .setReplyTo(this.replyQueue)
                .setCorrelationId(itemStr.getBytes())
                .setHeader("replyTimeout", this.replyTimeout).build();

        Message message = MessageBuilder
                .withBody(item.toString().getBytes()).andProperties(props)
                .build();

这是我的侦听器容器配置

<rabbit:listener-container
    connection-factory="rabbitConnectionFactory" concurrency="${import.exchanges.listener.concurrency}"
    requeue-rejected="false" prefetch="1" >
    <rabbit:listener queues="${import.exchanges.shares.queue}"
        ref="foundation" method="importExchange" />
</rabbit:listener-container>

这是我的pojo,

public class Foundation {   
    public Message importExchange(Message exchange) {
        System.out.println("Command:" + exchange.getBody());        
                Message message = MessageBuilder
                .withBody(exchange.getBody().toString().getBytes()).setCorrelationId(exchange.getMessageProperties().getCorrelationId()                                  .toString().getBytes()).build();

        return message; 
    }
}

我不想实现任何接口,因为我在同一个pojo中有很多这样的方法,我想用它作为监听器。

我见过MessageListenerAdapter实现代码https://github.com/spring-projects/spring-amqp/blob/master/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/adapter/MessageListenerAdapter.java和docs http://docs.spring.io/spring-amqp/docs/1.2.1.RELEASE/api/org/springframework/amqp/rabbit/listener/adapter/MessageListenerAdapter.html

这里给出了这个接受Message参数

的例子
 public interface RawMessageDelegate {
        void handleMessage(Message message);
 }

我的pojo很相似,为什么我得到这个例外?我试过删除setContentType但仍然得到相同的异常?

1 个答案:

答案 0 :(得分:0)

当我在Is it possible to have an async message receiver in Spring AMQP that handles multiple content types?回复你的评论时,目前无法使用标准适配器;您必须实施MessageListener.onMessage()才能收到消息。

我们正在考虑增强适配器以允许这样的论点,正如我在回答同一问题时提到的那样。

编辑:

或者,如果您需要进行请求/回复,您仍然可以使用适配器,但需要将消息转换器属性设置为null

在这种情况下,您的回复也必须是Message,适配器无法为您转换。

如果您想接收消息但返回要转换的对象,则需要编写自定义转换器。

使用自定义MessageListenerAdapter时,您需要将SimpleMessageListenerContainer定义为<bean/>,而不是使用<rabbit:listener-container/>元素。

为您的侦听器定义一个bean,为您的bean(以及一个空消息转换器)引用适配器的bean,以及一个引用该适配器的容器的bean。