2012-03-01 3 views
1

У нас есть производитель, который производит сообщение со скоростью быстрее, чем может потреблять cosumer. Мы используем Spring JMS-интеграцию в качестве стека технологий пользовательской стороны. В настоящее время мы используем режим AUTO_ACKNOWLEDGE.Повторная доставка сообщений и обработка ошибок в прослушивателях сообщений

В способе слушателя onMessage(), после получения мы планируем отправить задание на стороне клиента в очередь заданий и вернуться из метода onMessage(). Это означает, что если а) обработка завершилась неудачей или b) наш сервер снизился во время обработки, нам не удалось восстановить систему.

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

Другой вариант - использовать интерфейс SessionAwareMessageListener, предоставляемый Spring. Контракт использования этого интерфейса говорит о том, что если JMSException выбрасывается из onMessage, сообщение будет повторно установлено. Однако я не был полностью уверен, как использовать это для наших целей.

Пока я больше копаюсь в этом, любая помощь от вас, ребята, будет очень признательна.

ответ

0

Session известно сообщение имеет следующий OnMessage прототип:

onMessage(Message message, Session session) 

Invoke session.recover() для возврата судна сообщения. После session.recover() отправит все непризнанные сообщения обратно в пункт назначения jms.

Смежные вопросы