在我的接收器处理了特定数量的消息之后,我需要停止Rabbit侦听器并调用一个方法,之后再次启用该侦听器。
@RabbitListener(...)
public void sink(Message msg) {
processMsg();
if (condition) {
rabbitListenerEndpointRegistry.stop();
doTask();
rabbitListenerEndpointRegistry.start();
}
}
[不幸的是,如果我在接收器方法中停止侦听器,则事务将失败,并且消息将返回队列。我正在寻找一种在事务完成且侦听器未保存任何消息后调用方法的方法。
我无法进行手动交易管理,因为这将需要对代码进行太多更改,并且在执行自定义任务时无法保存任何消息,因为这是一项长期运行的任务,我希望其他工作人员能够处理在这段时间内的消息。
setAdviceChain
在我的情况下不起作用,因为在两种情况下,当侦听器保存消息时,都会调用该方法。而不是手动启动线程,您可以有一个新队列,可以在其中发布消息(例如启动/停止),并且在将指令消息放入启动或停止之类的新队列时,新侦听器可以停止原始侦听器。