处理Spring RabbitListener中JSON负载的验证错误



让我们对RabbitMQ队列采用以下使用者方法。从队列接收的有效负载是JSON格式的,所以我注册了一个返回Jackson2JsonMessageConverter的bean。这基本上很好用。

现在,我想添加对QueueResponse对象的验证,类似于在@RestController中使用Jackson时,例如,如果JSON字段不存在或包含无效值。在这种情况下,我希望代码执行catch块,即抛出AmqpRejectAndDontRequeueException

因此,我添加了@Payload @Valid,如文档中所述。但是我不知道在validationErrorHandler方法中该做什么。我不明白文档中的退货声明。我需要在那里做什么才能到达catch块?

@RabbitListener(queues = QUEUE_NAME, messageConverter = "jackson2MessageConverter", errorHandler="validationErrorHandler")
public void consume(@Payload @Valid QueueResponse queueResponse) {
try {
processMessage(queueResponse);
} catch (Exception e) {
throw new AmqpRejectAndDontRequeueException(e.getMessage());
}
}
@Bean
public MessageConverter jackson2MessageConverter() {
return new Jackson2JsonMessageConverter(objectMapper);
}
// Not sure what to do here...
@Bean
public RabbitListenerErrorHandler validationErrorHandler() {
return (m, e) -> {
...
};
}

如果错误处理程序正常退出,消息将被确认(丢弃(。

如果错误处理程序引发异常,则根据异常类型、容器属性和队列参数,消息将被重新排队(并重新传递(或丢弃(可选地发送到死信队列(。

基本上,我在RabbitListenerErrorHandler中所做的是:

  • 通过查看x-death标头中的count属性来检查我重新排队消息的次数
  • 则决定是否通过抛出CCD_ 12来重新排队消息。在最后一种情况下,不只是丢弃消息,而是将其发送到停车场交换机(绑定到没有消费者的队列,在我的情况下,这些队列是外部监控的(,并附带附加信息(例如上次故障的堆栈跟踪(

最新更新