我使用 RabbitMQ 和 Spring Integration 来处理传入的JSON消息。
配置的相关部分如下所示:
<amqp:inbound-channel-adapter channel="incomingChannel" queue-names="..."
message-converter="jsonConverter" error-handler="errorHandler"
error-channel="errorChannel" />
我使用Jackson Databind作为JSON转换器。
有时,传入的JSON消息的语法不正确。这导致以下(正确)异常:
org.springframework.amqp.rabbit.listener.ListenerExecutionFailedException: Listener threw exception
Caused by: org.springframework.amqp.support.converter.MessageConversionException: Failed to convert Message content
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token...
该异常由errorHandler
处理,只有MessagePublishingErrorHandler
到errorChannel
。
到目前为止一切顺利。问题是,AMQP客户端仍然拒绝该消息,尽管我正在使用错误处理程序处理它。然后RabbitMQ一遍又一遍地重新传递消息。即使配置死信队列也无济于事。任何想法如何正确处理这种情况?
处理过程中的异常(成功反序列化后)处理得很好:AMQP消息已确认,错误消息已发送到errorChannel
。
有什么想法吗?
图书馆版本:
答案 0 :(得分:6)
您可以在侦听器容器上设置defaultRequeueRejected=false
。
该属性当前未在通道适配器上公开,但您可以将容器定义为<bean... class="...SimpleMessageListenerContainer"/>
并使用listener-container
属性将其注入适配器。
或者,使用引发ErrorHandler
的自定义AmqpRejectAndDontRequeueException
。