我正处于异常
之下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但仍然得到相同的异常?
答案 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。