Принципы работы повторной доставки сообщений и обработки ошибок
Настройка обработки ошибок и повторной доставки сообщений (Redelivery policy):
Параметр | Описание | Единица измерения |
---|---|---|
Maximum Redeliveries |
Устанавливает максимальное количество повторных доставок: |
Количество попыток |
Redelivery Delay |
Устанавливает величину промежутка времени после первой неудачной попытки доставки до следующей попытки повторной доставки. |
Миллисекунды |
Async Delayed Redelivery |
Разрешает асинхронную отложенную повторную доставку. Компонент потребителя должен поддерживать асинхронную маршрутизацию (например, seda). |
Нет |
Back Off Multiplier |
Устанавливает множитель геометрической прогрессии для увеличения промежутков времени между попытками доставки. |
Коэффициент |
Use Exponential Back Off |
Включает использование множителя геометрической прогрессии для увеличения промежутков времени между попытками доставки. По умолчанию выключен — промежуток времени между попытками доставки всегда равен значению параметра "Redelivery Delay". |
Нет |
Collision Avoidance Factor |
Устанавливает коэффициент для предотвращения коллизий при повторных попытках доставки. |
Коэффициент |
Use Collision Avoidance |
Включает функцию предотвращения коллизий при повторных попытках доставки. |
Нет |
Maximum Redelivery Delay |
Устанавливает максимальную величину промежутка времени между повторными доставками. Актуально для ограничения верхнего предела в случае использования множителя геометрической прогрессии для последующих промежутков времени. |
Миллисекунды |
Retries Exhausted Log Level |
Устанавливает уровень логирования для сообщения о неудачной доставке после исчерпания максимального количества повторных попыток. |
Уровень логирования |
Retry Attempted Log Level |
Устанавливает уровень логирования для каждой неудачной попытки доставки до исчерпания максимального количества повторных попыток. |
Уровень логирования |
Retry Attempted Log Interval |
Устанавливает интервал времени между записями о неудачных попытках доставки в журнале. Для значения n в журнал будет выводиться каждое n-ое сообщение о неудачной попытке доставки. Например, для значения 4 будет выводиться сообщение о каждой четвёртой попытке доставки. |
Количество попыток |
Log Retry Attempted |
Включает логирование каждой неудачной попытки доставки до исчерпания максимального количества повторных попыток. По умолчанию включено, но сообщения будут выводиться в журнал только при настройке уровня логирования на "DEBUG". |
Нет |
Log Stack Trace |
Включает логирование трассировки стека при неудачной доставке после исчерпания максимального количества повторных попыток. |
Нет |
Log Retry Stack Trace |
Включает логирование трассировки стека при каждой неудачной попытке доставки до исчерпания максимального количества повторных попыток. |
Нет |
Log Handled |
Включает логирование обработанных исключений. |
Нет |
Log New Exception |
Включает логирование новых исключений, выбрасываемых при обработке предыдущих исключений. |
Нет |
Log Continued |
Включает логирование продолжения обработки после исключения, помеченного для продолжения работы маршрута (continued=true). |
Нет |
Log Exhausted |
Включает логирование сообщений о неудачной доставке после исчерпания максимального количества повторных попыток. |
Нет |
Log Exhausted Message History |
Включает логирование истории сообщений при исчерпании всех попыток повторной доставки. |
Нет |
Log Exhausted Message Body |
Включает логирование тела сообщения, включая историю сообщения. Требует включения "Log Exhausted Message History". |
Нет |
Disable Redelivery |
Отключает механизм повторных попыток доставки сообщения. Аналогично установке максимального количества повторных попыток равным 0. |
Нет |
Delay Pattern |
Устанавливает шаблон промежутков времени между попытками доставки. Например, для шаблона "1:1000;5:5000;15:2000" попытки повторной доставки с 1 по 4 будут происходить через 1000 мс каждое, с 5 по 14 — через 5000 мс каждое, с 15 и далее — через 2000 мс каждое. |
Миллисекунды |
Allow Redelivery While Stopping |
Разрешает повторные попытки доставки при остановке/завершении работы маршрута, использующего обработку ошибок. По умолчанию маршрут не останавливается до окончания попыток или таймаута. |
Нет |
Exchange Formatter Ref |
Устанавливает ссылку на экземпляр org.apache.camel.spi.ExchangeFormatter для генерации сообщений журнала из объекта обмена (Exchange). |
Ссылка |
Error Handler |
Определяет тип обработки ошибок: DefaultErrorHandler — Обработчик ошибок по умолчанию. Возвращает необработанное исключение вызывающей стороне (handled=false) и выводит сообщение об ошибке в журнал. DeadLetterChannel — Помечает сообщение как обработанное и передаёт дальнейшую обработку сообщения в конечную точку, заданную в параметре "Dead Letter URI". NoErrorHandler — Отключение обработки ошибок, необработанное исключение возвращается вызывающей стороне. |
Нет |
Dead Letter URI |
Конечная точка для дальнейшей обработки сообщений в DeadLetterChannel. |
URI |
Для понимания принципов работы повторной доставки сообщений и обработки ошибок рассмотрим несколько сценариев.
Настройка системы
-
Создаем профиль отправляющей системы
file
-
Добавляем к профилю входной файловый коннектор
-
В разделе general установите параметр
Directory Name
- error-test -
В разделе entaxy установите параметр
Default target system
- database -
В разделе scheduler установите параметр
Delay
- 60000 (1 минута)Параметры:
Directory Name
- Название директории входного файлового коннектора в файловой системе;
Default target system
- Название принимающей системы;
Delay
- Время ожидания между попытками отправки данных в принимающую систему (в миллисекундах).
-
-
-
Создаем профиль принимающей системы
database
-
Добавляем к профилю выходной JDBC-коннектор
-
Добавляем в
pre-output
коннектора запрос к несуществующей таблице, чтобы вызвать ошибку<?xml version="1.0" encoding="UTF-8"?> <entaxy:object-route xmlns="http://camel.apache.org/schema/blueprint" xmlns:blueprint="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:entaxy="http://www.entaxy.ru/schemas/1.0" xmlns:m="http://www.entaxy.ru/schemas/entaxy-mediators/1.0"> <setProperty name="NTX_connector_preOutput"> <constant>true</constant> </setProperty> <!-- query start--> <setBody> <simple>SELECT * FROM non_existent_table</simple> </setBody> <log loggingLevel="INFO" message="Query: ${body}"/> <!-- query end--> </entaxy:object-route>
На данный момент параметр
Error Handler
в разделеredelivery policy
в созданных коннекторах и профилях имеет значения по умолчанию:DefaultErrorHandler
без повторной доставки сообщений.DefaultErrorHandler — стандартный обработчик ошибок, который применяется к маршрутам для обработки исключений. Он обеспечивает базовые механизмы для повторной доставки сообщений, управления ошибками и их логирования. При добавлении файла
test.file
в директорию входного файлового коннектора (error-test
), система будет генерировать ошибку каждую минуту:11:44:36.228 INFO [Thread-245] Query: SELECT * FROM non_existent_table 11:44:36.237 ERROR [Thread-245] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-1 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-6-1). Exhausted after delivery attempt: 1 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] Message History (complete message history is disabled) --------------------------------------------------------------------------------------------------------------------------------------- RouteId ProcessorId Processor Elapsed (ms) [database.jdbc-conn] [database.jdbc-conn] [from[direct-vm://database.jdbc-connector-out.main-entry-point] ] [ 9] ... [database.jdbc-conn] [to68 ] [entaxy-db-cache:database.jdbc-connector-out.main ] [ 0] Stacktrace --------------------------------------------------------------------------------------------------------------------------------------- org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] ... далее stacktrace ошибки
Причина возникновения ошибки:
Ошибка возникает в выходном JDBC-коннекторе и отображается в журнал. При текущих настройках попытка обращения к БД выполняется только один раз. После этого входной коннектор получает ошибку о неуспешной обработке файла и через заданный интервал (scheduler/Delay=60000
) снова считывает файл и пытается передать его в выходной коннектор системы назначения.
-
-
Сценарий 1. Настройка повторных доставок на уровне коннектора
-
Открываем свойства выходного JDBC-коннектора и переходим в раздел
redelivery policy
:-
Меняем значение параметра
Maximum Redeliveries
с0
на4
, чтобы установить 4 попытки для успешного обращения к БД; -
Меняем значение параметра
Redelivery Delay
с1000
на10000
, чтобы между попытками проходило 10 секунд, что упрощает отслеживание по журналу; -
Меняем значение параметра
Retry Attempted Log Level
сDEBUG
наWARN
, чтобы предупреждения о повторных попытках попадали в журнал; -
Отключаем значение параметра
Log Stack Trace
, чтобы сообщение об ошибке не содержало stacktrace.Параметры:
Maximum Redeliveries - Устанавливает максимальное количество попыток повторной доставки, если первоначальная попытка завершилась неудачей;
Redelivery Delay - Определяет время задержки между попытками повторной доставки, если предыдущая попытка не удалась;
Retry Attempted Log Level - Устанавливает уровень логирования для записей, касающихся попыток повторной доставки;
Log Stack Trace - Определяет, будет ли включен stacktrace (трассировка стека) в сообщениях об ошибках в журнале.После внесения этих изменений в журнале будут отображаться предупреждения об очередной попытке доставки каждые 10 секунд. После исчерпания количества попыток вы получите знакомую ошибку, но без stacktrace.
11:55:56.881 INFO [Thread-311] Query: SELECT * FROM non_existent_table 11:55:56.881 WARN [Thread-311] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-11 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-9-1). On delivery attempt: 0 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 11:56:06.884 WARN [Thread-311] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-11 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-9-1). On delivery attempt: 1 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 11:56:16.886 WARN [Thread-311] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-11 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-9-1). On delivery attempt: 2 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 11:56:26.893 WARN [Thread-311] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-11 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-9-1). On delivery attempt: 3 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 11:56:36.896 WARN [Thread-311] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-11 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-9-1). On delivery attempt: 4 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 11:56:36.898 ERROR [Thread-311] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-11 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-9-1). Exhausted after delivery attempt: 5 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] Message History (complete message history is disabled) --------------------------------------------------------------------------------------------------------------------------------------- RouteId ProcessorId Processor Elapsed (ms) [database.jdbc-conn] [database.jdbc-conn] [from[direct-vm://database.jdbc-connector-out.main-entry-point] ] [ 40018] ... [database.jdbc-conn] [to98 ] [entaxy-db-cache:database.jdbc-connector-out.main ] [ 0]
В истории видим, что теперь время выполнения маршрута для наших четырёх попыток заняло 40018 мс вместо 9 мс из предыдущего примера.
Если требуется логировать не все попытки, а только каждую пятую или десятую, то необходимо поменять параметр "Retry Attempted Log Interval" с 1 на 5 или 10 соответственно.
До предупреждений о неуспешных попытках мы видим информационное сообщение с телом запроса:
(11:55:56.881 INFO [Thread-311] Query: SELECT * FROM non_existent_table) и это сообщение выводится только один раз, таким образом видно, что попытки повторной доставки происходят в рамках выходного коннектора исключительно на шаге обращения к БД и не затрагивают предыдущий шаг с выводом запроса в журнал.
Иногда может возникнуть необходимость повторного выполнения ряда шагов. Например, если очередная попытка обращения к БД может потерять актуальность и необходимо формировать актуальный запрос при каждой попытке. В этом случае можно отменить обработку ошибок на уровне коннектора, и она будет перехвачена профилем, которому этот коннектор принадлежит.
-
Сценарий 2. Отмена обработки ошибок на уровне коннектора
Открываем свойства выходного коннектора и переходим в раздел redelivery policy
:
Меняем значение параметра Error Handler с DefaultErrorHandler
на NoErrorHandler
NoErrorHandler — это специальный обработчик ошибок, который отключает обработку ошибок для маршрута.
Когда используется NoErrorHandler , любые исключения или ошибки, возникшие в процессе обработки сообщения, не обрабатываются и не выполняется повторная доставка сообщений.
|
В журнале через каждую минуту будет появляться ошибка, но уже обработанная в профиле системы с выходным JDBC-коннектором. Это видно по истории сообщений:
12:00:57.001 ERROR [Thread-336] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-14 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-5-28). Exhausted after delivery attempt: 1 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена
Table "NON_EXISTENT_TABLE" not found; SQL statement:
SELECT * FROM non_existent_table [42102-199]
Message History (complete message history is disabled)
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor Elapsed (ms)
[profile-database-o] [profile-database-o] [from[direct-vm://profile-database-out-flow] ] [ 2]
...
[profile-database-o] [toD24 ] [direct-vm:${headers.NTX_target_connector}-entry-point ] [ 0]
Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена
Table "NON_EXISTENT_TABLE" not found; SQL statement:
SELECT * FROM non_existent_table [42102-199] ... далее stacktrace ошибки
Теперь для настроек повторной доставки необходимо изменять параметры раздела redelivery policy
в профиле выходного коннектора.
Или отключить там обработку ошибок, чтобы передать обработку ошибки ближе к источнику сообщения: в маршрут по умолчанию, в профиль входного коннектора или в сам входной коннектор.
Сценарий 3. Настройка повторных доставок на уровне профиля
Открываем свойства выходного профиля database
и переходим в раздел redelivery policy
:
-
Меняем значение параметра Maximum Redeliveries с 0 на 4, чтобы установить 4 попытки для успешного обращения к БД;
-
Меняем значение параметра Redelivery Delay с 1000 на 10000, чтобы между попытками проходило 10 секунд, что упрощает отслеживание по журналу;
-
Меняем значение параметра Retry Attempted Log Level с DEBUG на WARN, чтобы предупреждения о повторных попытка попадали в журнал;
-
Отключаем значение параметра Log Stack Trace, чтобы сообщение об ошибке не содержало в себе stacktrace.
Ожидаемо через каждые 10 секунд получаем в журнале записи о неудачной попытке обращения к БД и итоговую ошибку с историей сообщения
12:05:37.234 INFO [Thread-363] Query: SELECT * FROM non_existent_table 12:05:37.235 WARN [Thread-363] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-18 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-11-4). On delivery attempt: 0 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 12:05:47.236 INFO [Thread-363] Query: SELECT * FROM non_existent_table 12:05:47.237 WARN [Thread-363] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-18 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-11-4). On delivery attempt: 1 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 12:05:57.239 INFO [Thread-363] Query: SELECT * FROM non_existent_table 12:05:57.240 WARN [Thread-363] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-18 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-11-4). On delivery attempt: 2 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 12:06:07.241 INFO [Thread-363] Query: SELECT * FROM non_existent_table 12:06:07.243 WARN [Thread-363] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-18 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-11-4). On delivery attempt: 3 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 12:06:17.246 INFO [Thread-363] Query: SELECT * FROM non_existent_table 12:06:17.247 WARN [Thread-363] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-18 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-11-4). On delivery attempt: 4 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] Message History (complete message history is disabled) --------------------------------------------------------------------------------------------------------------------------------------- RouteId ProcessorId Processor Elapsed (ms) [profile-database-o] [profile-database-o] [from[direct-vm://profile-database-out-flow] ] [ 40014] ... [profile-database-o] [toD28 ] [direct-vm:${headers.NTX_target_connector}-entry-point ] [ 0]
Информационное сообщение с телом запроса теперь выводится при каждой попытке, а значит происходит повторный вызов выходного коннектора целиком.
Сценарий 4. Настройка обработки ошибок с использованием Dead Letter Channel
Теперь вновь открываем свойства выходного профиля database
и переходим в раздел redelivery policy.
Меняем значение параметра Error Handler с DefaultErrorHandler
на DeadLetterChannel
.
DeadLetterChannel - это механизм обработки ошибок предназначенный для управления сообщениями, которые не удалось успешно обработать после нескольких попыток повторной доставки. Эти сообщения перенаправляются на указанный Dead Letter URI (camel endpoint). |
Через каждые 10 секунд получаем в журнале записи о неудачной попытке обращения к БД и:
12:12:53.301 INFO [Thread-388] Query: SELECT * FROM non_existent_table
12:12:53.302 WARN [Thread-388] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-21 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-12-2). On delivery attempt: 0 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена
Table "NON_EXISTENT_TABLE" not found; SQL statement:
SELECT * FROM non_existent_table [42102-199]
12:13:03.308 INFO [Thread-388] Query: SELECT * FROM non_existent_table
12:13:03.311 WARN [Thread-388] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-21 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-12-2). On delivery attempt: 1 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена
Table "NON_EXISTENT_TABLE" not found; SQL statement:
SELECT * FROM non_existent_table [42102-199]
12:13:13.324 INFO [Thread-388] Query: SELECT * FROM non_existent_table
12:13:13.325 WARN [Thread-388] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-21 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-12-2). On delivery attempt: 2 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена
Table "NON_EXISTENT_TABLE" not found; SQL statement:
SELECT * FROM non_existent_table [42102-199]
12:13:23.334 INFO [Thread-388] Query: SELECT * FROM non_existent_table
12:13:23.335 WARN [Thread-388] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-21 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-12-2). On delivery attempt: 3 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена
Table "NON_EXISTENT_TABLE" not found; SQL statement:
SELECT * FROM non_existent_table [42102-199]
12:13:33.341 INFO [Thread-388] Query: SELECT * FROM non_existent_table
12:13:33.342 WARN [Thread-388] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723104703542-2-21 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723104703542-12-2). On delivery attempt: 4 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена
Table "NON_EXISTENT_TABLE" not found; SQL statement:
SELECT * FROM non_existent_table [42102-199]
12:13:33.344 INFO [Thread-388] Exchange[ExchangePattern: InOnly, BodyType: String, Body: SELECT * FROM non_existent_table]
Вместо итоговой ошибки выводится информационное сообщение об объекте Exchange, включая тело сообщения. За вывод этого сообщение отвечает параметр Dead Letter URI, который по умолчанию содержит значение "log:myLog". Вы можете изменить его на любой другой Camel endpoint (например, вызов другого маршрута, запись в очередь и т.д.) Если ни одна из попыток повторной доставки не завершается успешно, сообщение будет отправлено в Dead Letter URI, и будет считаться обработанным. В журнале будет видно, что ежеминутные попытки обработки файла прекратились.
Сценарий 5. Настройка обработки ошибок для web-сервисов
-
Создаём профиль системы
rest
-
Переходим в раздел Безопасность → jaas → karaf → modules → karaf-properties и для пользователя entaxy выбираем Associated Profile -
rest
-
Переходим в раздел Ресурсы → schemas и загружаем файл c описанием rest-сервиса (например, openapi_pets.json)
-
Переходим в раздел Сервисы и добавляем Protected REST сервис
mypet
; -
Выбираем в разделе "main" в поле OpenApi schema файл с описанием сервиса из ресурсов;
-
Выбираем в разделе security в поле Authorization realm значение
karaf
; -
Нажимаем кнопку
Add
для создания сервиса; -
Переходим к профилю
rest
:-
Добавляем входной коннектор mypet (автоматически созданный коннектор при добавлении защищенного REST сервиса);
-
Устанавливаем в разделе entaxy параметр
Default target system
-database
(ранее созданный профиль с выходным jdbc коннектором);
-
-
Переходим в Postman (или в аналогичное приложение) и проверяем вызов сервиса
mypet
методом GET по адресуhttp://localhost:8181/cxf/mypet/pets
-
В ответ получаем тело сообщения подготовленное в выходном коннекторе:
SELECT * FROM non_existent_table
-
А в журнале видим попытки обращения к БД:
12:55:12.047 INFO [Thread-109] Query: SELECT * FROM non_existent_table 12:55:12.060 WARN [Thread-109] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723110890191-2-2 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723110890191-6-2). On delivery attempt: 0 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 12:55:22.063 INFO [Thread-109] Query: SELECT * FROM non_existent_table 12:55:22.065 WARN [Thread-109] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723110890191-2-2 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723110890191-6-2). On delivery attempt: 1 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 12:55:32.066 INFO [Thread-109] Query: SELECT * FROM non_existent_table 12:55:32.067 WARN [Thread-109] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723110890191-2-2 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723110890191-6-2). On delivery attempt: 2 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 12:55:42.068 INFO [Thread-109] Query: SELECT * FROM non_existent_table 12:55:42.069 WARN [Thread-109] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723110890191-2-2 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723110890191-6-2). On delivery attempt: 3 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 12:55:52.070 INFO [Thread-109] Query: SELECT * FROM non_existent_table 12:55:52.071 WARN [Thread-109] Failed delivery for (MessageId: ID-LAPTOP-4PQ1JPTN-1723110890191-2-2 on ExchangeId: ID-LAPTOP-4PQ1JPTN-1723110890191-6-2). On delivery attempt: 4 caught: org.h2.jdbc.JdbcSQLSyntaxErrorException: Таблица "NON_EXISTENT_TABLE" не найдена Table "NON_EXISTENT_TABLE" not found; SQL statement: SELECT * FROM non_existent_table [42102-199] 12:55:52.075 INFO [Thread-109] Exchange[ExchangePattern: InOnly, BodyType: org.apache.cxf.message.MessageContentsList, Body: []]