Spring Integration和AMQP:如何优雅地处理反序列化异常?

Phi*_*das 6 amqp spring-integration rabbitmq spring-rabbit spring-amqp

我使用RabbitMQSpring Integration来处理传入的JSON消息.

配置的相关部分如下所示:

<amqp:inbound-channel-adapter channel="incomingChannel" queue-names="..."
      message-converter="jsonConverter" error-handler="errorHandler"
      error-channel="errorChannel" />
Run Code Online (Sandbox Code Playgroud)

我正在使用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...
Run Code Online (Sandbox Code Playgroud)

然后由errorHandler例如MessagePublishingErrorHandlerto来处理异常errorChannel.

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

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

有任何想法吗?

图书馆版本:

  • Spring Integration:3.0.1
  • Spring Framework:4.0.2
  • Jackson Databind:2.3.1

Gar*_*ell 6

您可以defaultRequeueRejected=false在侦听器容器上设置.

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

或者,使用ErrorHandler抛出的自定义AmqpRejectAndDontRequeueException.