Как предотвратить дублирование доставки в HornetQ

Мы изучаем HornetQ уже несколько недель.

В нашем бизнесе много дельта-сообщений, и (к сожалению...) они не версионны (а так как это международный стандарт, они не будут версионированы). Это означает, что отправка одного и того же сообщения дважды, очевидно, осуждается. Тем не менее, стандарт признает, что этого нельзя избежать, и указывает отправителю пометить сообщение как возможный дубликат в этом случае.

Я просмотрел документацию HornetQ, и в ней много говорится о том, как избежать дублирования полученных сервером, но я не смог найти ничего о том, как избежать создания дубликатов.

Чтобы было понятнее, предположим следующую ситуацию:

  • 1 главный сервер
  • 1 потребитель

В номинальном сценарии потребитель берет сообщение из очереди, отправляет его третьей стороне и, получив подтверждение, передает сообщение на сервер, чтобы оно было удалено из очереди.

Теперь слабым местом здесь является часть ack. Возможно, третья сторона получила и обработала сообщение, но (по какой-то причине) подтверждение не удалось, и сообщение не удалено из очереди.

Я понимаю, что штаб-квартира не может знать, что сообщение было доставлено полностью, однако я ожидаю, что она будет знать, что доставка была уже предпринята и что существует явная вероятность того, что сообщение будет доставлено. быть дубликатом для третьей стороны.

Есть ли способ сообщить Потребителю об этом статусе возможно, уже доставлено, чтобы он мог соответствующим образом пометить сообщение?


person Matthieu M.    schedule 05.04.2012    source источник


Ответы (1)


Один из способов сделать это — отправить NAC (или вернуть HornetQ ошибку, если сообщение не было подтверждено третьей стороной в указанный период времени). Если очередь в HornetQ настроена с максимальным числом попыток доставки > 0, это приведет к повторной доставке сообщения.

В этот момент заголовок сообщения может быть проанализирован клиентом HornetQ для параметра «JMSXDeliveryCount» — это укажет, отправляется ли сообщение в первый раз или оно доставляется повторно.

Указанная здесь методология предполагает, что клиент HornetQ использует API JMS для приема сообщений. Я уверен, что в основном API также будет что-то подобное.

person Gur Kamal Singh Badal    schedule 05.04.2012
comment
JMSXDeliveryCount отлично! Я нашел эквивалент в ClientMessage API: getDeliveryCount. - person Matthieu M.; 05.04.2012