Java Rabbit 消息监听器执行失败,并且没有设置 ErrorHandler。无法调用参数类型 = [class [B] 的目标方法,

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23240863/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 21:28:39  来源:igfitidea点击:

Execution of Rabbit message listener failed, and no ErrorHandler has been set. Failed to invoke target method with argument type = [class [B],

javaspringrabbitmqspring-amqp

提问by vishal

I am using spring amqp rabbitmq, and sending messages using

我正在使用 spring amqp rabbitmq,并使用发送消息

Message message = MessageBuilder
.withBody(item.toString().getBytes())
.setReplyTo("importReply")
.setCorrelationId(item.toString().getBytes()).build();

My message handler is

我的消息处理程序是

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

I have hooked it using

我已经使用了它

<rabbit:listener-container
    connection-factory="rabbitConnectionFactory" concurrency="10">
    <rabbit:listener queues="${rabbitmq.import.queue}"
        ref="foundation" method="importExchange" />
    <rabbit:listener queues="${rabbitmq.import.reply.queue}"
        ref="importExchangeItemWriter" method="replyHandler" />
</rabbit:listener-container>

But I am getting below execption

但我低于执行

Execution of Rabbit message listener failed, and no ErrorHandler has been set.
org.springframework.amqp.rabbit.listener.ListenerExecutionFailedException: Failed to invoke target method 'importExchange' with argument type = [class [B], value = [{[B@427829d8}]
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:483)
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:374)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:647)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:573)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access
public void replyHandler(Message message) {
    System.out.println("In Reply Handler:" + message.getMessageProperties().getCorrelationId());

}
1(SimpleMessageListenerContainer.java:75) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:154) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1111) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:556) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:904) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:888) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access0(SimpleMessageListenerContainer.java:75) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:989) at java.lang.Thread.run(Thread.java:744) 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

and the similar issue is also on producer side replyHandler

类似的问题也出现在生产者端的replyHandler上

##代码##

Also, how can I get exception in replyHandler if there is any exception in importExchange ?

另外,如果 importExchange 中有任何异常,我如何在 replyHandler 中获得异常?

采纳答案by Artem Bilan

Since you are using POJO for message listening you can't get deal with messages.

由于您使用 POJO 进行消息侦听,因此您无法处理消息。

Your Foundation#importExchangeshould accept message body (in your case byte[]) and return something appropriate to be for reply message body.

Foundation#importExchange应该接受消息正文(在您的情况下byte[])并返回适合回复消息正文的内容。

The replyHandlerjust has to implement MessageListener.

replyHandler只是要实现MessageListener

The Framework will do for you the correlation stuff.

框架将为您做相关的事情。

回答by Gary Russell

Or you can add .setContentType="text/plain"and the converter will be able to convert to String for you.

或者您可以添加.setContentType="text/plain",转换器将能够为您转换为字符串。