我们的配置是:1.n个具有共享数据库的消息接收者。邮件只应处理一次。
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "message-queue", durable = "true"),
exchange = @Exchange(value = TOPIC_EXCHANGE, type = "topic", durable = "true"),
key = MESSAGE_QUEUE1_RK)
)
public void receiveMessage(CustomMessage message) throws InterruptedException {
System.out.println("I have been received = " + message);
}
我们希望保证消息将被处理一次,我们有一个消息存储与id的消息已经处理。在receiveMessage之前可以挂起这张支票吗?我们试图使用带有MessagePostProcessor的rabbitTemplate,但似乎不起作用。
对怎么做有什么建议吗?我们尝试了一个MethodInterceptor,这是可行的,但很难看。谢谢
找到了解决方案--由于Gary创建了一个实现MessagePostProcessorInjector
的SmartLifecycle
,并且在启动时,我检查了每个容器,如果它是一个AbstractMessageListenerContainer
,添加一个customer MessagePostProccesser
和一个自定义ErrorHandler
来查找某些类型的异常并删除它们(其他转发到defaultErrorHandler),因为我们使用DLQ时,我发现抛出异常或将其设置为null并不能真正工作。
我将在MPP之后发出一个忽略空消息的拉请求。
发布于 2017-09-29 07:14:22
当消息重复时,从ImmediateAcknowledgeAmqpException引发从DuplicateChecking MPP的postProcessMessage()扩展的异常也不会将消息传递给兔子侦听器。
https://stackoverflow.com/questions/46314742
复制相似问题