6

我使用RabbitMQSpring 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...

然后由errorHandlerwhich 简单地处理异常MessagePublishingErrorHandlerto errorChannel

到现在为止还挺好。问题是,该消息仍然被 AMQP 客户端拒绝,尽管我正在使用错误处理程序处理它。RabbitMQ 然后一遍又一遍地重新传递消息。即使配置死信队列也无济于事。任何想法如何正确处理这种情况?

处理过程中的异常(成功反序列化后)处理得很好:AMQP 消息确认和错误消息发送到errorChannel.

有任何想法吗?

库版本:

  • 弹簧集成:3.0.1
  • Spring框架:4.0.2
  • 杰克逊数据绑定:2.3.1
4

1 回答 1

6

您可以defaultRequeueRejected=false在侦听器容器上进行设置。

该属性当前未在通道适配器上公开,但您可以将容器定义为 a并使用该属性<bean... class="...SimpleMessageListenerContainer"/>将其注入适配器。listener-container

或者,使用ErrorHandler引发AmqpRejectAndDontRequeueException.

于 2014-02-26T16:15:34.710 回答