initial public commit

This commit is contained in:
2021-09-06 17:46:59 +03:00
commit b744b08829
824 changed files with 91593 additions and 0 deletions

View File

@ -0,0 +1,219 @@
= Общее описание Entaxy
=== Entaxy обеспечивает следующую функциональность:
. обеспечение доступа внешних систем к шине через опубликованные сервисы (SOAP, REST, прочее)
. поддержка синхронного и асинхронного способа вызова служб;
. использование защищённой шины, с гарантированной доставкой сообщений, поддерживающего транзакционную модель;
. статическая и алгоритмическая (условная, опирающаяся на значение передаваемых данных) маршрутизация сообщений;
. доступ к данным из сторонних информационных систем с помощью готовых или специально разработанных адаптеров;
. обработка и преобразование сообщений;
. отказоустойчивая конфигурация;
. разнообразные механизмы контроля и управления (аудиты, протоколирование);
. мониторинг данных и бизнес-процессов
=== Entaxy решает следующие задачи:
. обмен сообщениями/данными между приложениями и ИС
. организация точек доступа к услугам (сервисам) и данным
. унификация взаимодействия с внешними ИС
. мониторинг данных и бизнес-процессов
. снижение трудоемкости процесса сбора и агрегации информации
. повышение оперативности подготовки отчетов
. обеспечение автоматизированной проверки данных, используемых в процессе деятельности
=== Entaxy реализована на следующем наборе ПО:
- ОС: _Astra Linux 1.6 смоленск_ ?
- Программная платформа: _Java 11 (librca)_
- СУБД (предоставляется заказчиком): _MS SQL Server_
- СУБД (может использоваться): _PostgreSQL JDBC Driver_
- Платформа исполнения: _Apache Karaf 4.2.9_
- Платформа интеграции: _Apache Camel 3.4.4_
- Каркас реализации веб-сервисов: _Apache CXF 3.4.0_
- Брокер сообщений: _ActiveMQ Artemis 2.15_
- Система мониторинга (предоставляется заказчиком): _Zabbix, Grafana_
- Система управления журналами (предоставляется заказчиком): _стек ELK_
=== Схема развертывания
Ниже представлена схема развертывания основных компонентов шины, содержащая следующие элементы:
. кластер _NGINX_ - два узла, обеспечивающих отказоустойчивый балансировщик нагрузки, с одним виртуальным IP-адресом
. кластер _Karaf_ - в начальной конфигурации используется 2 узла, в дальнейшем схема масштабируется горизонтально. Наличие кластера обеспечивает отказоустойчивость и производительность, так как нагрузка распределяется между всеми активными узлами
. кластер брокера сообщений _ActiveMQ Artemis_ - отказоустойчивая конфигурация "активный - пассивный", в которой все транзакции активного брокера реплицируются на пассивный. При выходе из строя активного брокера, активным становится пассивный. Все вызовы брокера сообщений осуществляются по схеме failover, которая гарантирует переадресацию запроса в случае недоступности основного узла.
. отказоустойчивый кластер СУБД - предоставляется заказчиком
. _NFS Share_ - подключаемое сетевое файловое хранилище, предоставляется заказчиком
. _ELK_ - узел сбора и обработки логов стеком продуктов ELK (ElasticSearch, Logstash, Kibana)
. узел сбора и обработки метрик с установленными продуктами Zabbix и Grafana
image::clustering.png[]
Ниже представлена схема деплоя профилей/коннекторов в шине:
image::System-management.png[]
=== Список и характеристики узлов предпродуктивного контура
|===
|Имя сервера |Ресурсы |Назначение |Операционная система |Софт
| PREPRD_NGINX1
| 2xCPU, 4Gb RAM, 40 Gb Local
| Балансировщик
| AstraLinux SE 1.6
| Nginx
| PREPRD_NGINX2
| 2xCPU, 4Gb RAM, 40 Gb Local
| Балансировщик
| AstraLinux SE 1.6
| Nginx
| PREPRD_KRF1
| 8xCPU, 12 Gb RAM, 60 Gb Local
| Платформа запуска интеграционных маршрутов
| AstraLinux SE 1.6
| Apache Karaf, Cellar, java-1.8.0-openjdk
| PREPRD_KRF2
| 8xCPU, 12 Gb RAM, 60 Gb Local
| Платформа запуска интеграционных маршрутов
| AstraLinux SE 1.6
| Apache Karaf, Cellar, java-1.8.0-openjdk
| PREPRD_NEXUS
| 4xCPU, 12 Gb RAM, 60 Gb Local
| Хранение артефактов
| AstraLinux SE 1.6
| Nexus
| PREPRD_AMQ1
| 4xCPU, 16 Gb RAM, 60 Gb Local
| Брокер сообщений
| AstraLinux SE 1.6
| Java, ActiveMQ Artemis
| PREPRD_AMQ2
| 4xCPU, 16 Gb RAM, 60 Gb Local
| Брокер сообщений
| AstraLinux SE 1.6
| Java, ActiveMQ Artemis
|===
=== Схема прохождения пакета _Система1_ - _Система2_
Ниже представлена схема прохождения пакета на примере обмена данными между двумя экземплярами системами.
Экземпляры систем соединяются с шиной через _Коннектор_, который взаимодействует с сервисом SOAP, Универсальный коннектор, (контекст/cxf/uniform-exchange), предоставляемым шиной.
Укрупненно маршрут выглядит следующим образом:
. доставка сообщения до очереди получателя: CXF-сервис -> маршрут Camel send-to-jms -> очередь в Artemis
. получение сообщения: CXF-сервис -> очередь в Artemis
. подтверждение получения: CXF-сервис -> маршрут Camel receive-acknowledge
image::route_packet.png[]
=== Средства мониторинга и отладки
Для мониторинга работы и отладки шины для сценария прохождения пакета могут быть использованы следующие инструменты.
==== Журнал (лог) Nginx
Логи Nginxa располагаются в папке по пути “/var/log/nginx”.
В папке с логами Nginxa располагаются 2 типа логов:
. Access - отображает все процессы, которые проходят через Nginx.
В случае когда запрос отработал успешно, сервер возвращает код 200 в access.log и записывает строку с URL запроса, кодом, размером ответа и временем получения ответа.
. Error - отображает процессы, в которых возникли ошибки
В случае когда запрос отработал с ошибкой, сервер возвращает код 400 (например) в error.log и записывает строку с URL запроса, кодом, кратким описанием ошибки, размером ответа, временем получения ответа и юзер-агентом (HTTP-заголовок, который показывает из какого браузера или иного софта был отправлен запрос).
==== Трассировка маршрутов Camel
_Apache Сamel_ - это платформа для запуска интеграционных маршрутов (процессов), которые в самой платформе называются “route”. Основными функциями Apache Camel являются подключения по различным протоколам, маршрутизация запросов и сообщений, а также преобразование данных.
Работа с маршрутами в Apache Camel и самой платформой осуществляется из hawtio. Hawtio - это графическая консоль управления. Hawtio доступна по следующим ссылкам:
Karaf-1 - http://<<+host+>>:8181/hawtio/
image::screenshots/screenshot_hawtio_1.png[]
Трассировка маршрутов в hawtio производится на вкладке “Camel”, путем выбора маршрута (папка route) в левой области экрана и перехода на вкладку “Trace”.
image::screenshots/screenshot_hawtio_2.png[]
image::screenshots/screenshot_hawtio_3.png[]
После перехода необходимо нажать на кнопку “Start tracing”, платформа запустит трассировку маршрута и выведет на экран схему процесса трассировки.
image::screenshots/screenshot_hawtio_4.png[]
В связи с тем что в 3й версии Camel, используемой нами, трассировка по умолчанию отключена потребуется подготовить отлаживаемый контекст. Для этого необходимо включить параметры _backlogTrace_ и _useBreadcrumb_.
Пример:
[source,xml]
----
<camelContext id="passive-common-connector-context" xmlns="http://camel.apache.org/schema/blueprint" errorHandlerRef="commonErrorHandler" backlogTrace="true" useBreadcrumb="true">
----
Так же для удобства работы можно включить отображение потоков в текстовом формате.
Для этого в Настройках(Preferences) hawtio нужно включить флаг Include trace/debug streams
image::screenshots/screenshot_hawtio_5.png[]
В веб-консоли hawtio, помимо работы с маршрутами, есть возможность установки бандлов, плагинов (вкладка OSGI)
Возможность просмотра логов и прочее.
image::screenshots/screenshot_hawtio_6.png[]
image::screenshots/screenshot_hawtio_7.png[]
=== Веб-консоль брокера сообщений
Добавить описание, урлы (для обоих брокеров) и скриншоты на примере любой очереди. Показать, где содержимое, где рейт и прочее.
Apache ActiveMQ - это брокер сообщений, основной функцией которого является отправка и получение сообщений.
Работа с брокером сообщений производится через веб-консоль, перейти на которые можно по следующим ссылкам:
ActiveMQ-1 - http://<<+host+>>:8161/console/
image::screenshots/screenshot_artemis_1.png[]
В веб-консоли можно просматривать очереди сообщений на вкладке “Queues”.
image::screenshots/screenshot_artemis_2.png[]
На этой же вкладке можно просмотреть название очереди, адрес очереди.
image::screenshots/screenshot_artemis_3.png[]
Посмотреть скорость обмена сообщениями (столбец “Rate”), количество сообщений в очереди.
image::screenshots/screenshot_artemis_4.png[]
На вкладке “Producer” можно посмотреть данные об отправленных сообщениях (id сообщений, название адресов, на которые были отправлены сообщения).
image::screenshots/screenshot_artemis_5.png[]
На вкладке “Consumers” можно посмотреть данные о полученных сообщениях (id сообщений, из какой очереди пришли сообщения, название адресов, с которых были получены сообщения).
image::screenshots/screenshot_artemis_6.png[]
В левой области экрана можно выбрать в списке нужную очередь и посмотреть количество сообщений в ней.
image::screenshots/screenshot_artemis_7.png[]
При выборе очереди, автоматически открывается вкладка “Browse”, на которой отображаются все сообщения из выбранной очереди. При нажатии на id сообщения, появится диалоговое окно с сообщением.
image::screenshots/screenshot_artemis_8.png[]
При необходимости сообщение можно переместить в другую очередь (кнопка “Move”) или удалить (кнопка “Delete”).
image::screenshots/screenshot_artemis_9.png[]
Также в консоли имеется возможность полностью очистить очередь от сообщений или полностью удалить очередь из брокера сообщений, выбрав очередь в левой области экрана и перейдя на вкладку “Delete”.
image::screenshots/screenshot_artemis_10.png[]

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@ -0,0 +1,169 @@
= Общие положения
При передаче сообщения от внешней системы в шину происходит процесс аутентификации внешней системы в шине. Т.е. при передаче сообщения шине с помощью сервера _nginX_ по протоколу _basic_ аутентификации сверяет присвоенные сообщению логин и пароль системы, от которой передается сообщение с ее логином, зарегистрированным в шине. При совпадении логина и пароля сообщение проходит от внешней системы через шину к другой системе. Если же пара логин пароль не совпадает, то система блокирует сообщение.
image::Authentication.png[Аутентификация с помощью nginx]
Обновление учетных записей на _nginx_ по данным от сервиса _basic-auth-management_ проходит каждую минуту.
Для компактной установки шины без _nginx_ модуль реализует интерцептор для basic аутентификации при обращении к сервисам. Включить встроенную аутентификацию можно в конфигурационном файле ru.entaxy.esb.system.basic_auth.cfg -> свойство internal.authentication.enabled.
Сервис _basic-auth-management_ служит для работы с учетными записями (аккаунтами) через протокол _SOAP_.
В сервисе существуют три вида запросов:
* Добавление аккаунтов;
* Обновление аккаунтов;
* Удаление неактуальных аккаунтов.
* Выдача прав аккаунту
* Удаление прав аккаунта
=== Добавление аккаунта
Метод для добавления учетных записей _(addAccount)_ разработан для добавления новых пользователей в систему.
Запрос на добавление аккаунта выглядит следующим образом:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bas="http://www.entaxy.ru/basic-auth-service/">
<soapenv:Header/>
<soapenv:Body>
<bas:accountList>
<!--1 or more repetitions:-->
<bas:account>
<bas:login>system1login</bas:login>
<bas:password>system1pass</bas:password>
<!--Optional:-->
<bas:systemUUID>system1uuid</bas:systemUUID>
</bas:account>
</bas:accountList>
</soapenv:Body>
</soapenv:Envelope>
----
В теле содержится список аккаунтов это повторение элементов _account_ неограниченное число раз. Также в теле содержатся обязательные поля _<login>_ (логин) и _<password>_ (пароль). Поле _<systemUUID>_ (идентефикатор системы) является необязательным.
Пароль принимается в прямом виде и шифруется непосредственно перед сохранением, чтобы он не хранился в открытом виде.
=== Обновление аккаунта
Метод для обновления учетной записи _(updateAccount)_ разработан для обновления следующей информации:
* новый пароль системы;
* присвоение учетной записи к другой системе.
Запрос на обновление аккаунта выглядит следующим образом:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bas="http://www.entaxy.ru/basic-auth-service/">
<soapenv:Header/>
<soapenv:Body>
<bas:accountList>
<!--1 or more repetitions:-->
<bas:account>
<bas:login>system1login</bas:login>
<bas:password>system1pass</bas:password>
<!--Optional:-->
<bas:systemUUID>system1uuid</bas:systemUUID>
</bas:account>
<bas:account>
<bas:login>system2login</bas:login>
<bas:password>system2pass</bas:password>
</bas:account>
</bas:accountList>
</soapenv:Body>
</soapenv:Envelope>
----
В теле содержится список аккаунтов, который содержит информацию аналогичную из п.2.
=== Удаление аккаунта
Метод для удаления аккаунта _(removeAccount)_ служит для удаления аккаунта из системы.
Запрос на удаление аккаунта выглядит следующим образом:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bas="http://www.entaxy.ru/basic-auth-service/">
<soapenv:Header/>
<soapenv:Body>
<bas:loginList>
<!--1 or more repetitions:-->
<bas:login>system1login</bas:login>
<bas:login>system2login</bas:login>
</bas:loginList>
</soapenv:Body>
</soapenv:Envelope>
----
В теле содержится неограниченный список логинов _(loginList)_, которые будут удалены из системы.
=== Выдача прав аккаунту
Метод выдачи прав аккаунту _(addAccountPermission)_ служит для создания _permission_ связанных с переданным аккаунтом.
Запрос на создание права выглядит следующим образом:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bas="http://www.entaxy.ru/basic-auth-service/">
<soapenv:Header/>
<soapenv:Body>
<bas:permissionList>
<!--1 or more repetitions:-->
<bas:permission>
<bas:login>dog</bas:login>
<bas:subject>topic-management</bas:subject>
<bas:subjectType>service</bas:subjectType>
<!--Optional:-->
<bas:action></bas:action>
</bas:permission>
<bas:permission>
<bas:login>dog</bas:login>
<bas:subject>system-management</bas:subject>
<bas:subjectType>service</bas:subjectType>
<!--Optional:-->
<bas:action></bas:action>
</bas:permission>
</bas:permissionList>
</soapenv:Body>
</soapenv:Envelope>
----
Если параметр action пустой либо отсутствует в сервисе _permission_ по умолчанию подставляется _default_.
=== Удаление прав аккаунта
Метод удаления прав аккаунта _(removeAccountPermission)_ служит для удаления _permission_ связанных с переданным аккаунтом.
Запрос на создание права выглядит следующим образом:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bas="http://www.entaxy.ru/basic-auth-service/">
<soapenv:Header/>
<soapenv:Body>
<bas:permissionList>
<!--1 or more repetitions:-->
<bas:permission>
<bas:login>dog</bas:login>
<bas:subject>topic-management</bas:subject>
<bas:subjectType>service</bas:subjectType>
<!--Optional:-->
<bas:action></bas:action>
</bas:permission>
<bas:permission>
<bas:login>dog</bas:login>
<bas:subject>system-management</bas:subject>
<bas:subjectType>service</bas:subjectType>
<!--Optional:-->
<bas:action></bas:action>
</bas:permission>
</bas:permissionList>
</soapenv:Body>
</soapenv:Envelope>
----
Если параметр _action_ пустой либо отсутствует в сервисе permission по умолчанию подставляется _default_.

View File

@ -0,0 +1,79 @@
Связь между двумя независимыми брокерами осуществляется с помощью моста. Карафы подключенные к одному брокеру далее будут именоваться шиной.
image::Route-in-different-esb.png[Прохождение пакета через группу и мост]
== Установка и настройка
Установка модуля происходит через фичу:
* _feature:install bridge_
Фича включена в общий установочный скрипт и будет устанавливаться вместе с остальными модулями. Во время установки фичи в караф копируются файлы конфигурации:
* _ru.entaxy.esb.system.bridge.cfg (основная конфигурация)_
=== ru.entaxy.esb.system.bridge.cfg (основная конфигурация)
[source,properties]
----
# имя локальной шины(<node_name>)
jms.local=test1
# значение true - мост текущего узла работает в пассивном режиме,
# т.е. сообщения для соответствующего удалённого узла складываются в очередь на локальном брокере,
# из которой уже читает подключаемый узел (локальный брокер должен быть доступен для соединения)
# По умолчанию false - активный режим, запись сообщения идёт сразу в очередь на удалённом брокере,
# подключаемого узла (брокеры по обе стороны моста должны быть доступны)
jms.local.master=false
# имена удаленных шин, задается через запятую(<node_name>,<node_name>)
jms.remote.list=test2
# адреса брокера, задаются чеерез запятую(jms.url.<node_name>)
jms.url.test1=192.168.122.81:61616,192.168.122.82:61616
# логин для подключения к брокеру(jms.username.<node_name>)
jms.username.test1=input
# пароль для подключения к брокеру(jms.password.<node_name>)
jms.password.test1=input
# протокол для передачи сообщений внутри шины(jms.protocol.inner.esb.<node_name>)
# для корректной работы синхронного режима передачи сообщений: необходимо следить
# за одинаковым значением данного параметра в мосту и в самой шине(ru.entaxy.esb.cfg)
# возможные значения tcp, amqp
jms.protocol.inner.esb.test1=tcp
# протокол для передачи сообщений между шинами(jms.protocol.bridge.esb.<node_name>)
# для корректной работы синхронного режима передачи сообщений: необходимо следить
# за одинаковым значением данного параметра во всех подключенных шинах
# возможные значения tcp, amqp
jms.protocol.bridge.test1=amqp
# адреса брокера, задаются чеерез запятую(jms.url.<node_name>)
jms.url.test2=localhost:61616
# логин для подключения к брокеру(jms.username.<node_name>)
jms.username.test2=input
# пароль для подключения к брокеру(jms.password.<node_name>)
jms.password.test2=input
# jms.master.<node_name> - выставляем в true, когда соответствующий узел настроен в пассивный режим,
# т.е. для него jms.local.master = true (брокер должен быть доступен для соединения)
jms.master.test2=true
# протокол для передачи сообщений внутри шины(jms.protocol.inner.esb.<node_name>)
# для корректной работы синхронного режима передачи сообщений: необходимо следить
# за одинаковым значением данного параметра в мосту и в самой шине(ru.entaxy.esb.cfg)
# возможные значения tcp, amqp
jms.protocol.inner.esb.test2=tcp
# протокол для передачи сообщений между шинами(jms.protocol.bridge.esb.<node_name>)
# для корректной работы синхронного режима передачи сообщений: необходимо следить
# за одинаковым значением данного параметра во всех подключенных шинах
# возможные значения tcp, amqp
jms.protocol.bridge.test2=amqp
# максимальное колчичество попыток отправить сообщение в очередь
# почитать подробнее можно в https://camel.apache.org/components/latest/eips/dead-letter-channel.html#deadLetterChannel-Redelivery
redelivery.maximumRedeliveries=-1
# время между попытками отправить сообщение в очередь
redelivery.redeliveryDelay=5000
# экспоненциальный рост времени между попытками отпрвки сообщений в очередь
redelivery.useExponentialBackOff=true
queue.sender.concurrentConsumers=1
queue.receiver.concurrentConsumers=1
----

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

View File

@ -0,0 +1,44 @@
= Файловые репозитории
*Nexus*
представлен бандлом SYSTEM :: ENTAXY :: NEXUS :: DEPLOYER, реализует взаимодействие с репозиторием Sonatype Nexus.
Конфигурация ru.entaxy.esb.deployer.nexus.cfg
[source]
----
# все смены адреса расположения nexus и изменение наименования репозитория, необходимо фиксировать в файле
# org.ops4j.pax.url.mvn.cfg параметр: org.ops4j.pax.url.mvn.repositories
# url расположения nexus
nexus.deployer.url=http://nexusHost
# название репозитория в nexus, необходимого для конфигурирования шины из вне(создание профилей, коннекторов и т д)
nexus.deployer.repository=entaxy
# логин для авторизации в nexus
nexus.deployer.username=deployer
# пароль для авторизации в nexus
nexus.deployer.password=deployer
----
*File-system*
представлен бандлом SYSTEM :: ENTAXY :: FILE SYSTEM :: DEPLOYER, реализует взаимодействие с файловой системой, т.е. сохраняет переданные файлы в настроенной папке.
Конфигурация ru.entaxy.esb.deployer.file.system.cfg
[source]
----
#Корневая папка репозитория
folder.root=/opt/bundle-repository
----
=== Настройка системы
По умолчанию деплоятся оба бандла и система использует репозиторий File-system.
Для включения нужного репозитория необходимо оставить включённым бандл того репозитория, который требуется использовать.
ример:_
По умолчанию включён репозиторий File-system, для включения репозитория Nexus отключаем/удаляем бандл SYSTEM :: ENTAXY :: FILE SYSTEM :: DEPLOYER

View File

@ -0,0 +1,144 @@
Централизованный обработчик ошибок для формирования кодов ошибок, их синхронного возврата клиенту и для асинхронного дублирования более подробного описания ошибки для клиента и для Центральной Базы Интеграции.
image::Error-handling-Scheme.jpg[]
= Установка и настройка
Установка модуля происходит через фичу:
* _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 (основная конфигурация)_
[source,properties]
----
# асинхронный пакет с ошибкой отправляется от имени:
# false - системы, вызвавшей ошибку в шине
# true - шины (система с идентификатором "-1")
ru.entaxy.esb.error.bus.always_at_source=false
# асинхронный пакет с ошибкой в поле description содержит:
# false - сообщение из маппинга в файле ru.entaxy.esb.error.text.cfg
# true - содержит сообщение, сохранённое в исключении
ru.entaxy.esb.error.description.exception_message=true
# имя очереди для отправки пакета с ошибкой при недоступности системы, указанной в свойстве ru.entaxy.esb.error.system.name
ru.entaxy.esb.error.queue.name=error
# имя системы для отправки пакета с ошибкой, подразумевается система ЦБИ
ru.entaxy.esb.error.system.name=error
# true - включает в пакет с ошибкой весь stacktrace исключения
ru.entaxy.esb.error.stacktrace.show=true
# свойство автоматического запуска тестового маршрута, который при старте модуля бросает исключение java.lang.IllegalArgumentException: Test exception thrown
ru.entaxy.esb.error.test-route.startup=false
----
* _ru.entaxy.esb.error.code.cfg (справочник исключений с маппингом на коды ошибок)_
Справочник содержит соответствие имён классов исключений и _http_ кодов ошибок. И будет наполняться по мере использования шины в разных ситуациях. Для исключения, имя которого ещё не указано в этом файле, будет возвращаться _http_ код _520 (Unknown Error)._
[source,properties]
----
DefaultException=520
com.ctc.wstx.exc.WstxParsingException=400
java.security.AccessControlException=403
javax.ws.rs.ForbiddenException=403
ru.onec.esb.system.common.exception.ConnectorNotFound=424
ru.onec.esb.system.common.exception.DefaultException=520
ru.onec.esb.system.common.exception.ProfileNotFound=424
# и т.д.
----
* _ru.entaxy.esb.error.text.cfg (справочник кодов ошибок с маппингом на текстовые сообщения)_
Если в основной конфигурации свойство _ru.entaxy.esb.error.description.exception_message_ установлено в _false_, то описание ошибки отправляется из этого файла в соответствие с кодом _http_ ошибки.
[source,properties]
----
# 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
# и т.д.
----
=== Подключение обработчика ошибок
Для подключения обработчика ошибок к маршрутам какого-либо модуля необходимо выполнить следующие шаги:
. Добавить в модуль обработки ошибок в директорию _src/main/resources/xslt/operation_ новый _xslt_ для формирования ответа с ошибкой. Файл должен называться по имени операции, для которой будет формироваться ответ. Например _sendToJMS.xsl_.
. Добавить в _camelContext_ аттрибут _errorHandlerRef="commonErrorHandler"_ и внутри зарегистрировать обработчик и политику повторной доставки:
[source,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_)
[source,xml]
----
<bundle.osgi.import.pkg>
ru.onec.esb.system.core.common.error.handler.interceptor,
...
</bundle.osgi.import.pkg>
----
добавить интерцептор в _cxfEndpoint_ и _bean_ с указанием в первом аргументе идентификатора _camelContext_
[source,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.onec.esb.system.core.common.error.handler.interceptor.HandleOutFaultInterceptor">
<argument ref="soap-service-endpoints-camel-context"/>
<argument value="direct:error_from_cxf"/>
</bean>
----
в _camelContext_ добавить маршрут
[source,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>
----

View File

@ -0,0 +1,31 @@
= Использование обработчика ошибок
Для централизованной обработки ошибок будем использовать “процессор” зарегистрированный через _<camelContext errorHandlerRef="...”>_. В частных случаях допустимо использование _try …​ catch …​ finally_.
_(https://camel.apache.org/manual/latest/error-handler.html)_
Кроме возврата ошибок вызывающей стороне, необходимо дублировать ошибки в JMS очередь с возможностью их просмотра из веб-консоли Артемиса.
=== Классификация ошибок
_Бизнесовые ошибки:_ отсутствие обязательных полей, превышение длины поля и другие нарушения ожиданий принимающей стороны.
_Серверные ошибки:_ NPE и другие ошибки времени выполнения.
_Сервис не доступен:_ конечная точка не отвечает и не принимает входящие соединения.
При этом ошибки могут быть “восстанавливаемыми” - с возможностью успешной обработки повторного запроса, использующего изменённые данные или другие точки доступа, и “не восстанавливаемыми” - у клиента нет возможности обойти причины ошибки для выбранного сервиса.
=== Обёртка для ошибок
Ошибки удобно обрабатывать используя дополнительную информацию, которую необходимо передавать вместе с ошибкой:
* _Timestamp_: время возникновения ошибки;
* _Error Code_: код ошибки для удобства автоматизированной обработки ошибок;
* _Error Text_: описание возникающей ошибки, допустимо выводить вместе со стектрейсом;
* _Severity Level_: уровень журналирования ошибки;
* _Notification_: в случае необходимости уведомлений об ошибке поле должно содержать адрес или список адресов систем/пользователей для оповещения;
* _Retry_: информация о возможности повторной отправки сообщения;
_Uuid_ и _id_ сообщения

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

View File

@ -0,0 +1,318 @@
= SOAP сервис Permission-management
=== Permission - сущность для описания и хранения прав.
Поля _Permission_:
. _permissionId_ (long) - идентификатор объекта permission
. _objectId_ (long) - идентификатор объекта, для которого проверяются права
. _objectType_ (String) - тип объекта, данный параметр соответствует проектной терминалогии: _system_, _system-group_
. _subjectId_ (String) - идентификатор предмета применяемого права
. _subjectType_ (String) - тип предмета
. _action_ (String)- тип действия, по умолчанию проставляется значение _default_
=== SOAP Сервис Permission управляет созданием и проверкой объекта Permission.
Типы объектов в системе ESB.
- _system_ - система
- _system-group_ - группа систем
- _service_ - сервис
- _account_ - аккаунт
- _event-topic_ - топик
=== Методы сервиса
_Check_ - проверяет описанное право
Принимает параметры
- _objectId_ (long) - идентификатор объекта, для которого проверяются права
- _objectType_ (String) - тип объекта
- _subjectId_ (String) - идентификатор предмета применяемого права
- _subjectType_ (String) - тип предмета
- _action_ (String) - тип действия, необязательный по умолчанию проставляется значение _default_
Пример запроса:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:per="http://www.entaxy.ru/permission/">
<soapenv:Header/>
<soapenv:Body>
<per:permissionCommon>
<per:objectId>1</per:objectId>
<per:objectType>system</per:objectType>
<per:subjectId>2</per:subjectId>
<per:subjectType>system</per:subjectType>
<!--Optional:-->
<per:action>default</per:action>
</per:permissionCommon>
</soapenv:Body>
</soapenv:Envelope>
----
Пример ответа:
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/permission/">false</response>
</soap:Body>
</soap:Envelope>
----
=== Get - получает запись Permission
Принимает параметры
_permissionId_ (long) - идентификатор объекта _permission_
Пример запроса:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:per="http://www.entaxy.ru/permission/">
<soapenv:Header/>
<soapenv:Body>
<per:permissionId>24</per:permissionId>
</soapenv:Body>
</soapenv:Envelope>
----
Пример ответа:
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<tns:permission xmlns:tns="http://www.entaxy.ru/permission/">
<tns:permissionId>24</tns:permissionId>
<tns:objectId>7</tns:objectId>
<tns:objectType>system</tns:objectType>
<tns:subjectId>8</tns:subjectId>
<tns:subjectType>system</tns:subjectType>
<tns:action>connect</tns:action>
</tns:permission>
</soap:Body>
</soap:Envelope>
----
=== GetByAllParams - получает запись Permission
Принимает параметры
- _objectId_ (long) - идентификатор объекта, для которого проверяются права
- _objectType_ (String) - тип объекта
- _subjectId_ (String) - идентификатор предмета применяемого права
- _subjectType_ (String) - тип предмета
- _action_ (String) - тип действия, необязательный по умолчанию проставляется значение _default_
Пример запроса:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:per="http://www.entaxy.ru/permission/">
<soapenv:Header/>
<soapenv:Body>
<per:permissionCommon>
<per:objectId>7</per:objectId>
<per:objectType>system</per:objectType>
<per:subjectId>8</per:subjectId>
<per:subjectType>system</per:subjectType>
<!--Optional:-->
<per:action>connect</per:action>
</per:permissionCommon>
</soapenv:Body>
</soapenv:Envelope>
----
Пример ответа:
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<tns:permission xmlns:tns="http://www.entaxy.ru/permission/">
<tns:permissionId>24</tns:permissionId>
<tns:objectId>7</tns:objectId>
<tns:objectType>system</tns:objectType>
<tns:subjectId>8</tns:subjectId>
<tns:subjectType>system</tns:subjectType>
<tns:action>connect</tns:action>
</tns:permission>
</soap:Body>
</soap:Envelope>
----
=== Create - создаёт запись Permission
Принимает параметры
- _objectId_ (long) - идентификатор объекта, для которого проверяются права
- _objectType_ (String) - тип объекта
- _subjectId_ (String) - идентификатор предмета применяемого права
- _subjectType_ (String) - тип предмета
- _action_ (String) - тип действия, необязательный по умолчанию проставляется значение _default_
Пример запроса:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:per="http://www.entaxy.ru/permission/">
<soapenv:Header/>
<soapenv:Body>
<per:permissionCommon>
<per:objectId>7</per:objectId>
<per:objectType>account</per:objectType>
<per:subjectId>1234</per:subjectId>
<per:subjectType>system-group</per:subjectType>
<!--Optional:-->
<per:action>send</per:action>
</per:permissionCommon>
</soapenv:Body>
</soapenv:Envelope>
----
Пример ответа:
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<tns:permission xmlns:tns="http://www.entaxy.ru/permission/">
<tns:permissionId>25</tns:permissionId>
<tns:objectId>7</tns:objectId>
<tns:objectType>account</tns:objectType>
<tns:subjectId>1234</tns:subjectId>
<tns:subjectType>system-group</tns:subjectType>
<tns:action>send</tns:action>
</tns:permission>
</soap:Body>
</soap:Envelope>
----
В случае если запись уже создана возвращается ошибка
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>org.hibernate.exception.ConstraintViolationException: could not execute statement</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
----
=== Update - изменяет запись Permission
Принимает параметры
- _permissionId_ (long) - идентификатор объекта permission
- _objectId_ (long) - идентификатор объекта, для которого проверяются права
- _objectType_ (String) - тип объекта, данный параметр соответствует проектной терминалогии: system, system-group
- _subjectId_ (String) - идентификатор предмета применяемого права
- _subjectType_ (String) - тип предмета
- _action_ (String) - тип действия, необязательный по умолчанию проставляется значение _default_
Пример запроса:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:per="http://www.entaxy.ru/permission/">
<soapenv:Header/>
<soapenv:Body>
<per:permission>
<per:permissionId>23</per:permissionId>
<per:objectId>8</per:objectId>
<per:objectType>account</per:objectType>
<per:subjectId>1234</per:subjectId>
<per:subjectType>system-group</per:subjectType>
<!--Optional:-->
<per:action>send</per:action>
</per:permission>
</soapenv:Body>
</soapenv:Envelope>
----
Пример ответа:
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<tns:permission xmlns:tns="http://www.entaxy.ru/permission/">
<tns:permissionId>23</tns:permissionId>
<tns:objectId>8</tns:objectId>
<tns:objectType>account</tns:objectType>
<tns:subjectId>1234</tns:subjectId>
<tns:subjectType>system-group</tns:subjectType>
<tns:action>send</tns:action>
</tns:permission>
</soap:Body>
</soap:Envelope>
----
В случае если запись не найдена возвращается ошибка
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>No entity found for query</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
----
=== _Delete_ - удаляет запись _Permission_
Принимает параметры
- _objectId_ (long) - идентификатор объекта, для которого проверяются права
- _objectType_ (String) - тип объекта
- _subjectId_ (String) - идентификатор предмета применяемого права
- _subjectType_ (String) - тип предмета
- _action_ (String) - тип действия, необязательный по умолчанию проставляется значение _default_
Пример запроса:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:per="http://www.entaxy.ru/permission/">
<soapenv:Header/>
<soapenv:Body>
<per:permissionCommon>
<per:objectId>7</per:objectId>
<per:objectType>account</per:objectType>
<per:subjectId>1234</per:subjectId>
<per:subjectType>system-group</per:subjectType>
<!--Optional:-->
<per:action>send</per:action>
</per:permissionCommon>
</soapenv:Body>
</soapenv:Envelope>
----
Пример ответа:
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/permission/">true</response>
</soap:Body>
</soap:Envelope>
----
В случае если запись не найдена возвращается ошибка
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>No entity found for query</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
----

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

View File

@ -0,0 +1,462 @@
= Shema
Есть три типа ресурсов, которые можно загружать в шину и использовать в маршрутах:
. Валидационные типы ресурсов (нпрм xsd). Необходимы для валидации сообщения на соответствие той или иной схеме.
. Трансформационные типы ресурсов (нпрм xslt, amd). Необходимы для трасформации сообщений из одной схемы в другую.
. Ресурсы используемые для генерации сервисов (нпрм wsdl). Необходимы для поднятия сервиса на шине.
Для загрузки трансформационных ресурсов необходимо указывать, является ли данный трансформатор конвертором и схему-источник и схему-результат для неявного преобразования сообщения(конвертор может быть один и только один для пары: схема источник, схема результат)
Схему-источник и схему-результат необходимо указывать только для конверторов, используемых в неявных преобразованиях
Желательно указывать или определять схему для коннектора, если предполагается использовать функционал неявных преобразований. Неявное преобразование будет работать, если:
- в заголовке указана схема-источник
- в заголовке указана схема-приемник
- в реестре есть конвертор для этой пары схем
Указание схемы может попадать в заголовок неявно (из свойств коннектора или из тела сообщения) или явно через медиатор.
== Схема работы с ресурсами.
Сначала загружаем сам ресурс в шину, который мы будем использовать в маршрутах.
Загружаем ресурс и получаем id, с помощью которого можно и _нужно_ добавить служебную информацию!
Также можно перезагрузить данный ресурс и удалять его из шины.
Также можно загружать служебную информацию, такую как название ресурса, его расширение и т д.
Выгружать весь список ресурсов, и по отдельности выкачивать сам ресурс для анализа.
Также использовать различные сортировки для поиска определенного типа ресурс.
== Руководство по загрузке ресурсов в шину.
*LoadResource.*
Для загрузки ресурса в шину нужно использовать метод loadResource.
параметры:
- resourceValue - сам ресурс, в формате base64
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Body>
<reg:loadResourceRequest>
<reg:resourceValue></reg:resourceValue>
</reg:loadResourceRequest>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/registry-schema-service/">1</response>
</soap:Body>
</soap:Envelope>
----
*GetResource.*
Для выгрузки заранее загруженного ресурса в шину нужно использовать метод getResource.
параметры:
- getResourceRequest - id ресурса, который вернулся при вызове метода LoadResource
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Header/>
<soapenv:Body>
<reg:getResourceRequest>1</reg:getResourceRequest>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
параметры:
- id - это id ресурса
- createdDate - дата создания ресурса
- createdBy - логин, загрузивший ресурс в шину
- editedDate - дата перезагрузки ресурса
- editedBy - логин, перезагрузивший ресурс в шине
- resourceValue - сам ресурс, в формате base64
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<FullResourceType xmlns="http://www.entaxy.ru/registry-schema-service/">
<id>1</id>
<createdDate>12/15/20, 1:11 AM</createdDate>
<createdBy>12/15/20, 1:11 AM</createdBy>
<editedDate>12/15/20, 1:18 AM</editedDate>
<editedBy>12/15/20, 1:18 AM</editedBy>
<resourceValue></resourceValue>
</FullResourceType>
</soap:Body>
</soap:Envelope>
----
*ReloadResource.*
Для перезагрузки ресурса в шину есть метод reloadResource.
параметры:
- id - id ресурса, который вернулся при вызове метода LoadResource
- resourceValue - сам ресурс, в формате base64
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Body>
<reg:ResourceType>
<reg:id>1</reg:id>
<reg:resourceValue></reg:resourceValue>
</reg:ResourceType>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/registry-schema-service/">1</response>
</soap:Body>
</soap:Envelope>
----
*RemoveResource.*
Для удаления ресурса в шине есть метод removeResource.
параметры:
- id - id ресурса, который вернулся при вызове метода LoadResource
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Header/>
<soapenv:Body>
<reg:removeResourceRequest>1</reg:removeResourceRequest>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/registry-schema-service/">1</response>
</soap:Body>
</soap:Envelope>
----
*LoadResourceInfo.*
Для загрузки мета информации ресурса в шине есть метод loadResourceInfo.
параметры:
- idResource - id ресурса, который вернулся при вызове метода LoadResource
- name - имя ресурса вместе с расширением
- version - версия ресурса
- description - описание ресурса
- convertor - является ли ресурс конвертором из одной схемы в другую
- namespace - входное пространство имен
- namespaceOut - выходное пространство имен, используется для трансформаций из одной схемы в другую
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Body>
<reg:loadResourceInfoRequest>
<reg:name>lama.xsd</reg:name>
<reg:idResource>1</reg:idResource>
<reg:version>1.0</reg:version>
<reg:description>lama test</reg:description>
<reg:convertor>false</reg:convertor>
<reg:namespace>http:lama.xsd</reg:namespace>
<reg:namespaceOut>l</reg:namespaceOut>
</reg:loadResourceInfoRequest>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/registry-schema-service/">1</response>
</soap:Body>
</soap:Envelope>
----
*GetResourceInfo.*
Для получения мета информации ресурса в шине есть метод getResourceInfo.
параметры:
- getResourceInfoRequest - id мета информации ресурса, который вернулся при вызове метода LoadResourceInfo
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Header/>
<soapenv:Body>
<reg:getResourceInfoRequest>1</reg:getResourceInfoRequest>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
параметры:
- id - id мета информации ресурса, который вернулся при вызове метода LoadResourceInfo
- idResource - id ресурса, который вернулся при вызове метода LoadResource
- name - имя ресурса вместе с расширением
- version - версия ресурса
- description - описание ресурса
- convertor - является ли ресурс конвертором из одной схемы в другую
- namespace - входное пространство имен
- namespaceOut - выходное пространство имен, используется для трансформаций из одной схемы в другую
- createdDate - дата создания мета информации ресурса
- createdBy - логин, загрузивший мета информацию ресурса в шину
- editedDate - дата перезагрузки мета информации ресурса
- editedBy - логин, перезагрузивший мета информацию ресурса в шине
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getResourceInfoResponse xmlns="http://www.entaxy.ru/registry-schema-service/">
<id>14</id>
<name>lama.xsd</name>
<idResource>14</idResource>
<version>1.0</version>
<description>lama test</description>
<convertor>false</convertor>
<namespace>http:lama.xsd</namespace>
<namespaceOut>false</namespaceOut>
<createdBy>?</createdBy>
<createdDate>12/15/20, 1:33 AM</createdDate>
<editedBy>?</editedBy>
<editedDate>12/15/20, 1:35 AM</editedDate>
</getResourceInfoResponse>
</soap:Body>
</soap:Envelope>
----
*EditResourceInfo.*
Для корректирования мета информации ресурса в шине есть метод еditResourceInfo.
параметры:
- id - id мета информации ресурса, который вернулся при вызове метода LoadResourceInfo
- idResource - id ресурса, который вернулся при вызове метода LoadResource
- name - имя ресурса вместе с расширением
- version - версия ресурса
- description - описание ресурса
- convertor - является ли ресурс конвертором из одной схемы в другую
- namespace - входное пространство имен
- namespaceOut - выходное пространство имен, используется для трансформаций из одной схемы в другую
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Body>
<reg:editResourceInfoRequest>
<reg:id>1</reg:id>
<reg:name>lama.xsd</reg:name>
<reg:idResource>1</reg:idResource>
<reg:version>1.0</reg:version>
<reg:description>lama test</reg:description>
<reg:convertor>false</reg:convertor>
<reg:namespace>http:lama.xsd</reg:namespace>
<reg:namespaceOut>l</reg:namespaceOut>
</reg:editResourceInfoRequest>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/registry-schema-service/">14</response>
</soap:Body>
</soap:Envelope>
----
*RemoveResourceInfo.*
Для удаления мета информации ресурса в шине есть метод removeResourceInfo.
параметры:
- id - id мета информации ресурса, который вернулся при вызове метода LoadResourceInfo
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Header/>
<soapenv:Body>
<reg:removeResourceInfoRequest>1</reg:removeResourceInfoRequest>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/registry-schema-service/">1</response>
</soap:Body>
</soap:Envelope>
----
*GetResourceInfoList.*
Для получения списка мета информации ресурсов в шине есть метод getResourceInfoList.
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Header/>
<soapenv:Body>
<reg:getResourceInfoListRequest/>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getResourceInfoListResponse xmlns="http://www.entaxy.ru/registry-schema-service/">
<ResourceInfoFullType>
<id>1</id>
<name>lama.xsd</name>
<idResource>1</idResource>
<version>1.0</version>
<description>lama test</description>
<convertor>false</convertor>
<namespace>http:lama.xsd</namespace>
<namespaceOut>l</namespaceOut>
<createdBy>?</createdBy>
<createdDate>12/14/20, 10:00 PM</createdDate>
</ResourceInfoFullType>
</getResourceInfoListResponse>
</soap:Body>
</soap:Envelope>
----
*GetResourceInfoListByName.*
Для получения списка мета информации ресурсов по имени ресурса в шине есть метод getResourceInfoListByName.
параметры:
- name - часть имени мета информации ресурса
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Header/>
<soapenv:Body>
<reg:getResourceInfoListByNameRequest>
<reg:name>.xsd</reg:name>
</reg:getResourceInfoListByNameRequest>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getResourceInfoListResponse xmlns="http://www.entaxy.ru/registry-schema-service/">
<ResourceInfoFullType>
<id>1</id>
<name>lama.xsd</name>
<idResource>1</idResource>
<version>1.0</version>
<description>lama test</description>
<convertor>false</convertor>
<namespace>http:lama.xsd</namespace>
<namespaceOut>l</namespaceOut>
<createdBy>?</createdBy>
<createdDate>12/14/20, 10:00 PM</createdDate>
</ResourceInfoFullType>
</getResourceInfoListResponse>
</soap:Body>
</soap:Envelope>
----
*GetResourceInfoListByNamespace.*
Для получения списка мета информации ресурсов по namespace ресурса в шине есть метод getResourceInfoListByNamespace.
параметры:
- namespace - часть namespace мета информации ресурса
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:reg="http://www.entaxy.ru/registry-schema-service/">
<soapenv:Header/>
<soapenv:Body>
<reg:getResourceInfoListByNamespaceRequest>
<reg:namespace>lama</reg:namespace>
</reg:getResourceInfoListByNamespaceRequest>
</soapenv:Body>
</soapenv:Envelope>
----
ответ
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getResourceInfoListResponse xmlns="http://www.entaxy.ru/registry-schema-service/">
<ResourceInfoFullType>
<id>1</id>
<name>lama.xsd</name>
<idResource>1</idResource>
<version>1.0</version>
<description>lama test</description>
<convertor>false</convertor>
<namespace>http:lama.xsd</namespace>
<namespaceOut>l</namespaceOut>
<createdBy>?</createdBy>
<createdDate>12/14/20, 10:00 PM</createdDate>
</ResourceInfoFullType>
</getResourceInfoListResponse>
</soap:Body>
</soap:Envelope>
----

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

View File

@ -0,0 +1,836 @@
= Руководство по управлению коннекторами и профилями в шине.
рофиль(profile)_ - это описание внешней системы в шине.(Например s1).
_Мостовой профиль(bridge-profile)_ - это профиль на другой стороне шины, ведущий через мост в профиль.
(Например s1)
_Коннектор(connector)_ - это связь между интерфейсом, через который может работать система, и профилем.(Например uniform-service, nsi)
оступ(permission)_ - это разрешение на взаимодействие двух систем.(Например для того чтобы система s1 смогла отправить сообщение s2)(/permission-management)
_Учетная запись(account)_ - это учетная запись системы для взаимодействия с шиной.
Для каждой системы должна быть учетная запись для возможности отправления сообщений в шину.
Также есть учетные записи для возможности взаимодействия с управленческим слоем(т. е. для того чтобы управлять коннекторами/профилями/учетными записями/топиками нужна учетная запись с соответствующими правами)(/basic-auth-management)
Коннекторы делятся на входящие и исходящие(in, out), которые отвечают за отправку сообщения в определенный интерфейс и на получение ответа из определенного интерфейса соответственно.
Например, для того чтобы иметь возможность отправить сообщение в soap нужно создать коннектор uniform-service-in-connector, а для того чтобы получить сообщение из soap нужно создать коннектор uniform-service-out-connector.
По адресу _/system-management-service_ находится сам сервис управления коннекторами и профилями в шине.
Для работы внешней системы в шине нужно сначала создать профиль данной системы в шине, потом добавлять к нему необходимые коннекторы и пробрасывать его в необходимые шины.
=== Управление профилями
*СreateProfile.*
Для создания профиля системы нужно вызвать метод createProfile, где вместо “system_uuid” нужно подставить uuid системы, вместо “system_name” - имя системы, “description” описание системы:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:createProfileRequest>
<sys:profileName>{{system_uuid}}</sys:profileName>
<sys:uuid>{{system_uuid}}</sys:uuid>
<!--Optional:-->
<sys:description>{{description}}</sys:description>
</sys:createProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если профиль успешно создался, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*GetProfile.*
Проверить созданный профиль можно с помощью метода getProfile, где вместо “system_uuid” нужно подставить uuid системы:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:getProfileRequest>
<sys:uuid>{{system_uuid}}</sys:uuid>
</sys:getProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (профиль со всеми зависимостями, либо ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<fullProfileType xmlns="http://www.entaxy.ru/system-management-service/">
<profileName>w6</profileName>
<uuid>w6</uuid>
<description>description</description>
<createDate>2020-01-22+03:00</createDate>
<createdBy>System</createdBy>
<type>false</type>
<status>ACTIVE</status>
<connectorList/>
<esbNames/>
</fullProfileType>
</soap:Body>
</soap:Envelope>
----
*GetProfiles*
Получить список профилей, зарегистрированных в шине, можно с помощью метода getProfiles:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:listProfileRequest/>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (список профилей со всеми зависимостями, либо ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<listProfile xmlns="http://www.entaxy.ru/system-management-service/">
<fullProfileType>
<profileName>w6</profileName>
<uuid>w6</uuid>
<description>description</description>
<createDate>2020-01-22+03:00</createDate>
<createdBy>System</createdBy>
<type>false</type>
<status>ACTIVE</status>
<connectorList/>
<esbNames/>
</fullProfileType>
</listProfile>
</soap:Body>
</soap:Envelope>
----
*StopProfile*
Остановить профиль и все его зависимости можно с помощью метода stopProfile, где вместо “system_uuid” нужно подставить uuid системы:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:stopProfileRequest>
<sys:uuid>{{system_uuid}}</sys:uuid>
</sys:stopProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если профиль и его зависимости успешно остановились, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*StartProfile*
Запустить профиль и все его зависимости можно с помощью метода startProfile, где вместо “system_uuid” нужно подставить uuid системы:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:stopProfileRequest>
<sys:uuid>{{system_uuid}}</sys:uuid>
</sys:stopProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если профиль успешно запустился, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*RemoveProfile*
Удалить профиль и все его зависимости можно с помощью метода removeProfile, где вместо “system_uuid” нужно подставить uuid системы(ВНИМАНИЕ!
При удалении профиля также удаляются все связанные с ним коннекторы):
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:stopProfileRequest>
<sys:uuid>{{system_uuid}}</sys:uuid>
</sys:stopProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если профиль и его зависимости успешно удалился, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
=== Управление коннекторами
*GetTemplates*
Для создания коннектора в шине нужно получить список шаблонов(требуются для создания коннекторов) методом getTemplates:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:listTemplateRequest/>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (список шаблонов с параметрами):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<listTemplate xmlns="http://www.entaxy.ru/system-management-service/">
<template>
<templateName>file-out-connector</templateName>
<paramList>
<param>
<name>directionTo</name>
<value>file-to</value>
</param>
</paramList>
</template>
<template>
<templateName>nsi-in-connector</templateName>
<paramList/>
</template>
<template>
<templateName>uniform-service-in-connector</templateName>
<paramList/>
</template>
<template>
<templateName>uniform-service-out-connector</templateName>
<paramList>
<param>
<name>isActive</name>
<value>false</value>
</param>
<param>
<name>queue</name>
<value>soap-root-default</value>
</param>
</paramList>
</template>
</listTemplate>
</soap:Body>
</soap:Envelope>
----
*GetTemplate*
Для создания коннектора в шине нужно получить список шаблонов(требуются для создания коннекторов) методом getTemplate, где “template_name” имя шаблона по которому будет сделан коннектор:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:getTemplateRequest>
<sys:templateName>{{template_name}}</sys:templateName>
</sys:getTemplateRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (шаблон с параметрами):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<template xmlns="http://www.entaxy.ru/system-management-service/">
<templateName>nsi-in-connector</templateName>
<paramList/>
</template>
</soap:Body>
</soap:Envelope>
----
*СreateConnector*
Для создания коннектора в шине нужно вызвать метод createConnector, где templateName - это имя шаблона, полученное из метода getTemplates, system_uuid - это uuid профиля, зарегистрированного в системе ранее, также нужно заполнить список параметров необходимый для создания коннектора(ВНИМАНИЕ! если не заполнить список параметров, то установятся значения по умолчанию) :
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:createConnectorRequest>
<sys:templateName>{{template_name}}</sys:templateName>
<sys:profileUuid>{{system_uuid}}</sys:profileUuid>
<sys:paramList>
<!--Zero or more repetitions:-->
</sys:paramList>
</sys:createConnectorRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если коннектор успешно создался, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*GetConnectors*
Можно просматривать список подключенных коннекторов в шине методом getConnectors:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:listConnectorRequest/>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (список коннкторов с параметрами):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<listConnector xmlns="http://www.entaxy.ru/system-management-service/">
<connector>
<name>nsi-in-connector-w6</name>
<status>ACTIVE</status>
<paramList/>
</connector>
</listConnector>
</soap:Body>
</soap:Envelope>
----
*StartConnector*
Запустить коннектор можно с помощью метода startConnector, где вместо “system_uuid” нужно подставить uuid системы, “template_name” это имя шаблона:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:startConnectorRequest>
<sys:templateName>{{template_name}}</sys:templateName>
<sys:profileUuid>{{system_uuid}}</sys:profileUuid>
</sys:startConnectorRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если коннектор успешно запустился, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*StopConnector*
Остановить коннектор можно с помощью метода stopConnector, где вместо “system_uuid” нужно подставить uuid системы, “template_name” это имя шаблона:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:stopConnectorRequest>
<sys:templateName>{{template_name}}</sys:templateName>
<sys:profileUuid>{{system_uuid}}</sys:profileUuid>
</sys:stopConnectorRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если коннектор успешно остановилась, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*RemoveConnector*
Удалить коннектор можно с помощью метода removeConnector, где вместо “system_uuid” нужно подставить uuid системы, “template_name” это имя шаблона:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:removeConnectorRequest>
<sys:templateName>{{template_name}}</sys:templateName>
<sys:profileUuid>{{system_uuid}}</sys:profileUuid>
</sys:removeConnectorRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если коннектор успешно удалился, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
=== Управление мостовыми профилями
*GetListEsb*
Для получения списка подключенных шин можно с помощью метода getListEsb:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:listEsbRequest/>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (список подключенных шин, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<listEsb xmlns="http://www.entaxy.ru/system-management-service/">
<esbName>test1</esbName>
</listEsb>
</soap:Body>
</soap:Envelope>
----
*CreateBridgeProfile*
Создать профиль, ведущий на мост, можно с помощью метода createBridgeProfile, где “system_uuid” uuid системы, “esb_name” имя подключенной шины:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:createBridgeProfileRequest>
<sys:profileUuid>{{system_uuid}}</sys:profileUuid>
<sys:profileName>{{system_uuid}}</sys:profileName>
<sys:esbName>{{esb_name}}</sys:esbName>
</sys:createBridgeProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если профиль, ведущий на мост, успешно создался, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*StopBridgeProfile*
Остановить профиль, ведущий на мост, можно с помощью метода stopBridgeProfile, где “system_uuid” uuid системы, “esb_name” имя подключенной шины:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:stopBridgeProfileRequest>
<sys:profileUuid>{{system_uuid}}</sys:profileUuid>
<sys:profileName>{{system_uuid}}</sys:profileName>
<sys:esbName>{{esb_name}}</sys:esbName>
</sys:stopBridgeProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если профиль, ведущий на мост, успешно остановился, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*StartBridgeProfile*
Запустить профиль, ведущий на мост, можно с помощью метода startBridgeProfile, где “system_uuid” uuid системы, “esb_name” имя подключенной шины:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:startBridgeProfileRequest>
<sys:profileUuid>{{system_uuid}}</sys:profileUuid>
<sys:profileName>{{system_uuid}}</sys:profileName>
<sys:esbName>{{esb_name}}</sys:esbName>
</sys:startBridgeProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если профиль, ведущий на мост, успешно запустился, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*GetBridgeProfile*
Получить профиль, ведущий на мост, можно с помощью метода getBridgeProfile, где “system_uuid” uuid системы, “esb_name” имя подключенной шины:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:getBridgeProfileRequest>
<sys:profileUuid>{{system_uuid}}</sys:profileUuid>
<sys:profileName>{{system_uuid}}</sys:profileName>
<sys:esbName>{{esb_name}}</sys:esbName>
</sys:getBridgeProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (профиль, ведущий на мост, пустой ответ):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<fullBridgeProfileType xmlns="http://www.entaxy.ru/system-management-service/">
<profileName>w6</profileName>
<status>ACTIVE</status>
<esbName>test1</esbName>
</fullBridgeProfileType>
</soap:Body>
</soap:Envelope>
----
*RemoveBridgeProfile*
Удалить профиль, ведущий на мост, можно с помощью метода removeBridgeProfile, где “system_uuid” uuid системы, “esb_name” имя подключенной шины:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:removeBridgeProfileRequest>
<sys:profileUuid>{{system_uuid}}</sys:profileUuid>
<sys:profileName>{{system_uuid}}</sys:profileName>
<sys:esbName>{{esb_name}}</sys:esbName>
</sys:removeBridgeProfileRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если профиль, ведущий на мост, успешно удален, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*GetBridgeProfiles*
Для получения списка профилей, ведущих на мост, можно использовать метод getBridgeProfiles:(ВНИМАНИЕ! запрос покажет список проброшенных профилей на ТЕКУЩЕЙ шине)
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:getBridgeProfilesRequest/>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (список профиль, ведущих на мост, пустой ответ):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getBridgeProfilesResponse xmlns="http://www.entaxy.ru/system-management-service/">
<fullBridgeProfileType>
<profileName>w6</profileName>
<status>ACTIVE</status>
<esbName>test1</esbName>
</fullBridgeProfileType>
</getBridgeProfilesResponse>
</soap:Body>
</soap:Envelope>
----
=== Управление доступами
*CreatePermission*
Создать доступ одной системы к другой, можно с помощью метода createPermission, где “objectUuid” uuid системы, которой нужно дать доступ, “subjectUuid” - uuid системы, к которой нужно дать доступ:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:createPermissionRequest>
<sys:objectUuid>{{objectUuid}}</sys:objectUuid>
<sys:subjectUuid>{{subjectUuid}}</sys:subjectUuid>
</sys:createPermissionRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если доступ, успешно создался, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*RemovePermission*
Удалить доступ одной системы к другой, можно с помощью метода removePermission, где “objectUuid” uuid системы, которой нужно дать доступ, “subjectUuid” - uuid системы, к которой нужно дать доступ:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:removePermissionRequest>
<sys:objectUuid>{{objectUuid}}</sys:objectUuid>
<sys:subjectUuid>{{subjectUuid}}</sys:subjectUuid>
</sys:removePermissionRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если доступ, успешно удалился, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*GetPermissionsByObject*
Получить список систем, доступ к которым от данной системы разрешен, можно с помощью метода getPermissionByObject, где “objectUuid” uuid системы:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:getPermissionsByObjectRequest>
<sys:uuid>{{objectUuid}}</sys:uuid>
</sys:getPermissionsByObjectRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (список систем, которым данная система может отправлять сообщения, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getPermissionsByObjectResponse xmlns="http://www.entaxy.ru/system-management-service/">
<profileType>
<uuid>r2</uuid>
</profileType>
<profileType>
<uuid>active</uuid>
</profileType>
</getPermissionsByObjectResponse>
</soap:Body>
</soap:Envelope>
----
*GetPermissionsBySubject*
Получить список систем, доступ которым разрешен к данной системе, можно с помощью метода getPermissionBySubject, где “subjectUuid” uuid системы:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:getPermissionsBySubjectRequest>
<sys:uuid>{{subjectUuid}}</sys:uuid>
</sys:getPermissionsBySubjectRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (список систем, для которых данная система доступна для отправки сообщений, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getPermissionsBySubjectResponse xmlns="http://www.entaxy.ru/system-management-service/">
<profileType>
<uuid>r2</uuid>
</profileType>
</getPermissionsBySubjectResponse>
</soap:Body>
</soap:Envelope>
----
*CreatePermissionForObjectRequest*
Создать сразу несколько доступов, которым разрешено отправлять сообщения от данной системы, можно с помощью метода сreatePermissionForObjectRequest, где “objectUuid” это uuid системы, от которой буду исходить сообщения, “subjectUuid1”, “subjectUuid2” и т д, это uuid систем, которым будут отправлять сообщения:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:createPermissionForObjectRequest>
<sys:objectUuid>{{objectUuid}}</sys:objectUuid>
<!--Zero or more repetitions:-->
<sys:subjectUuid>{{subjectUuid1}}</sys:subjectUuid>
<sys:subjectUuid>{{subjectUuid2}}</sys:subjectUuid>
</sys:createPermissionForObjectRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если доступа, успешно создались, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----
*CreatePermissionForSubjectRequest*
Создать сразу несколько доступов, которым разрешено отправлять сообщения в данную систему, можно с помощью метода сreatePermissionForSubjectRequest, где “objectUuid1”, “objectUuid2” и т д - это uuid систем, от которых буду исходить сообщения, “subjectUuid” - это uuid системы, которой будут отправлять сообщения:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sys="http://www.entaxy.ru/system-management-service/">
<soapenv:Header/>
<soapenv:Body>
<sys:createPermissionForSubjectRequest>
<!--Zero or more repetitions:-->
<sys:objectUuid>{{objectUuid1}}</sys:objectUuid>
<sys:objectUuid>{{objectUuid2}}</sys:objectUuid>
<sys:subjectUuid>{{subjectUuid}}</sys:subjectUuid>
</sys:createPermissionForSubjectRequest>
</soapenv:Body>
</soapenv:Envelope>
----
Где ответом будет (“true” - если доступа, успешно создались, ошибка и ее описание):
[source,xml]
----
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="http://www.entaxy.ru/system-management-service/">true</response>
</soap:Body>
</soap:Envelope>
----

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View File

@ -0,0 +1,555 @@
= Rest сервис Topic-management
=== Rest сервис для работы с топиками.
Сервис состоит из 2-х контекстов:
- _topic-management_ - управление топиками (создание/изменение/удаление)
- _topic-subscription_ - клиентский сервис подписки и публикации сообщения
При смене контекста в конфигурационных файлах требуется перераздать права на данный сервис.
Схема работы подписок
image::Topic_publish_diagram.png[]
Схема работы нотификаций
image::Scheme_of_work_notifications(events).png[]
=== Права
Право доступа в сервис _topic-management_
Для доступа к сервису _topic-management_ у аккаунта должно быть право доступа в данный сервис.
По умолчанию право на доступ к сервису есть у пользователя _admin_.
Используя данного пользователя в сервисе _permission-management_ можно раздать права на аккаунты систем.
Параметры для выдачи аккаунту прав на сервис:
- _objectId_: идентификатор учётной записи
- _objectType_: account
- _subjectId_: topic-management
- _subjectType_: service
Право manage сервиса _topic-subscription_
Для доступа к менеджерским функциям сервиса _topic-subscription_ у аккаунта должно быть право manage - данное право открывает доступ к управлению подписками.
Функционал управления подписками реализован в методах _subscribe_ и _unsubscribe_, пример использования приведён в подпунктах “Массовая обработка при наличии права manage для данного сервиса”.
Параметры для выдачи аккаунту права _manage_:
- _objectId_: идентификатор учётной записи
- _objectType_: account
- _subjectId_: topic-subscription
- _subjectType_: service
- _action_: manage
=== Конфигурационные файлы
Конфигурационные файлы по умолчанию хранятся в папке сервера <karaf_home>\etc\
- _ru.entaxy.esb.system.event.handler.cfg_
[source,properties]
----
# максимальное колчичество попыток отправить сообщение в очередь
# почитать подробнее можно в https://camel.apache.org/components/latest/eips/dead-letter-channel.html#deadLetterChannel-Redelivery
redelivery.maximumRedeliveries=-1
# время между попытками отправить сообщение в очередь
redelivery.redeliveryDelay=5000
#cron - по умолчанию запускается каждые 00:00:00,
#cron выражение использует знак "+" как разделитель для модуля quartz2l
quirtz.job.clean.cron=0+0+0+*+*+?+*
----
- _ru.entaxy.esb.system.event.rest.cfg_
[source,properties]
----
service.host=http://0.0.0.0
service.port.management=9090
#Рутовый контекст управляющего сервиса, при изменении требуется перераздать права для данного сервиса
service.root.path.management=/topic-management
service.port.subscription=9092
#Рутовый контекст клиентского сервиса, при изменении требуется перераздать права для данного сервиса
service.root.path.subscription=/topic-subscription
----
=== Методы topic-management:
- _create_ - создать топик
При создании и изменении топика, есть возможность передать списки систем, которым доступна подписка или публикация в данном топике.
Запрос:
_POST server:9090/topic-management/create_
Тело
[source,json]
----
{
"topicName": "boomNews",
"possibleSubscribers" : ["systemUuid1", "systemUuid2"],
"possiblePublishers" : ["systemUuid3", "systemUuid4"]
}
----
Ответ:
Статус 201
Тело
[source,json]
----
{
"title": "Topic created",
"topicName": "<topic_name>",
"subscriberErrors": {
"systemNotFound": [
"<system_uuid>"
]
},
"publisherErrors": {
"systemNotFound": []
}
}
----
- update - изменить топик (название не меняется, так как на него завязана сама очередь в брокере)
Запрос:
_POST server:9090/topic-management/update_
Тело
[source,json]
----
{
"topicName": "boomNews",
"possibleSubscribers" : ["systemUuid1", "systemUuid2"],
"possiblePublishers" : ["systemUuid3", "systemUuid4"]
}
----
Ответ:
Статус 201
Тело
[source,json]
----
{
"title": "Topic updated",
"topicName": "<topic_name>",
"subscriberErrors": {
"systemNotFound": [
"<system_uuid>"
]
},
"publisherErrors": {
"systemNotFound": []
}
}
----
- delete - топик помечается как удалённый
Запрос:
_POST server:9090/topic-management/delete_
Тело
[source,json]
----
{
"topicName": "boomNews"
}
----
Ответ:
Статус 200
Тело
[source,json]
----
{
"title": "Topic deleted",
"topicName": "<topic_name>"
}
----
- clean - очистка хранилища топиков
Окончательное удаление топиков, помеченных как удалённые.
Запрос:
_POST server:9090/topic-management/clean_
Ответ:
Статус 200
Тело
[source,json]
----
{
"title": "Cleaned",
"topicDeleted": "<count_of_deleted_topics>"
}
----
=== Методы topic-subscription:
- _subscribe_ - подписаться на топик
Запрос:
_POST server:9090/topic-subscription/subscribe_
Тело
[source,json]
----
{
"topicName": "boomNews",
"subscriptionType": "PUSH"
}
----
Ответ:
Статус 201
Тело
[source,json]
----
{
"title": "Subscription created",
"topicName": "<topic_name>",
"systemName": "<system_name>",
"subscriptionType": "<subscription_type>"
}
----
=== Массовая обработка при наличии права manage для данного сервиса.
- _subscribe_ - подписаться на топик
Запрос:
_POST server:9092/topic-subscription/subscribe_
Тело
[source,json]
----
{
"topicName": "boomNews",
"systemUuids": [
{
"systemUuid": "NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN",
"subscriptionType": "PUSH"
},
{
"systemUuid": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"subscriptionType": "PULL"
},
{
"systemUuid": "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY",
"subscriptionType": "PULL"
}
]
}
----
Ответ:
Статус 200
Тело
[source,json]
----
[
{
"title": "Internal Server Error",
"detail": "System not found NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN",
"reason": "javax.persistence.NoResultException: No entity found for query"
},
{
"title": "Subscription created",
"topicName": "ooooo111-ff6e-4219-a878-bff120c495f1",
"systemUUID": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"subscriptionType": "PULL"
},
{
"title": "Forbidden",
"detail": "No permission to subscribe for system YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY"
}
]
----
- _unsubscribe_ - отписаться от топика
Запрос:
_POST server:9090/topic-subscription/unsubscribe_
Тело
[source,json]
----
{
"topicName": "boomNews"
}
----
Ответ:
Статус 200
Тело
[source,json]
----
{
"title": "Subscription deleted",
"topicName": "<topic_name>",
"systemName": "<system_name>"
}
----
=== Массовая обработка при наличии права manage для данного сервиса.
Запрос:
_POST server:9092/topic-subscription/unsubscribe_
Тело
[source,json]
----
{
"topicName": "boomNews",
"systemUuids": [
{
"systemUuid":"NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN",
"subscriptionType": "PUSH"
},
{
"systemUuid": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"subscriptionType": "PULL"
},
{
"systemUuid": "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY",
"subscriptionType": "PULL"
}
]
}
----
Ответ:
Статус 200
Тело
[source,json]
----
[
{
"title": "Internal Server Error",
"detail": "System not found NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN",
"reason": "javax.persistence.NoResultException: No entity found for query"
},
{
"title": "Subscription deleted",
"topicName": "ooooo111-ff6e-4219-a878-bff120c495f1",
"systemUUID": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
},
{
"title": "Subscription not found",
"topicName": "ooooo111-ff6e-4219-a878-bff120c495f1",
"systemUUID": "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY"
}
]
----
- _publish_ - опубликовать событие
Запрос:
_POST server:9090/topic-subscription/publish_
Тело
[source,json]
----
{
"topicName": "boomNews", "message": "messageText2"
}
----
Ответ:
Статус 200
Тело
{
"title": "Message published",
"topicName": "<topic_name>"
}
=== Примеры ответов при ошибке
- _Передан некорректный JSON или логин не определён_
Статус 400
Тело
[source,json]
----
{
"title": "Incorrect input parameters",
"detail": "Cannot parse incoming JSON or login/system not defined"
}
----
- _Подписка не найдена_
Статус 404
Тело
[source,json]
----
{
"title": "Subscription not found",
"topicName": "${exchangeProperty.topicName}",
"systemUUID": "${header.X-SystemUuid}"
}
----
- _Топик не зарегистрирован_
Статус 400
Тело
[source,json]
----
{
"title": "Topic not registered",
"topicName": "${exchangeProperty.topicName}"
}
----
- _Система не найдена_
Статус 500
Тело
[source,json]
----
{
"title": "Internal Server Error",
"detail": "System not found ${header.X-SystemUuid}",
"reason": "${exception.stacktrace}"
}
----
- _Неизвестный тип подписки_
Статус 500
Тело
[source,json]
----
{
"title": "Internal Server Error",
"detail": "Unknown subscription type ${exchangeProperty.subscriptionType}",
"reason": "${exception.stacktrace}"
}
----
- _Нет прав на выполнение запрошенной операции_
Статус 403
Тело
[source,json]
----
{
"title": "Forbidden",
"detail": "No permission to subscribe"
}
----
- _Неизвестная ошибка_
Статус 500
Тело
[source,json]
----
{
"title": "Internal Server Error",
"detail": "Unknown exception",
"reason": "${exception.stacktrace}"
}
----
== Работа модуля топиков в кластере
=== Подписки
*PULL подписки не реализованы!*
Для реализации подписки используются _durable shareable_ подписчики _Apache Artemis_ топиков, а для доставки сообщений из топиков создаются специальные маршруты отправляющие сообщения в подписанную систему(PUSH-подписка). При работе в кластере системой создаются дублирующие маршруты на каждом узле, которые работают в конкурентном режиме, т.е. при падении одного из узлов доставка сообщений будет производиться оставшимися узлами.
Работа в кластере обеспечивается через компоненты _Apache Felix Event Admin_, реализующий рассылку служебных событий по топикам внутри узла,
и _Apache Karaf Cellar_ с интеграцией с _Event Admin_, реализующий рассылку данного события по всем узлам кластера. При создании/удалении подписки система создаёт соответствующее событие и отправляет в специальный топик _subscription_, далее подписчики на всех узлах, входящих в кластер, получают и обрабатывают данное событие.
=== Настройки
Настройки производятся на любом узле либо на мастер узле, в зависимости от настроек кластера.
Для синхронизации топика _subscription_ в конфигурационном файле _org.apache.karaf.cellar.groups.cfg_, нужно добавить строки:
[source,properties]
----
default.event.blacklist.inbound = none
default.event.blacklist.outbound = none
default.event.whitelist.inbound = subscription
default.event.whitelist.outbound = subscription
----
Далее если _Apache Karaf Cellar_ настроен правильно, то конфигурационные файлы _org.apache.karaf.cellar.groups.cfg_ должны синхронизироваться и строки, представленные выше, появятся на всех узлах.
Если синхронизация конфигурационных файлов не проходит, можно проверить статус _cellar_ продюсера командой:
cluster:producer-status
если выключен, то можно включить командой:
cluster:producer-start
=== Удаление топиков
Удаление топиков происходит в 2 этапа
- При вызове метода _delete_ топик помечается в БД, как удалённый
- По расписанию запускается задача (по умолчанию раз в сутки в 00:00), которая удаляет топик окончательно вместе с подписками, правами и консьюмерами.
Либо очистка запускается вручную вызовом метода _clean_ сервиса _topic-management_
Если до очистки системы изменить топик помеченный как удалённый или попытаться создать его заново, то восстановится старый топик
=== Плановая задача по очистке топиков
Т.к. удаление топиков происходит в 2 этапа, с помощью планировщика _Quartz2_, работающего в кластере, запускается задача по очистке. Запуск происходит в конкурентном режиме, узел первый запустивший задачу получает приоритет, на остальных узлах задача останавливается до следующего запуска.
Частота запуска задачи настраивается в конфигурационном файле _ru.entaxy.esb.system.event.handler.cfg_ в свойстве quirtz.job.clean.cron=0+0+0+*+*+?+*
с помощью cron выражения. Особенность cron выражения для quartz в том что “++” используется, как разделитель.

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB