Библиотеки Java RabbitMQ не предоставляют (AFAIK) ничего, что автоматически откладывало бы завершение процесса потребителя, пока некоторые сообщения еще обрабатываются. Поэтому вам придется сделать это самостоятельно.
Если ваше приложение может это терпеть, просто выключите его. Любое сообщение, которое не было подтверждено в этот момент, останется в очереди в брокере и будет повторно доставлено, когда потребитель вернется.
Если вы не можете с этим смириться, и вам абсолютно необходимо убедиться, что вся текущая обработка сообщений завершается, вам необходимо следовать советам, аналогичным приведенным в в этом ответе , и выполнить следующее при выключении обработчик:
- Установить флаг "все потоки должны выйти" в значение true
- Присоединиться к каждому из потоков в вашем пуле потоков
- Выход изящно
Это означает, что каждый из ваших потоков обработки сообщений (при условии, что у вас есть несколько потоков, обрабатывающих сообщения одновременно) должен следовать этой общей схеме:
- Извлечь сообщение из очереди и обработать его
- Подтвердить только что обработанное сообщение
- Если флаг «все потоки должны выйти» равен true, выйти из функции потока
- Промыть, повторить
Надеюсь, это поможет.