我最近开始使用spring webflux和Rabbitmq以及cassandra反应库。我注意到的是,即使在cassandra中保存,某些元素也没有成功,这个消息得到了认可。我在保存期间抛出了异常,但即使消息是从队列中删除的。我想知道我应该做些什么让Rabbitmq知道这条消息应该被视为失败(我想拒绝消息将其发送到死信队列)
@RabbitListener(queues = Constants.SOME_QUEUE, returnExceptions = "true")
public void receiveMessage(final List<ItemList> itemList) {
log.info("Received message from queue: {}", Constants.SOME_QUEUE);
itemService.saveAll(itemList)
.subscribe(
item-> log.info("Saving item with {}", item.getId()),
error -> {
log.error("Error during saving item", error);
throw new AmqpRejectAndDontRequeueException(error.getMessage());
},
() -> log.info(Constants.SOME_QUEUE+
" queue - {} items saved", itemList.size())
);
}
答案 0 :(得分:0)
反应是非阻塞的;一旦侦听器线程返回容器,就会激活该消息。您需要以某种方式阻止侦听器线程(例如,使用Future<?>
)并在cassandra操作完成时将其唤醒,如果成功则正常退出,或者在失败时抛出异常,以便重新传递消息。
答案 1 :(得分:0)
我通过向rabbitmq发送明确的确认/拒绝消息解决了我的问题。这导致我被迫写了更多的代码,但现在至少它起作用,我完全控制了发生了什么。