I use RabbitMQ and Spring Integration to handle incoming JSON messages.
The relevant part of the configuration looks something like this:
<amqp:inbound-channel-adapter channel="incomingChannel" queue-names="..."
message-converter="jsonConverter" error-handler="errorHandler"
error-channel="errorChannel" />
I'm using Jackson Databind as the JSON converter.
Sometimes the incoming JSON messages have an incorrect syntax. This results in the following (correct) exception:
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...
The exception is then handled by the errorHandler
which simply is a MessagePublishingErrorHandler
to errorChannel
.
So far so good. The problem is, that the message is still being rejected by the AMQP client, although I am handling it with an error handler. RabbitMQ then redelivers the message over and over. Even configuring a dead letter queue did not help. Any ideas how to handle this scenario correctly?
Exceptions further down the processing (after successful deserialization) are handled just fine: AMQP message acknowledged and error message sent to errorChannel
.
Any ideas?
Library versions:
You can set defaultRequeueRejected=false
on the listener container.
The attribute is not currently exposed on the channel adapter, but you can define the container as a <bean... class="...SimpleMessageListenerContainer"/>
and inject it into adapter using the listener-container
attribute.
Or, use a custom ErrorHandler
that throws an AmqpRejectAndDontRequeueException
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With