entaxy-public/system/core/error-handler/README.md

117 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SYSTEM :: ENTAXY :: CORE :: COMMON ERROR HANDLER
Централизованный обработчик ошибок для формирования кодов ошибок, их синхронного возврата клиенту и для асинхронного дублирования более подробного описания ошибки (для клиента и для Центральной Базы Интеграции).
## Установка и настройка
Установка модуля происходит через фичу:
```
feature:install error-handler
```
Фича включена в общий установочный скрипт и будет устанавливаться вместе с остальными модулями.
Во время установки фичи в караф копируются файлы конфигурации:
```
ru.entaxy.esb.error.cfg (основная конфигурация)
ru.entaxy.esb.error.code.cfg (справочник исключений с маппингом на коды ошибок)
ru.entaxy.esb.error.text.cfg (справочник кодов ошибок с маппингом на текстовые сообщения)
```
Есть возможность настройки маппинга уровней журналирования через файл конфигурации `ru.entaxy.esb.error.severity.cfg`.
### ru.entaxy.esb.error.cfg (основная конфигурация)
```
# асинхронный пакет с ошибкой отправляется от имени:
# false - системы, вызвавшей ошибку в шине
# true - шины (система с идентификатором "-1")
error.bus.always_at_source=false
# асинхронный пакет с ошибкой в поле description содержит:
# false - сообщение из маппинга в файле ru.entaxy.esb.error.text.cfg
# true - содержит сообщение, сохранённое в исключении
error.description.exception_message=true
# имя очереди для отправки пакета с ошибкой при недоступности системы, указанной в свойстве error.system.name
error.queue.name=error
# имя системы для отправки пакета с ошибкой, подразумевается система ЦБИ
error.system.name=error
# true - включает в пакет с ошибкой весь stacktrace исключения
error.stacktrace.show=true
# свойство автоматического запуска тестового маршрута, который при старте модуля бросает исключение java.lang.IllegalArgumentException: Test exception thrown
error.test-route.startup=false
```
### ru.entaxy.esb.error.code.cfg (справочник исключений с маппингом на коды ошибок)
Справочник содержит соответствие имён классов исключений и http кодов ошибок. И будет наполняться по мере использования шины в разных ситуациях. Для исключения, имя которого ещё не указано в этом файле, будет возвращаться http код `520` (Unknown Error).
```
DefaultException=520
com.ctc.wstx.exc.WstxParsingException=400
java.security.AccessControlException=403
javax.ws.rs.ForbiddenException=403
ConnectorNotFound=424
ru.entaxy.esb.system.common.exception.DefaultException=520
ProfileNotFound=424
# и т.д.
```
### ru.entaxy.esb.error.text.cfg (справочник кодов ошибок с маппингом на текстовые сообщения)
Если в основной конфигурации свойство `error.description.exception_message` установлено в `false`, то описание ошибки отправляется из этого файла в соответствие с кодом http ошибки.
```
# 1xx: Informational
# 2xx: Success
200=OK
# 3xx: Redirection
# 4xx: Client Error
400=Bad Request
403=Forbidden
424=Failed Dependency
# 5xx: Server Error
520=Unknown Error
# и т.д.
```
## Подключение обработчика ошибок
Для подключения обработчика ошибок к маршрутам какого-либо модуля необходимо выполнить следующие шаги:
1. Добавить в модуль обработки ошибок в директорию `src/main/resources/xslt/operation` новый xslt для формирования ответа с ошибкой. Файл должен называться по имени операции, для которой будет формироваться ответ. Например `sendToJMS.xsl`.
1. Добавить в `camelContext` аттрибут `errorHandlerRef="commonErrorHandler"` и внутри зарегистрировать обработчик и политику повторной доставки:
```xml
<camelContext id="soap-service-endpoints-camel-context"
xmlns="http://camel.apache.org/schema/blueprint"
errorHandlerRef="commonErrorHandler" handleFault="true">
<errorHandler id="commonErrorHandler" redeliveryPolicyRef="noRedelivery"
type="DeadLetterChannel" deadLetterUri="direct-vm:commonErrorEndpoint"/>
<redeliveryPolicyProfile id="noRedelivery" disableRedelivery="true" />
<!-- any content -->
</camelContext>
```
Для контекстов, содержащих конечные точки cxf, необходимо:
- через `pom.xml` импортировать интерцептор для перехвата ошибок (SoapFault)
```xml
<bundle.osgi.import.pkg>
ru.entaxy.esb.system.core.common.error.handler.interceptor,
...
</bundle.osgi.import.pkg>
```
- добавить интерцептор в `cxfEndpoint` и bean с указанием в первом аргументе идентификатора `camelContext`
```xml
<camelcxf:cxfEndpoint id="soap-proxy" .../>
<!-- any properties and interceptors -->
<camelcxf:outFaultInterceptors>
<ref component-id="handleOutFaultInterceptor"/>
</camelcxf:outFaultInterceptors>
</camelcxf:cxfEndpoint>
<bean id="handleOutFaultInterceptor" class="ru.entaxy.esb.system.core.common.error.handler.interceptor.HandleOutFaultInterceptor">
<argument ref="soap-service-endpoints-camel-context"/>
<argument value="direct:error_from_cxf"/>
</bean>
```
- в `camelContext` добавить маршрут
```xml
<route id="error_from_cxf">
<from uri="direct:error_from_cxf"/>
<log message="cxf message: ${body}" loggingLevel="DEBUG"/>
<log message="headers: ${headers}\n" loggingLevel="DEBUG"/>
<to uri="direct-vm:cxfErrorEndpoint"/>
</route>
```