После того, как определенное количество сообщений обработано моим приемником, мне нужно остановить прослушиватель Rabbit и вызвать метод, после которого прослушиватель снова включается.
@RabbitListener(...)
public void sink(Message msg) {
processMsg();
if (condition) {
rabbitListenerEndpointRegistry.stop();
doTask();
rabbitListenerEndpointRegistry.start();
}
}
К сожалению, транзакция завершится неудачно, и сообщениевернусь в очередь, если я остановлю слушателя внутри метода приемника. Я ищу способ вызвать метод после завершения транзакции, и слушатель не удерживает никаких сообщений.
- Получите сообщение и обработайте сообщение
- Завершить транзакцию и выпустить сообщение <- <strong>Я не хочу получать новые сообщения после этой точки
- Если условие выполнено, остановите слушателя
- Выполнитедлительное задание
- Запустить слушатель
Я не могу перейти к ручному управлению транзакциями, потому что это потребует слишком много изменений в моем коде, и я не могуудерживайте любые сообщения, когда моя пользовательская задача выполняется, потому что это долго выполняемая задача, и я хочу, чтобы другие работники обрабатывали сообщения в течение этого времени.
setAfterReceivePostProcessors
и setAdviceChain
в заводской конфигурации Rabbit не будут работатьв моем случае, потому что в обоих случаях метод будет вызываться, когда слушатель удерживает сообщение.