Дерево страниц
Skip to end of metadata
Go to start of metadata

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 2 Следующий »

Если из метода runAgent "самостоятельного агента" выброшено исключение (кроме InterruptedException), то КМА отсылает протокол сбоя в МА и завершает его исполнение.

Если исключение выброшено из агента, обрабатывающего JMS-сообщения, необходимо откатить транзакцию. Обязательно вызвать userTransaction.setRollbackOnly() иначе сообщение не будет доставлено повторно и нельзя пересоздавать Consumer, т.к. следующие сообщения в очереди будут доставляться другому Consumer после значительной паузы. Если агент по-расписанию - его надо сразу же перезапустить, чтобы он продолжил обработку следующих сообщений, параллельно отправляя протокол сбоя в МА.

Сообщение, при обработке которого произошел сбой, будет доставлено повторно произвольному КМА через некоторую паузу. Порядок доставки сообщений в таком сценарии нарушится. Определить, что сообщение доставлено повторно можно через св-во Message.getJMSRedelivered().

Сбой при обработке сообщения может быть обусловлен разными факторами

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

Временные факторы можно решить повторным перезапуском агента и повторной доставкой (redelivery) сообщения. Но в случае постоянных факторов redelivery и частый перезапуск агента может приводить к огромному потреблению вычислительных ресурсов в холостую.

Artemis решает задачу повторной доставки сообщения если настроить отложенную передоставку. По умолчанию, передоставка осуществляется моментально и тому же КМА, что в случае сбоя, обусловленного именно сообщением, не позволит обработать следующие сообщения достаточно длительный интервал времени. Очередь Artemis можно настроить так, что передоставка будет осуществляеться через таймаут, который геометрически растет после каждой неудачной доставки. Передоставка чаще всего происходит на тот же самый КМА, но может и на любой другой. После заданного числа повторов (по умолчанию 10), сообщение будет перемещено в очередь мертвых сообщений (DLQ). В сообщение при этом добавляются заголовки с именем JMS-Очереди (address в терминах Artemis) и именем подписки (queue в терминах Artemis). Имя подписки совпадает с идентификатором НЗ. Так что данных достаточно для перенаправления сообщения конкретной НЗ.


Детектируемые агентом сбои должны быть оформлены специальным unchecked исключением TemporaryUnavailabeException, выбрасываемым агентом. Данный эксепшен от агента сообщает КМА, что текущее сообщение требуется передоставить позже. Если агент "по расписанию", то КМА должен откатить транзакцию обработки последнего сообщения (setRollbackOnly и rollback) и заново запустить агент для обработки последующих сообщений. Сбойное сообщение МОМ доставит позже в соответствии со своими настройками.

  • Нет меток