WebFlux / Reactive Spring RabbitmMq消息即使保存失败也会被确认

时间:2018-05-28 12:21:22

标签: spring-rabbitmq

我最近开始使用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())
            );
}

2 个答案:

答案 0 :(得分:0)

反应是非阻塞的;一旦侦听器线程返回容器,就会激活该消息。您需要以某种方式阻止侦听器线程(例如,使用Future<?>)并在cassandra操作完成时将其唤醒,如果成功则正常退出,或者在失败时抛出异常,以便重新传递消息。

答案 1 :(得分:0)

我通过向rabbitmq发送明确的确认/拒绝消息解决了我的问题。这导致我被迫写了更多的代码,但现在至少它起作用,我完全控制了发生了什么。