Spring RabbitListener在发送消息后调用方法

问题描述 投票:0回答:1

在我的接收器处理了特定数量的消息之后,我需要停止Rabbit侦听器并调用一个方法,之后再次启用该侦听器。

@RabbitListener(...)
public void sink(Message msg) {
    processMsg();

    if (condition) {
        rabbitListenerEndpointRegistry.stop();
        doTask();
        rabbitListenerEndpointRegistry.start();
    }
}

[不幸的是,如果我在接收器方法中停止侦听器,则事务将失败,并且消息将返回队列。我正在寻找一种在事务完成且侦听器未保存任何消息后调用方法的方法。

我无法进行手动交易管理,因为这将需要对代码进行太多更改,并且在执行自定义任务时无法保存任何消息,因为这是一项长期运行的任务,我希望其他工作人员能够处理在这段时间内的消息。

setAfterReceivePostProcessors和setAdviceChain在我的情况下不起作用,因为在两种情况下,当侦听器保存消息时,都会调用该方法。
java spring rabbitmq spring-amqp spring-rabbit
1个回答
0
投票
如果条件满足,您可以启动新线程,这将停止侦听器并执行某些任务并启动侦听器。尽管不能保证新线程会在原始侦听器消耗任何新消息之前停止侦听器,但是它可以正常工作。

而不是手动启动线程,您可以有一个新队列,可以在其中发布消息(例如启动/停止),并且在将指令消息放入启动或停止之类的新队列时,新侦听器可以停止原始侦听器。

© www.soinside.com 2019 - 2024. All rights reserved.