Вопрос в том, когда отправлять брокеру кадры ACK
или NACK
. Спецификация STOMP гласит:
ACK используется для подтверждения приема сообщения из подписки с использованием подтверждения клиента или отдельного клиента. Любые сообщения, полученные по такой подписке, не будут считаться использованными до тех пор, пока сообщение не будет подтверждено с помощью ACK.
«Потребление» будет означать для меня «после получения и обработки». Поэтому я могу представить себе два сценария ios.
Сценарий A после получения сообщения:
function on_message(message)
message.ack()
heavy_processing(message)
или Сценарий B после обработки сообщения:
function on_message(message)
heavy_processing(message)
message.ack()
Как я понял, NACK
означает сообщить брокеру, что этот слушатель, например, временно помечен как неактивный. И, как я понял, NACK
не означает пометить сообщение как необработанное из-за исключения.
Таким образом, следующий псевдокод будет правильно обрабатывать ACK
, NACK
и исключения из моего понимания:
function on_message(message)
if online(): # checks resources etc
message.ack()
else:
message.nack()
return
try:
heavy_processing(message) # processing takes 5-10 minutes
catch Exception: # could be problem with this Listener or malformed message
message.put_to_dlq() # putting to dlq is a "manual" process
return
К вашему сведению, система, о которой я говорю, встроена в Python 3.7.x с модулем Stomp.py и ActiveMQ.