Принципы работы повторной доставки сообщений и обработки ошибок

Настройка обработки ошибок и повторной доставки сообщений (Redelivery policy):

Параметр Описание Единица измерения

Maximum Redeliveries

Устанавливает максимальное количество повторных доставок:
0 — без повторных доставок,
n — повторная доставка не более n раз,
-1 — неограниченное количество повторных доставок.

Количество попыток

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

Для понимания принципов работы повторной доставки сообщений и обработки ошибок рассмотрим несколько сценариев.

Настройка системы

  1. Создаем профиль отправляющей системы file

    redelivery setting 01
    redelivery setting 02
    1. Добавляем к профилю входной файловый коннектор

      • В разделе general установите параметр Directory Name - error-test

        redelivery setting 04
      • В разделе entaxy установите параметр Default target system - database

        redelivery setting 03
      • В разделе scheduler установите параметр Delay - 60000 (1 минута)

        redelivery setting 05
        Параметры:
        Directory Name - Название директории входного файлового коннектора в файловой системе;
        Default target system - Название принимающей системы;
        Delay - Время ожидания между попытками отправки данных в принимающую систему (в миллисекундах).
  2. Создаем профиль принимающей системы database

    redelivery setting 06
    redelivery setting 07
    1. Добавляем к профилю выходной JDBC-коннектор

      redelivery setting 10
      • Добавляем в pre-output коннектора запрос к несуществующей таблице, чтобы вызвать ошибку

        redelivery setting 08
        redelivery setting 09
        <?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 без повторной доставки сообщений.

        redelivery setting 11
        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.

      redelivery scenario 01
      Параметры:
      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

redelivery scenario 02
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:

  1. Меняем значение параметра Maximum Redeliveries с 0 на 4, чтобы установить 4 попытки для успешного обращения к БД;

  2. Меняем значение параметра Redelivery Delay с 1000 на 10000, чтобы между попытками проходило 10 секунд, что упрощает отслеживание по журналу;

  3. Меняем значение параметра Retry Attempted Log Level с DEBUG на WARN, чтобы предупреждения о повторных попытка попадали в журнал;

  4. Отключаем значение параметра Log Stack Trace, чтобы сообщение об ошибке не содержало в себе stacktrace.

    redelivery scenario 03

    Ожидаемо через каждые 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.

redelivery scenario 04
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-сервисов

  1. Создаём профиль системы rest

    redelivery scenario 05
  2. Переходим в раздел Безопасностьjaaskarafmoduleskaraf-properties и для пользователя entaxy выбираем Associated Profile - rest

    redelivery scenario 06
    redelivery scenario 07
  3. Переходим в раздел Ресурсыschemas и загружаем файл c описанием rest-сервиса (например, openapi_pets.json)

    redelivery scenario 08
  4. Переходим в раздел Сервисы и добавляем Protected REST сервис mypet;

    redelivery scenario 09
  5. Выбираем в разделе "main" в поле OpenApi schema файл с описанием сервиса из ресурсов;

    redelivery scenario 10
  6. Выбираем в разделе security в поле Authorization realm значение karaf;

    redelivery scenario 11
  7. Нажимаем кнопку Add для создания сервиса;

    redelivery scenario 12
  8. Переходим к профилю rest:

    1. Добавляем входной коннектор mypet (автоматически созданный коннектор при добавлении защищенного REST сервиса);

      redelivery scenario 13
    2. Устанавливаем в разделе entaxy параметр Default target system - database (ранее созданный профиль с выходным jdbc коннектором);

      redelivery scenario 14
  9. Переходим в Postman (или в аналогичное приложение) и проверяем вызов сервиса mypet методом GET по адресу http://localhost:8181/cxf/mypet/pets

    redelivery scenario 16
  10. В ответ получаем тело сообщения подготовленное в выходном коннекторе: SELECT * FROM non_existent_table

    redelivery scenario 15
  11. А в журнале видим попытки обращения к БД:

    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: []]