117 lines
7.0 KiB
Markdown
117 lines
7.0 KiB
Markdown
|
# 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>
|
|||
|
```
|