Mule ESB — Блок стратегии перехвата исключений и полезная нагрузка

В документации Mule указано, что стратегия catch-exception аналогична блоку catch java. Но, к сожалению, полезная нагрузка потребляется (сообщение потребляется); из блока catch полезная нагрузка теряется (в отличие от метода java, где вы можете получить доступ к входным параметрам метода из блока catch/finally).

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

Предположим, что если есть поток с 10 обработчиками сообщений, становится утомительно идентифицировать обработчик сообщений, вызвавший ошибку.

Я вижу 2 обходных пути в отношении полезной нагрузки:
1) После входящей конечной точки помещать полезную нагрузку в переменную потока перед каждым обработчиком сообщений (еще один недостаток — что происходит с входящими свойствами и вложениями?)
2) Используйте стратегию исключений отката с нулевыми попытками (транзакция будет откатана), и исходное входное сообщение может быть доступно. (недостаток: трудно понять, почему произошла ошибка и на каком процессоре сообщений - пример: у меня может быть 5 или 6 процессоров БД)

Причина, по которой это становится важным, заключается в том, что поддержка приложения ESB в производственной среде становится проще.

Например, из блока catch, если мы можем передать данные полезной нагрузки и исключений (связанные с одним UID), вы можете запустить инструмент мониторинга журнала, отправить его на панель мониторинга в реальном времени для целей мониторинга/создания предупреждений. Тот же подход можно единообразно применить ко всем приложениям/потокам, Java-компонентам и т. д.

MMC слаба в этой области — например, если вы хотите подавить оповещения от пакетного задания после 5 повторений, MMC не сможет этого сделать.

Мои вопросы: 1) Есть ли какая-либо причина, по которой полезная нагрузка становится недоступной? Возможный обходной путь — отправить (последние известные данные) в другую переменную как часть сообщения с именем originalPayload или originalInboundProperties? 2) Любой другой прямой способ передачи исключения и полезной нагрузки в приложение (вместо обходных путей)?

Анант Кришнан (WHISHWORKS.com)


person Ananth Krishnan    schedule 15.04.2015    source источник
comment
Что вы подразумеваете под потребляемой полезной нагрузкой? Сообщение должно содержать полезные данные на момент возникновения исключения. Если это не так, возможно, вы столкнулись с ошибкой. С чисто проектной точки зрения я считаю блокировку catch в потоках катастрофой: это императивное программирование в XML, а не MOM. Работа с ошибками должна выполняться более ориентированным на сообщения способом IMNSHO (например, с обычной маршрутизацией).   -  person David Dossot    schedule 16.04.2015
comment
Привет, Дэвид, если вы используете блокировку стратегии перехвата-исключения, полезная нагрузка, которая обогащается/обрабатывается в основном потоке, теряется. Это то, что в документации Mule указано как потребляемое. Единственный способ, который я нашел, - это использовать собственную стратегию исключений, которая дает дескриптор последней известной полезной нагрузки для целей аудита.   -  person Ananth Krishnan    schedule 16.04.2015
comment
Моя цель: 1) Во время исключения записывать сводное сообщение трассировки стека исключений в файл журнала. 2) Записывать последнюю известную обогащенную/обновленную полезную нагрузку в файл журнала. Убедитесь, что обе записи журнала имеют поле с именем transaction_id с уникальным значением. 3) Верните пользовательское исключение в родительский поток. 4) Используйте данные журнала, перетащите их в инструмент, такой как Splunk/SumoLogic, для анализа исключений или для предупреждений о данных. Таким образом, стратегия пользовательского исключения очень близка к тому, что я хочу здесь.   -  person Ananth Krishnan    schedule 16.04.2015
comment
Если я использую стратегию перехвата-исключения, она не работает. Он также регистрирует исключение (когда элемент управления преобразуется из основного потока в блок стратегии перехвата исключения) — это необходимо подавить, поскольку мне нужно сводное сообщение об исключении вместе с дополнительными полями (например, transaction_id), чтобы я мог запросить данные журнала, используя инструменты анализа.   -  person Ananth Krishnan    schedule 16.04.2015
comment
Я думаю, что под потреблением они подразумевают, что если это поток, то поток был прочитан. Каков тип полезной нагрузки сообщения в стратегии перехвата исключения?   -  person David Dossot    schedule 16.04.2015
comment
Привет, Дэвид, полезная нагрузка может быть запросом JSON и объектами значений Java. Какой бы ни была полезная нагрузка, когда она переходит между обработчиками сообщений и в случае ошибки, мне нужна последняя известная полезная нагрузка, чтобы она была полезна для аудита и поддержки производства. В противном случае создание единого механизма аудита/предупреждения вокруг этого является кошмаром.   -  person Ananth Krishnan    schedule 16.04.2015
comment
Я так понимаю, я спрашивал: что вы сейчас наблюдаете? Какую полезную нагрузку вы получаете в стратегии перехвата исключения, когда в потоке возникает исключение?   -  person David Dossot    schedule 16.04.2015
comment
Привет, Дэвид, если я использую стратегию перехвата-исключения, полезной нагрузкой будет NullPayload. Если я использую пользовательскую стратегию исключения (ссылаясь на класс java, который расширяет CatchMessagingExceptionStrategy), я могу получить полезную нагрузку и исключение (вместе с основной причиной). Поэтому я склонен использовать собственную стратегию исключений. Сложность в том, что если я использую пользовательскую стратегию исключений, стратегия исключений должна возвращать пользовательское исключение для вызывающего потока, поэтому мне интересно, как это сделать.   -  person Ananth Krishnan    schedule 17.04.2015
comment
Спасибо за всю точность!   -  person David Dossot    schedule 17.04.2015