2014-02-26 53 views
4

我使用RabbitMQ彈簧集成來處理傳入的JSON消息Spring集成和AMQP:如何正常處理反序列化異常?

配置的相關部分看起來是這樣的:

<amqp:inbound-channel-adapter channel="incomingChannel" queue-names="..." 
     message-converter="jsonConverter" error-handler="errorHandler" 
     error-channel="errorChannel" /> 

我使用數據綁定傑克遜作爲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它簡單地是一個MessagePublishingErrorHandlererrorChannel處理。

到目前爲止這麼好。問題是,該消息仍然被AMQP客戶端拒絕,儘管我正在使用錯誤處理程序處理它。然後RabbitMQ一遍又一遍地重新傳送消息。即使配置死信隊列也沒有幫助。任何想法如何正確處理這種情況?

處理進一步下去(成功反序列化後)的異常處理得很好:AMQP消息已確認並且錯誤消息發送到errorChannel

任何想法?

庫版本:

  • Spring集成:3.0.1
  • Spring框架:4.0.2
  • 傑克遜數據綁定:2.3.1

回答

5

您可以在收聽設置defaultRequeueRejected=false容器。

該屬性當前未在通道適配器上公開,但您可以將此容器定義爲<bean... class="...SimpleMessageListenerContainer"/>,並使用listener-container屬性將其注入到適配器中。

或者,使用引發AmqpRejectAndDontRequeueException的自定義ErrorHandler

+0

太好了,謝謝你的回答! –

+1

我的錯誤,'requeue-rejected'設置在使用''時確實可用。我忘了我們前一段時間添加了它。 –