initial public commit

This commit is contained in:
2021-08-25 14:12:51 +03:00
commit 48e08be102
703 changed files with 64454 additions and 0 deletions

57
.gitignore vendored Normal file
View File

@@ -0,0 +1,57 @@
# These are some examples of commonly ignored file patterns.
# You should customize this list as applicable to your project.
# Learn more about .gitignore:
# https://www.atlassian.com/git/tutorials/saving-changes/gitignore
# Compiled Java class files
*.class
# Log files
*.log
# Package files
*.jar
# Maven
target/
dist/
dependency-reduced-pom.xml
# JetBrains IDE
.idea/
*.iml
*.im
# Unit test reports
TEST*.xml
# Generated by MacOS
.DS_Store
# Generated by Windows
Thumbs.db
# Applications
*.app
*.exe
*.war
# Large media files
*.mp4
*.tiff
*.avi
*.flv
*.mov
*.wmv
# OS or Editor folders
.cache
.project
.settings
.tmproj
*.cache
# Eclipse project file
*.classpath
.tern-project

91
README.md Normal file
View File

@@ -0,0 +1,91 @@
# entaxy-esb
Подробная документация: [описание системы](documentation/entaxy_main.adoc).\
Инструкция по установке: [установка](documentation/installation/installation-table-of-contents.ru.adoc).
- **connector** - коннекторы к системам/шлюзам/прочему - пополняемая часть продукта
- **file-connector** - (Бородина Валерия) модуль для работы с системами, которые работают через файловую систему(собирает сообщения в течение часа и собирает их в архив)
- **1c-exchange-service** - (Алексей Князев, Бородина Валерия) модуль обработки сообщений, универсальный сервис 1с
- **1c-exchange-endpoint** - выставленный универсальный soap-сервис 1с
- **1c-exchange-service-endpoint** - выставленный служебный soap-сервис 1с
- **connector** - хранятся входящий и исходящий коннектор к 1c-exchange-endpoint и 1c-exchange-service-endpoint
- **support** - маршруты, которые нужны для корректной работы коннектора
- **features** - там вообще должна быть одна фича, которая подтягивает фичи по отдельным компонентам. Установив ее мы и устанавливаем продукт в караф
- **integrations** - (Алексей Князев) рукотворные интеграции, сделанные без продукта
- **nsi** - (Алексей Князев, Бородина Валерия) модуль обработки сообщений nsi
- **nsi-soap** - (Алексей Князев) модуль с выставленным soap nsi
- **db-connector** - (Алексей Князев) коннектор к промежуточной базе, преобразует xml в java объекты и потом через jpa сохраняет в бд, и также обратно
- **db-hyperjaxb3-naming-extension** - (Алексей Князев) - плагин для плагина hyperjaxb3 который делает более человекочитаемые имена для генерируемых из xsd столбцов и таблиц
- **storage** - (Моисеев Михаил) все, что относится к хранению данных с общей точки зрения
- **system** - (Андрей Филиппов) собственно, продукт
- **auth** - (Сергей Крючков, Моисеев Михаил) все, что относится к авторизации, включая бандлы для конкретных схем авторизации, общий интерсептор для CXF и т.д.
- **bridge** - (Моисеев Михаил) мост между шинами с использованием брокеров
- **common** - общие библиотеки
- **core** - ядро системы, что там будет, пока сложно конкретизировать, но что-то наверняка будет
- **dispatcher** -
- **events** - (Моисеев Михаил) работа с топиками, наша реализация доставки сообщений
- **permission** - (Моисеев Михаил) права доступа
- **template** - (Бородина Валерия) работа с шаблонами для создания профилей, коннекторов и т д
- **error-handler** - (Сергей Крючков) маршруты для обработки ошибок и вспомогательные классы.
- **deployer** - (Бородина Валерия) все, что относится к процессу обработки данных из gui, их преобразования в blueprint и деплоя этого blueprint в шину
- **cellar-deployer** - (Бородина Валерия) деплой blueprint в кластер карафа с помощью cellar
- **deployer-api** - (Моисеев Михаил, Бородина Валерия) интерфейс deployer
- **nexus-deployer** - (Бородина Валерия) деплой сгенерированных blueprint в nexus
- **file-system-deployer** - (Моисеев Михаил) деплой сгенерированных blueprint в файловую систему
- **files** - (Алексей Князев) сервис больших пакетов
- **registry** - (Моисеев Михаил) реестры, определенные в продукте, должна содержать systems, system-groups, services для реализаций конкретных реестров
- **systems** - описание внешней системы в нашей.
- **system-groups** - группы систем, обобщённые по какому-либо признаку
- **profile-commons** - может быть связан коннектором с точкой коммуникации.
- **processes** -
- **service** - это точка коммуникации. (что-то, развернутое под CXF)
- **connectors** - нечто, что связывает профиль с точкой коммуникации
- **system-management** - (Бородина Валерия) управление системами, профилями и коннекторами систем
- **transformer** - видимо, друг deploer'а, реализация трансформаций данных gui -> blueprint
- **test** - тесты для postman, функциональность которая не пошла в дело
**Правила работы с репозиторием**
Коммиты в мастер глубоко нежелательны, но если нельзя поступить по-другому, предупредите коллег в общем чате с описанием причины.
**Кратко:**
Feature branching - любая разработка ведётся в отдельных ветках(бранчуемся от master/release) после чего делаем pull request.
**Полно:**
**Ветки:**
- *master* - develop ветка от неё бранчуемся, в неё сливаемся
- *release-<version>* - стабильная релизная ветка от неё бранчуемся в случае hotfix-ов.
Условия хранения релизной ветки:
1. заказчик платит за поддержку
2. не истек срок нашей поддержки этого релиза
3. заказчик не произвел переход на новый релиз
- *feature-branch* - ветки разработок, хранится до проверки и слияния с целевой веткой
Именование веток:
* номером задачи из Jira
* особо осмысленным кратким названием функционала
- *hotfix-branch* - ветки для hotfix-ов, хранится аналогично *feature-branch*
Именование веток - префикс "hotfix-" далее:
* номер задачи из Jira
* особо осмысленное краткое название исправления
**Pull request**
- **Для фиксов и мелких доработок** назначаем в рецензенты: ведущего разработчика - *Алексея Князева* и *ответственных за функционал/заинтересованных лиц*
ответственных и заинтересованных можно посмотреть в описании проекта выше.
- **Для крупных доработок** к описанным выше лицам добавляем *Андрея Филиппова* и *Сергея Старовойтенкова*
Если не планируется больше доработок в ветке направленной на мерж, при создании pull request-а помечаем **Close branch**

BIN
documentation/Entaxy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

@@ -0,0 +1,203 @@
= План создания коннектора
Для создания полноценного коннектора необходимо создать bundle с такой структурой:
. _src/main/resource/template/<название endpoint>-in-connector.ftl_
. _src/main/resource/template/<название endpoint>-out-connector.ftl_
. _src/main/resource/OSGI-INF/blueprint/camel-context.xml_
. _pom.xml_
== Создание шаблона входного коннектора(in-connector)
_Входной коннектор_ - это коннектор, который получает сообщения из вне Entaxy.
аблон входного коннектора_ - ftl файл, на основе которого шина будет создавать индивидуальные входные коннекторы для каждой системы, с помощью подстановки параметров, полученных от пользователя.
Пример созданного шаблона, где название endpoint - _example_:
_src/main/resource/template/example-in-connector.ftl_
[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<bean id="inConnector" class="ru.entaxy.esb.system.profile.commons.connectors.in.QueueInConnectorImpl">
<property name="endpointName" value="example"/>
<property name="systemName" value="[=systemName]"/>
</bean>
<service ref="inConnector" auto-export="interfaces">
<service-properties>
<entry key="endpointName" value="example"/>
<entry key="systemName" value="[=systemName]"/>
</service-properties>
</service>
<camelContext id="example-in-connector-[=systemName]-context" xmlns="http://camel.apache.org/schema/blueprint">
<route id="example-[=systemName]-connector">
<from uri="direct-vm:example-in-connector-[=systemName]"/>
<setHeader name="ESB.Endpoint.Name">
<constant>example</constant>
</setHeader>
<to uri="direct-vm:profile-[=systemName]-exit-dispatcher"/>
</route>
</camelContext>
</blueprint>
----
Создание и публикация бина: для связи коннектора с профилем, возможности получить весь список коннекторов определенного типа.
[source, xml]
----
<bean id="inConnector" class="ru.entaxy.esb.system.profile.commons.connectors.in.QueueInConnectorImpl">
<property name="endpointName" value="example"/>
<property name="systemName" value="[=systemName]"/>
</bean>
<service ref="inConnector" auto-export="interfaces">
<service-properties>
<entry key="endpointName" value="example"/>
<entry key="systemName" value="[=systemName]"/>
</service-properties>
</service>
----
Маршрут коннектора, который полученные сообщения отправляет на выходную точку профиля, к которой прикрепляется сгенерированный пользователем route.
[source, xml]
----
<route id="example-[=systemName]-in-connector">
<from uri="direct-vm:example-in-connector-[=systemName]"/>
<setHeader name="ESB.Endpoint.Name">
<constant>example</constant>
</setHeader>
<to uri="direct-vm:profile-[=systemName]-exit-dispatcher"/>
</route>
----
Начало маршрута входного коннектора может начинаться не с _"direct-vm:example-in-connector-[=systemName]"_, а получать сообщения, например, через определенную папку на диске.
Для того чтобы отправить сообщение в коннектор необходимо, получить все коннекторы определенного типа (example):
[source,xml]
----
<bean id="inConnectorRegistry" class="ru.entaxy.esb.system.profile.commons.ConnectorRegistry" activation="eager"/>
<reference-list id="inConnector" interface="ru.entaxy.esb.system.profile.commons.connectors.in.InConnector"
filter="(endpointName=example)" availability="optional">
<reference-listener ref="inConnectorRegistry"
bind-method="register" unbind-method="unregister"/>
</reference-list>
----
И отправлять сообщения с помощью:
[source,xml]
----
<bean ref="inConnectorRegistry" method="send"/>
----
== Создание шаблона выходного коннектора(out-connector)
_Выходной коннектор_ - это коннектор, который отправляет сообщения из Entaxy в систему (вне Entaxy).
аблон выходного коннектора_ - ftl файл, на основе которого шина будет создавать индивидуальные выходные коннекторы для каждой системы, с помощью подстановки параметров, полученных от пользователя.
Пример созданного шаблона, где название endpoint - _example_:
_src/main/resource/template/example-out-connector.ftl_
[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<reference id="pooledConnectionFactory" interface="javax.jms.ConnectionFactory"/>
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
</bean>
<bean id="exampleConnector" class="ru.entaxy.esb.system.profile.commons.connectors.out.QueueOutConnectorImpl">
<property name="endpointName" value="example"/>
<property name="systemName" value="[=systemName]"/>
</bean>
<service ref="exampleConnector" auto-export="interfaces">
<service-properties>
<entry key="endpointName" value="example"/>
<entry key="systemName" value="[=systemName]"/>
</service-properties>
</service>
<camelContext id="example-out-connector-[=systemName]-context" xmlns="http://camel.apache.org/schema/blueprint"
errorHandlerRef="commonErrorHandler">
<errorHandler id="commonErrorHandler" redeliveryPolicyRef="noRedelivery"
type="DeadLetterChannel" deadLetterUri="direct-vm:commonErrorEndpoint"/>
<redeliveryPolicyProfile id="noRedelivery" disableRedelivery="true"/>
<route id="example-out-connector">
<from uri="direct-vm:example-out-connector-[=systemName]"/>
<log message="Message ${headers} send to system" loggingLevel="TRACE"/>
<toD uri="jms:queue:example-[=systemName]?exchangePattern=InOnly&amp;priority=${headers.SOAPJMS_HEADER_priority}"/>
</route>
</camelContext>
</blueprint>
----
Создание и публикация бина: для связи коннектора с профилем, возможности получить весь список коннекторов определенного типа.
[source, xml]
----
<bean id="exampleOutConnector" class="ru.entaxy.esb.system.profile.commons.connectors.out.QueueOutConnectorImpl">
<property name="endpointName" value="example"/>
<property name="systemName" value="[=systemName]"/>
</bean>
<service ref="exampleOutConnector" auto-export="interfaces">
<service-properties>
<entry key="endpointName" value="example"/>
<entry key="systemName" value="[=systemName]"/>
</service-properties>
</service>
----
Маршрут выходного коннектора *должен* стартовать с:
[source,xml]
----
<from uri="direct-vm:example-out-connector-[=systemName]"/>
----
== Публикация созданных шаблонов
Необходимо опубликовать osgi сервис с информацией об созданных шаблонах для того, чтобы механизм создания коннекторов увидел их.
_src/main/resource/OSGI-INF/blueprint/camel-context.xml_
[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<!--template in connector-->
<bean id="inTemplate" class="ru.entaxy.esb.system.core.template.TemplateImpl">
<property name="bundleContext" ref="blueprintBundleContext"/>
<property name="templateName" value="example-in-connector"/>
<property name="params">
<map>
<entry key="param" value="false"/>
</map>
</property>
</bean>
<service interface="ru.entaxy.esb.system.core.template.Template" ref="inTemplate"/>
<!--template out connector-->
<bean id="outTemplate" class="ru.entaxy.esb.system.core.template.TemplateImpl">
<property name="bundleContext" ref="blueprintBundleContext"/>
<property name="templateName" value="example-out-connector"/>
<property name="params">
<map>
<entry key="param" value="false"/>
</map>
</property>
</bean>
<service interface="ru.entaxy.esb.system.core.template.Template" ref="outTemplate"/>
</blueprint>
----
xref:../core/system-managment/Users-manual-System-management.adoc[Информация о создании коннекторов со стороны пользователя]

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

View File

@@ -0,0 +1,86 @@
= Используемые служебные заголовки Entaxy
ENTAXY_ - глобальный формат заголовков, который используется не только в рамках коннектора. Используется во всём процессе прохождения пакета, так же может быть принят извне.
NTX_ - внутренний формат заголовков в конкретном коннекторе, носит служебный характер.
Например _NTX_Origin_ - служит для идентификации имени контура шины при прохождении пакета через мост.
|===
|Имя заголовка |Описание |Возможные значения |Обязательность
|X-ForwardedUser
|логин аккаунта, проставляется с помощью _nginx_
|
|true
|X-ForwardedUserId
|внутренний id аккаунта, проставляется с помощью _ru.entaxy.esb.system.auth.basic.interceptor.SystemInterceptor_
|
|true
|X-SystemName
|имя системы, полученное при авторизации с помощью _ru.entaxy.esb.system.auth.basic.interceptor.SystemInterceptor_
|
|true
|X-SystemUuid
|uuid системы, полученное при авторизации с помощью _ru.entaxy.esb.system.auth.basic.interceptor.SystemInterceptor_
|
|true
|X-SystemId
|внутренний id системы, полученное при авторизации с помощью _ru.entaxy.esb.system.auth.basic.interceptor.SystemInterceptor_
|
|true
|ENTAXY_EndpointName
|Имя коннектора, через который было получено сообщение
|US-SOAP, US-File, US-JMS, ....
|true
|ENTAXY_ConnectorType
|Тип коннектора, через который было получено сообщение
|uniform-service
|true
|ENTAXY_ConnectorName
|Имя коннектора, через который было получено сообщение
|
|true
|ENTAXY_Source
|Имя отправителя
|
|true
|ENTAXY_SourceType
|Tип отправителя
|system.name, system-group.name, queue.name, topic.name
|false
|ENTAXY_Destination
|Имя получателя
|
|false
|ENTAXY_DestinationType
|Tип получателя
|system.name, system-group.name, queue.name, topic.name
|false
|ENTAXY_Priority
|Приоритет сообщения
|0-9
|false
|ENTAXY_ContentType
|Тип сообщения
|application/xml, message/external-body
|false
|ENTAXY_EmptyContent
|Является ли сообщение пустым
|true; false
|false
|===

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,76 @@
= Активный режим коннектора
image::US-active.png[]
== Сервис для отладки активного коннектора
Поднимается на endpoint _/active_connector_test_consumer_
при выставленной настройке _active.mode.dev=true_ в файле конфигураций _uniform.service.support.cfg_
== Requests Examples
POST http://192.168.122.83:8181/cxf/uniform-exchange
==== SEND MESSAGE:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.entaxy.ru/ExchangeTypes/1.0">
<soapenv:Header/>
<soapenv:Body>
<ns:packets>
<ns:packet>
<ns:header>
<ns:messageUUID>b7e6aab7-8f02-443c-8f67-e2d638dd4da0</ns:messageUUID>
<ns:source>
<ns:id>s1</ns:id>
</ns:source>
<ns:destination>
<ns:id>s2</ns:id>
</ns:destination>
</ns:header>
<ns:content>
<test>
<hello_world/>
</test>
</ns:content>
</ns:packet>
</ns:packets>
</soapenv:Body>
</soapenv:Envelope>
----
==== GET MESSAGE:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.entaxy.ru/ExchangeTypes/1.0">
<soapenv:Header/>
<soapenv:Body>
<ns:request>
<ns:destination>
<ns:id>s2</ns:id>
<ns:type>system.name</ns:type>
</ns:destination>
<ns:limitCount>1</ns:limitCount>
<ns:limitSize>0</ns:limitSize>
</ns:request>
</soapenv:Body>
</soapenv:Envelope>
----
==== ACK MESSAGE:
[source,xml]
----
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.entaxy.ru/ExchangeTypes/1.0">
<soapenv:Header/>
<soapenv:Body>
<ns:uuids>
<ns:uuid>{{message_uuid}}</ns:uuid>
</ns:uuids>
</soapenv:Body>
</soapenv:Envelope>
----

View File

@@ -0,0 +1,35 @@
= IGNITE
IgniteAggregationRepository сделано на основе JdbsAggregationRepository
документация https://help.talend.com/reader/Uc2IlRuFVfGrjaFPdRI7kA/fBdqK2kf6iIkLHQf9nLh6g
Есть некоторые внутренние баги karaf, которые не позволяют установить некоторые ignite фичи в караф
https://github.com/apache/ignite/blob/fd921a233d35408883695419b6f9979ac674d1b9/modules/osgi-karaf/src/main/resources/features.xml#L87
В карафе поднимается ignite, с рабочей директорией, прописанной в ru.entaxy.esb.ignite.cfg,
в параметре ignite.work.directory.path. Это место, где игнайт
создает для себя все, что нужно, и будет хранить данные.
Ignite настроен с сохранением персисетнтности данных(сохранением их на диск) и
созданием реплицации(бэкапов) на других узлах кластера.(при потере одной ноды,
другие восстановят данные, которе хранились на текущем узле)
IGNITE_QUIET=false - параметр необходимый для того, чтобы игнайт не писал информацию о себе в лог,
для того что бы параметр применился, необходимо выставить setGridLogger,
смогла установить в караф только JclLogger.
**AggregationProcessor**
AggregationProcessor стандартный, не расчитан на работу в кластере из-за чего пришлось вытаскивать исходники
и редактировать сам процессор.(AggregationProcessorWithRestoreTimeout)
Т к теперь AggregationProcessor вызывается как bean, а не как стандартный камеловский процессор,
то процесс старта и остановки происходит в отличном порядке.
Для работы к кластере:
- добавлен механизм восстановления работы таймаутов на других нодах,
- отредактирован механизм удаления сообщения из репозитория(возникало состояние гонки и появлялись дубликаты),
- исправлен механизм продолжения работы с "застрявшими" сообщениями (recoverTask из таблицы _completed)
- добавлен безопасный механизм забора сообщений из очереди(восстановление сообщения в очереди, если не пришло подтверждение)

View File

@@ -0,0 +1,34 @@
= Инструкция для работы с шиной через универсальный коннектор
=== Преднастройка окружения
. Скачать и установить postman (https://www.postman.com/downloads/).
. Импортировать коллекцию запросов и окружение в postman (https://learning.postman.com/docs/getting-started/importing-and-exporting-data/).
xref:postman/uniform-connector.postman_environment.json[Окружение]
xref:postman/uniform-exchange-connector.postman_collection.json[Коллекция запросов]
.. Настроить окружение (https://learning.postman.com/docs/sending-requests/managing-environments/)
... _base_url_ - если запросы будут запускаться с машины находящейся с шиной, то данный параметр не нужно менять(http://localhost:8181/cxf), иначе заменить localhost:8181 на необходимый
... _system1_id_ - имя/идентификатор системы, то как будет представлена система в шине(по умолчанию s1)
... _system1Login_ - логин системы, то как будет аутентифицироваться система в шине(по умолчанию s1)
... _system1Password_ - пароль системы, то как будет аутентифицироваться система в шине(по умолчанию s1)
... _system2_id_ - имя/идентификатор системы, то как будет представлена система в шине(по умолчанию s1)
... _system2Login_ - логин системы, то как будет аутентифицироваться система в шине(по умолчанию s1)
... _system2Password_ - пароль системы, то как будет аутентифицироваться система в шине(по умолчанию s1)
... _adminLogin_ - админская учетка, для произведения настроек в шине(по умолчанию admin)
... _adminPassword_ - админская учетка, для произведения настроек в шине(по умолчанию admin)
. Запустить коллекцию для выполнения всех тестов (https://learning.postman.com/docs/running-collections/intro-to-collection-runs/).
=== Содержимое тестов
. Коллекция запросов содержит следующие шаги:
.. Создание профиля систем
.. Создание учетки для данных систем
.. Создание коннекторов к данным системам
.. Создание разрешений на отправку сообщений из одной системы в другую
.. Отправка тестового сообщения в систему
.. Получение тестового сообщения
.. Отправка подтверждения получения сообщения (иначе сообщение будет восстановлено)
.. Очистка шины от созданных профилей и коннекторов.

View File

@@ -0,0 +1,54 @@
{
"id": "527e5257-25b4-4246-ac5a-26b88e06eec8",
"name": "uniform-connector",
"values": [
{
"key": "base_url",
"value": "http://localhost:8181/cxf",
"enabled": true
},
{
"key": "system1_id",
"value": "s1",
"enabled": true
},
{
"key": "system2_id",
"value": "s2",
"enabled": true
},
{
"key": "adminLogin",
"value": "admin",
"enabled": true
},
{
"key": "adminPassword",
"value": "admin",
"enabled": true
},
{
"key": "system1Login",
"value": "s1",
"enabled": true
},
{
"key": "system1Password",
"value": "s1",
"enabled": true
},
{
"key": "system2Login",
"value": "s2",
"enabled": true
},
{
"key": "system2Password",
"value": "s2",
"enabled": true
}
],
"_postman_variable_scope": "environment",
"_postman_exported_at": "2021-08-24T14:43:46.375Z",
"_postman_exported_using": "Postman/7.36.5"
}

View File

@@ -0,0 +1,38 @@
= Универсальный сервис(US)
Универсальный сервис разработан для корректного и единообразного взаимодействия с _Entaxy_ из _1С интеграции_.
image::US.png[]
=== US endpoint
Универсальный сервис выставлен с помощью soap (может быть заменен на любой другой способ обмена сообщения, например rest, с сохранением схемы), в котором 3 метода _sendPackets_, _getPackets_ и _confirmPackets_. US endpoint включает в себя: выставленный soap сервис, проверку на существование коннектора и отправку в коннектор(что верно и для uniform-service-service-endpoint)
=== US connector
Коннектор занимается обработкой полученного пакета.
- _sendPackets_ - шина анализирует пакет, создавая служебную информацию(такую как имя системы отправителя, имя и тип получателя и т д) и отправляет в выходную точку профиля.
- _getPackets_ - шина делает проверку служебной информации(такую как имя системы отправителя, имя и тип получателя и т д) и забирает сообщение из очереди, дополнительно отправляя его в агрегатор. Агрегатор необходим для гарантированной доставки пакета, если в течение заданного таймаута (по умолчанию - 10 минут) не придет подтверждение, то пакет будет считаться не доставленным и будет восстановлен в очереди.
- _confirmPackets_ - шина делает проверку служебной информации(такую как имя системы отправителя, имя и тип получателя и т д), достает пакет из соответствующего источника (если оно есть) и отдает его системе, дополнительно отправляя в агрегатор, который если собирает пару(пакет и подтверждение) считает его доставленным и удаляет из шины.
_Агрегатор_ может хранить сообщения в ignite и базе данных, для переключения режима работы агрегатора необходимо установить необходимый параметр acknowledge.aggregation.repository (по умолчанию - jdbcAggregationRepository) в uniform.service.support.cfg
https://help.talend.com/r/Bejd_\~iSyuyc~nF9XIgDIw/fBdqK2kf6iIkLHQf9nLh6g[Информация по jdbcAggregationRepository]
xref:ignite.adoc[Информация по igniteAggregationRepository]
=== US support
Необходим как вспомогательный элемент. Содержит в себе: настройку агрегатора, маршруты работы агрегатора, маршрут связанный с отправкой в систему в активном режиме коннектора.
== Режимы универсального сервиса:
- _Пассивный_ выражен в поднятом на стороне шины сервисе, который "пассивно" ждет запроса от системы.
- _Активный_ выражен в поднятом на стороне системы сервисе, который с некоторой периодичностью (настраивается при создании коннектора, по умолчанию 1m) опрашивает шина на предмет подготовленных сообщений, и, отправляет полученные сообщения в систему как только они пришли.
xref:active-mode.adoc#_активный_режим_коннектора[Информация по активному режиму работы универсального сервиса]

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-exchange-in-connector, а для того чтобы получить сообщение из soap нужно создать коннектор uniform-service-exchange-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-exchange-in-connector</templateName>
<paramList/>
</template>
<template>
<templateName>uniform-service-exchange-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>vr</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>rostech</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>rostech</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

View File

@@ -0,0 +1,177 @@
= Entaxy
:imagesdir: .
:hardbreaks:
Entaxy - шина, которую можно конфигурировать извне с помощью графического интерфейса или API, состоящая из модулей:
image::Entaxy.png[]
== *Управленческий слой(core):*
=== basic-auth
модуль, отвечающий за аутентификацию в шине. Tак же занимается хранением, созданием, редактированием и удалением учетных записей.
xref:core/auth/Authorization.adoc[Более полную информации о basic-auth найдете по этой ссылке]
_Для разработчиков:
-имеет Api, который занимается Crud операциями,
-хранит учетные записи в базе данных,
-предоставляет файл с актуальной информацией для nginx,
-выставляет interсeptor для аутентификации в других сервисах,
-выставляет interсeptor для определения принадлежности аккаунта определённой системе._
=== permission
модуль, отвечающий за управление правами доступа.
xref:core/permission/SOAP-service-Permission-management.adoc[Более полную информации о permission найдете по этой ссылке]
_Для разработчиков:
-имеет Api, который занимается Crud операциями
- хранит права в базе данных,
-(camel)компонент, который используется в маршрутах, для проверки возможности отправки из системы a в систему b.
-выставляет interсeptor для авторизации в служебных сервисах._
=== system-management-api
модуль, отвечающий за создание систем и разнообразных коннекторов. (коннекторы бывают разных типов, будет описано далее)
xref:core/system-managment/Users-manual-System-management.adoc[Более полную информации о system-management найдете по этой ссылке]
__Для разработчиков:
-имеет Api, который занимается Crud операциями
-хранит параметры в базе данных,
-генерирует профиля и коннекторы на основе переданных через Api параметров и деплоит их через репозиторий nexus или файловую систему и cellar (блок Deployer) в шину.
-также имеет возможность Crud прав доступа над учетными записями систем.
__
=== system-registry
модуль, осуществляющий поддержку динамического управления профилями систем(профиль - это отражение параметров системы в шине)
__Для разработчиков:
-хранит информацию о системах в базе данных,
-(camel)компонент, который используется в маршрутах для определения нужной системы и коннектора для отправки сообщения в нее.
__
=== system-group-registry
модуль, осуществляющий поддержку динамического управления группами систем, которые определяют логику отправки в необходимую систему в определенной группе.
__Для разработчиков:
-хранит информацию о группах в базе данных,
-(camel)компонент, который используется в маршрутах для определения нужной системы из группы.
__
=== events
модуль, для работы с топиками(по схеме Publisher (издатель)-Subscriber (подписчик)) для систем.
xref:core/topic/Topic-management-Rest-service.adoc[Более полную информации о events найдете по этой ссылке]
__Для разработчиков:
-хранит информацию о топиках в базе данных,
-имеет Api(Rest), который занимается Crud операциями
__
=== schema
модуль, осуществляющий хранение всех схем, через которые делаются преобразования сообщений, валидация, поднятие сервиса в шине.
xref:core/schema/Schema.adoc[Более полную информации о schema найдете по этой ссылке]
__Для разработчиков:
-имеет Api, который занимается Crud операциями
-хранит информацию о загруженных схемах в базе данных,
-(camel)компонент, который используется в маршрутах для валидации xml через xsd, которую загрузили в бд.
-service, который подключается к xslt компоненту для подгрузки xsl из бд
-service, который подключается к cxf компоненту для подгрузки xsd и wsdl из бд
__
=== bridge
модуль, осуществляющий передачу сообщений в другую шину.
xref:core/bridge/Bridge-Description-and-Configuration.adoc[Более полную информации о bridge найдете по этой ссылке]
__Для разработчиков:
-знает о всех подключенных шинах и их именах в рамках всей системы
-осуществляет передачу сообщений через artemis, также получает сообщения из другой шины.
-в перспективе будет создан компонент который по названию будет определять в какую шину отправить, а не напрямую через очереди, как это сделано сейчас.
__
=== Error Handler
модуль, осуществляющий за обработку ошибок в шине.
Централизованный обработчик ошибок для формирования кодов ошибок, их синхронного возврата клиенту и для асинхронного дублирования более подробного описания ошибки (для клиента и для Центральной Базы Интеграции).
xref:core/exception/Centralized-error-handler.adoc[Более полную информации о централизованном обработчике ошибок найдете по этой ссылке]
xref:core/exception/Error-description.adoc[Более полную информации о классификации ошибок найдете по этой ссылке]
__Для разработчиков:
-знает о всех подключенных шинах и их именах в рамках всей системы
-осуществляет передачу сообщений через artemis, также получает сообщения из другой шины.
-в перспективе будет создан компонент, который по названию будет определять в какую шину отправить, а не напрямую через очереди, как это сделано сейчас.
__
=== Deployer
набор модулей осуществляющих работу с бандлами
xref:core/deployer/deployer-common.adoc[Более полную информации о Deployer найдете по этой ссылке]
__Для разработчиков:
-deployer-api - интерфейс репозитория для хранения артефактов
-file-system-deployer - реализация репозитория в папке
-nexus-deployer - реализация репозитория в Sonartype Nexus
-cellar-deployer - система управления бандлами через Apache Cellar
__
== Также как вспомогательные инструменты используется следующие модули:
_сellar_ - модуль для загрузки сгенерированных blueprint в шину(в несколько карафов).
_ignite_ - модуль для создания распределенного хранилища ключ-значение.(используется для более быстрой работы некоторых компонентов, которым нужно хранилище)
_liquibase_ - модуль для поддержки актуальной схемы бд.
== Клиентский слой
_US_ - универсальный коннектор, через который можно отправлять сообщения в другие системы.
_(делится на обычный и служебный)_
xref:connectors/uniform-exchange-service/uniform-exchange-service.adoc[Универсальный сервис]
_file-connector_ - коннектор, который сообщения для определенной системы отправляет с помощью файла(получая сообщение, проводит необходимые преобразования, нпрм архивацию, и складывает в определенную папку).
_db-connector_ - коннектор, который осуществляет обмен сообщениями с системой через бд. (сообщение полученное из другой системы конвертируется в запись в бд, и для отправки сообщения в шину необходимо сделать запись в бд)
xref:connectors/create_new_connectors.adoc[Информация о создании новых коннекторов]
image::connectors/db-connector/deployment_schema.png[]
_nsi_ - soap коннектор, который был поднят с помощью клиентской wsdl и работает по специальной схеме, определенной клиентом с помощью бд.
_big-packets-connector_ - soap коннектор, через который можно отправлять сообщения в другие системы, предназначенный для отправки больших сообщений, которые отправляются по частям.
=== Необходимые для шины внешние модули
nginx(опционально) - балансировщик нагрузки, также занимается предварительной аутентификацией.
nexus(опционально) - необходим для хранения и динамической развертки блюпринтов.
db(поддерживается mssql и postgresql) esb_entaxy - необходима для хранения служебных данных(связанных с настройкой маршрутов в шине).
db(поддерживается mssql и postgresql) cache - необходима для хранения временных данных, связанных с определенным сообщением.
artemis - брокер сообщений.
file-storage(nfs) - необходим для работы сервиса больших пакетов, nginx и тд.
=== Схема прохождения пакета
Для разработчиков:
image::connectors/Message.png[]
_Все сообщения отправляемые в шину будут отправляться из входного коннектора в выходную точку профиля._
Общее описание Entaxy:
xref:core/Common-description-of-the-transport-layer.adoc[Общее описание Entaxy]

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

View File

@@ -0,0 +1,626 @@
= Руководство по установке Entaxy
:nofooter:
:toc: left
:toc-title: Содержание
:sectnums:
:icons: font
:title-page:
:revnumber: 1.0
<<<
== Цель руководства
Данное руководство описывает процесс установки системы Entaxy (далее Система) на сервер или рабочую станцию в демонстрационных целях.
<<<
== Требования и замечания
Для установки Системы требуется:
- Установленная на сервер или рабочую станцию операционная система LTS: AstraLinux 2.12 (Orel), RHEL (CentOS), Ubuntu с настроенными репозиториями для установки программного обеспечения, входящего в состав поставки ОС
- Созданный в системе пользователь с правами sudo. Под этим пользователем будет производиться установка Системы. Далее по инструкции имя пользователя обозначено как `<username>`. Вместо `<username>` нужно подставить имя пользователя, который будет производить установку.
- Опыт работы с Debian/Ubuntu/AstraLinux системами
<<<
== Дистрибутивы программных продуктов
Вместе с инструкцией поставляются все дистрибутивы, необходимые для установки Системы. Их распространение разрешено лицензиями.
Дистрибутивы доступны в каталоге `distrib`. Перед установкой Системы нужно скопировать этот каталог на сервер или рабочую станцию, куда будет производиться установка в каталог `/home/<username>`.
Вся дальнейшая установка Системы будет производиться из файлов, скопированных в `/home/<username>/distrib`
<<<
== Установка PostgresPro 11 Standard Edition
Система использует СУБД PostgresPro 11 Standard для хранения конфигураций, справочников и т.д. Указанная СУБД входит в Реестр программных продуктов.
Для установки PostgresPro 11 Standard Edition необходимо перейти в каталог с дистрибутивом PostgresPro 11 Standard Edition, и установить пакеты в следующей последовательности:
[source,bash]
----
cd /home/<username>/distrib/postgrespro-std-11
sudo apt install ./postgrespro-std-11-libs_11.12.1-1.orel_amd64.deb
sudo apt install ./postgrespro-std-11-client_11.12.1-1.orel_amd64.deb
sudo apt install ./postgrespro-std-11-server_11.12.1-1.orel_amd64.deb
sudo apt install ./postgrespro-std-11-contrib_11.12.1-1.orel_amd64.deb
sudo apt install ./postgrespro-std-11_11.12.1-1.orel_amd64.deb
----
При установке последнего пакета производится автоматическая инициализация кластера СУБД, поэтому никаких действий по начальной инициализации PostgresPro 11 Standard Edition производить не требуется.
<<<
== Подготовка СУБД для работы с Entaxy
Перед установкой Системы нужно подготовить СУБД для работы с ней.
Подготовка заключается в создании пользователя СУБД и создании баз данных.
Для работы с СУБД используется инструмент `psql` с правами администратора. Для запуска инструмента выполнить следующие команды:
[source,bash]
----
sudo su - postgres
psql
----
После запуска иструмента выполняются следующие действия:
. Создание пользователя:
+
[source,sql]
----
CREATE USER entaxy WITH ENCRYPTED PASSWORD 'entaxy';
----
+
. Создание баз данных
+
[source,sql]
----
CREATE DATABASE cache;
CREATE DATABASE storage;
----
+
. Назначение прав пользователю `entaxy` на только что созданные базы `cache` и `storage`:
+
[source,sql]
----
GRANT ALL ON DATABASE cache TO entaxy;
GRANT ALL ON DATABASE storage TO entaxy;
----
После создания пользователя и БД выйти из инструмента `psql` с помощью ввода команды `\q`
После выхода из инструмента для работы с PostgresPro 11 Standard Edition `psql` требуется выйти из консоли пользователя `postgres`. Для этого выполнить команду:
[source,bash]
----
exit
----
<<<
== Установка OpenJDK 11
Установка OpenJDK 11 производится в каталог `/opt/openjdk`
Для установки OpenJDK 11 нужно перейти в каталог `/home/<username>/distrib/openjdk`, распаковать дистрибутив OpenJDK 11 в каталог установки и назначить на распакованные файлы права пользователя `root`:
[source,bash]
----
cd /home/<username>/distrib/openjdk
sudo mkdir -p /opt/openjdk
sudo tar xvf bellsoft-jdk11.0.11+9-linux-amd64.tar.gz -C /opt/openjdk
sudo chown -R root:root /opt/openjdk
sudo chmod 755 /opt/openjdk/jdk-11.0.11
----
<<<
== Установка и настройка nginx
Для аутентификации пользователей и маршрутизации запросов в Системе используется `nginx`, работающий как реверсивный прокси.
Перед настройкой конфигурации `nginx` необходимо его установить командой:
[source,bash]
----
sudo apt install nginx
----
Затем удалить конфигурацию nginx по-умолчанию, скопировать предварительно настроенный файл конфигурации `nginx` из каталога `/home/<username>/distrib/nginx/sites-available` в `/etc/nginx/sites-available`, создать символьную ссылку на конфигурацию в каталоге разрешённых конфигураций:
[source,bash]
----
sudo rm -rf /etc/nginx/sites-enabled/default
sudo cp /home/<username>/distrib/nginx/sites-available/entaxy.conf /etc/nginx/sites-available
sudo ln -s /etc/nginx/sites-available/entaxy.conf /etc/nginx/sites-enabled/entaxy.conf
----
После установки новой конфигурации и её разрешения, необходимо перезагрузить конфигурацию `nginx` командой:
[source,bash]
----
sudo nginx -t <1>
sudo systemctl reload nginx <2>
----
<1> - валидация конфигурации nginx (если команда вернёт строку `syntax is ok`, то конфигурация валидна)
<2> - перезагрузка конфигурации nginx
Затем необходимо создать файл паролей Basic аутентификации `htpasswd` в каталоге `/opt/nginx`
=== Управление сервисом nginx
Запуск `nginx` выполняется командой:
[source,bash]
----
sudo systemctl start nginx
----
Остановка `nginx` выполняется командой:
[source,bash]
----
sudo systemctl stop nginx
----
Перезапуск `nginx` выполняется командой:
[source,bash]
----
sudo systemctl restart nginx
----
Перезагрузка конфигурации `nginx` выполняется командой:
[source,bash]
----
sudo systemctl reload nginx
----
<<<
== Установка Apache Artemis
Установка Apache Artemis производится в каталог `/opt/artemis`
Для установки Apache Artemis необходимо выполнить следующие шаги:
. Создать пользователя `artemis`, под которым будет работать Artemis. При создании пользователя создаётся домашний каталог пользователя `/opt/artemis`, в котором будет установлен сам Artemis:
+
[source,bash]
----
sudo useradd -d /opt/artemis -m -r artemis -s /usr/sbin/nologin
----
+
. Распаковать дистрибутив Artemis в домашний каталог Artemis и назначить распакованным файлам права пользователя `artemis`:
+
[source,bash]
----
cd /home/<username>/distrib/artemis
sudo tar xvf apache-artemis-2.17.0-bin.tar.gz -C /opt/artemis
sudo cp -a /opt/artemis/apache-artemis-2.17.0/. /opt/artemis/
sudo rm -rf /opt/artemis/apache-artemis-2.17.0
sudo chown -R artemis:artemis /opt/artemis
----
+
. Создать каталог для брокера:
+
[source,bash]
----
sudo mkdir -p /opt/artemis/brokers
sudo chown artemis:artemis /opt/artemis/brokers
----
+
. Создать брокер:
+
[source,bash]
----
sudo su -s /bin/sh -c \
"export JAVACMD=/opt/openjdk/jdk-11.0.11/bin/java; \
export ARTEMIS_HOME=/opt/artemis; \
/opt/artemis/bin/artemis create \
--name entaxy-broker \
--user artemis \
--password artemis \
--require-login \
/opt/artemis/brokers/entaxy-broker" \
artemis
----
+
После выполнения команды создаётся новый брокер в каталоге `/opt/artemis/brokers/entaxy-broker` с именем `entaxy-broker`. Имя брокера задаётся в параметре `--name`.
Имя пользователя и пароль для входа в Web консоль брокера задаётся в параметрах `--user` и `--password` соответственно.
+
. Создать файл сервиса `/etc/systemd/system/entaxy@artemis.service`:
+
.entaxy-broker@artemis.service
[source,bash]
----
[Unit]
Description=Artemis ActiveMQ Message Broker
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/opt/artemis/brokers/entaxy-broker/bin/artemis-service start
ExecStop=/opt/artemis/brokers/entaxy-broker/bin/artemis-service stop
User=artemis
Group=artemis
[Install]
WantedBy=multi-user.target
----
+
. Отредактировать переменную окружения `JAVA_HOME` для сервиса брокера:
+
[source,bash]
----
sudo systemctl edit entaxy@artemis.service
----
+
При выполнении предыдущей команды откроется текстовый редактор, в который надо добавить следующее содержимое, после чего сохранить файл:
+
[source,bash]
----
[Service]
Environment="JAVA_HOME=/opt/openjdk/jdk-11.0.11"
----
После создания файла сервиса и определения переменных окружения, выполнить команду
[source,bash]
----
sudo systemctl daemon-reload
----
Выполнение команды перезагрузит конфигурацию `systemd`, и сервис для запуска Artemis станет доступен
Включить автозапуск сервиса Artemis при старте системы:
[source,bash]
----
sudo systemctl enable entaxy@artemis.service
----
Запустить брокер Entaxy
[source,bash]
----
sudo systemctl start entaxy@artemis.service
----
=== Управление сервисом Apache Artemis
Запуск сервиса брокера `entaxy` выполняется командой:
[source,bash]
----
sudo systemctl start entaxy@artemis.service
----
Остановка сервиса брокера `entaxy` выполняется командой:
[source,bash]
----
sudo systemctl stop entaxy@artemis.service
----
<<<
== Установка Apache Karaf
Установка Apache Karaf производится в каталог `/opt/karaf`
Для установки Apache Karaf необходимо выполнить следующие шаги:
. Создать пользователя `karaf`, под которым будет работать Karaf. При создании пользователя создаётся домашний каталог пользователя `/opt/karaf`, в котором будет установлен сам Karaf:
+
[source,bash]
----
sudo useradd -d /opt/karaf -m -r karaf -s /usr/sbin/nologin
----
+
. Распаковать дистрибутив Karaf в домашний каталог, и назначить распакованным файлам права пользователя `karaf`:
+
[source,bash]
----
cd /home/<username>/distrib/karaf
sudo tar xvf apache-karaf-4.2.9.tar.gz -C /opt/karaf
sudo cp -a /opt/karaf/apache-karaf-4.2.9/. /opt/karaf
sudo rm -rf /opt/karaf/apache-karaf-4.2.9
sudo cp /home/<username>/distrib/karaf/jre.properties /opt/karaf/etc/jre.properties
sudo chown -R karaf:karaf /opt/karaf
----
+
. Отредактировать переменную окружения `JAVA_HOME` для Karaf:
+
[source,bash]
----
sudo sed -i 's/# export JAVA_HOME/export JAVA_HOME=\/opt\/openjdk\/jdk-11.0.11/g' /opt/karaf/bin/setenv
----
+
. Создать файл сервиса `/etc/systemd/system/karaf.service` со следующим содержимым:
+
.karaf.service
[source,bash]
----
[Unit]
Description=Entaxy Karaf
After=syslog.target network.target
[Service]
ExecStart=/opt/karaf/bin/karaf start
ExecStop=/opt/karaf/bin/karaf stop
User=karaf
Group=karaf
SuccessExitStatus=0 143
RestartSec=15
Restart=on-failure
LimitNOFILE=102642
[Install]
WantedBy=multi-user.target
----
+
. После создания файла сервиса и определения переменных окружения, выполнить команду:
+
[source,bash]
----
sudo systemctl daemon-reload
----
Выполнение команды перезагрузит конфигурацию `systemd`, и сервис для запуска Karaf станет доступен
Включить автозапуск сервиса Karaf при старте системы:
[source,bash]
----
sudo systemctl enable karaf.service
----
=== Управление сервисом Apache Karaf
Запуск сервиса `karaf` выполняется командой:
[source,bash]
----
sudo systemctl start karaf.service
----
Остановка сервиса `karaf` выполняется командой:
[source,bash]
----
sudo systemctl stop karaf.service
----
<<<
== Настройка Apache Karaf
Скопируйте файлы конфигурации Entaxy из `/home/<username>/distrib/entaxy/etc` в каталог `/opt/karaf/etc`. Все файлы предварительно настроены для работы всех компонентов на одной машине:
[source,bash]
----
sudo cp -a /home/<username>/distrib/entaxy/etc/. /opt/karaf/etc
sudo chown -R karaf:karaf /opt/karaf/etc
----
Установочные файлы Системы хранятся в локальном репозитории артефактов. Перед установкой Системы необходимо скопировать локальный репозиторий из каталога `/home/<username>/distrib/entaxy/.m2` в `/opt/karaf`:
[source,bash]
----
sudo cp /home/<username>/distrib/entaxy/.m2/. /opt/karaf/.m2
sudo chown -R karaf:karaf /opt/karaf/.m2
----
После копирования файлов конфигураций и локального репозитория можно запустить сервис `karaf`
<<<
== Подготовка ОС для установки Entaxy
Система в процессе работы использует файловые ресурсы, в которых хранятся передаваемые файлы, пакеты и т.д. Эти ресурсы перед установкой Системы необходимо создать:
[source,bash]
----
sudo mkdir -p /opt/karaf/bundle-repository
sudo mkdir -p /mnt/entaxy/file-connector/message-store
sudo mkdir -p /mnt/entaxy/ignite
sudo mkdir -p /mnt/entaxy/filestore
sudo chown -R karaf:karaf /opt/karaf/bundle-repository
sudo chown -R karaf:karaf /mnt/entaxy
----
<<<
== Установка Entaxy
=== Проверка работоспособности Apache Karaf
Установка Entaxy осуществляется из консоли управления Apache Karaf. Чтобы войти в консоль управления Apache Karaf, нужно выполнить в терминале команду:
[source,bash]
----
ssh -p 8101 karaf@localhost
----
При первом входе в консоль управления необходимо на запрос предоставления доступа ввести слово `yes` и нажать `Enter`
После этого Apache Karaf запросит пароль - в качестве пароля ввести `karaf`
[source,bash]
----
Warning: Permanently added '[localhost]:8101' (RSA) to the list of known hosts.
Password authentication
Password:
__ __ ____
/ //_/____ __________ _/ __/
/ ,< / __ `/ ___/ __ `/ /_
/ /| |/ /_/ / / / /_/ / __/
/_/ |_|\__,_/_/ \__,_/_/
Apache Karaf (4.2.9)
Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit 'system:shutdown' to shutdown Karaf.
Hit '<ctrl-d>' or type 'logout' to disconnect shell from current session.
----
Для контроля корректности установки ввести команду `list`:
[source,bash]
----
karaf@root()> list
START LEVEL 100 , List Threshold: 50
ID │ State │ Lvl │ Version │ Name
───┼────────┼─────┼─────────┼────────────────────────────────────────────────
22 │ Active │ 80 │ 4.2.9 │ Apache Karaf :: OSGi Services :: Event
karaf@root()>
----
Если статус компонента `Apache Karaf {two-colons} OSGi Services {two-colons} Event` установлен в состояние `Active`, это значит, что Apache Karaf установлен корректно, и можно переходить к установке Entaxy.
=== Установка Entaxy
Установка Entaxy выполняется из консоли управления Apache Karaf. Сначала к списку репозиториев Karaf добавляется репозиторий Entaxy:
[source,bash]
----
feature:repo-add mvn:ru.entaxy.esb/karaf-features/1.0-SNAPSHOT/xml/features
----
Затем запускается команда установки всех компонентов Entaxy
[source,bash]
----
feature:install entaxy-all
----
После завершения установки Entaxy произойдёт выход из консоли управления Apache Karaf. Это связано с перезапуском встроенного в `Karaf` SSH сервера. Это нормальная ситуация, в процессе установки происходит настройка устанавливаемых компонентов.
=== Проверка работоспособности Entaxy
Чтобы проверить корректность установки необходимо вновь зайти в консоль управления Karaf:
[source,bash]
----
ssh -p 8101 karaf@localhost
----
В консоли управления ввести команду:
[source,bash]
----
karaf@root()> list
----
Отобразится список установленных компонентов Entaxy, и вспомогательных библиотек. Состояние почти всех компонентов должно быть `Active`
Среди компонентов, которые могут не находиться в состоянии `Active` можно выделить два:
- `camel-caffeine-lrucache` может находиться в состоянии `Resolved`
- `INTEGRATION {two-colons} ENTAXY {two-colons} DB EXAMPLE CONNECTOR` будет находиться в состоянии `Failure`
Компонент `INTEGRATION {two-colons} ENTAXY {two-colons} DB EXAMPLE CONNECTOR` необходимо отключить командой:
[source,bash]
----
karaf@root()> bundle:stop <id_компонента>
----
Например, если идентификатор компонента 97, как показано ниже,
[source,bash]
----
97 │ Failure │ 80 │ 1.0.0.SNAPSHOT │ INTEGRATION :: ENTAXY :: DB EXAMPLE CONNECTOR
----
то команда будет выглядеть так:
[source,bash]
----
karaf@root()> bundle:stop 97
----
После остановки компонент перейдёт в состояние `Resolved`
=== Отключение компонента установки Nexus
В процессе своей работы Entaxy генерирует и запускает новые компоненты, например, при создании новой системы, она будет отображаться в Entaxy как отдельный компонент. В момент генерирования и установки нового компонента, производится помещение этого компонента во внешний репозиторий. Это позволяет автоматически переустановить сгенерированные компоненты при добавлении нового узла в кластер Entaxy.
В Entaxy существует два варианта хранения сгенерированных компонентов:
- Sonatype Nexus
- Файловая система
По-умолчанию все генерируемые компоненты помещаются в систему управления репозиториями Sonatype Nexus. Это отдельное ПО, целесообразность установки которого оправдана только в кластерных конфигурациях. В нашем случае установка всей системы выполняется на одну машину.
Чтобы сгенерированные компоненты устанавливались в файловую систему, требуется отключить компонент установки сгенерированных компонентов в Sonatype Nexus. Отключение компонента выполняется следующим образом:
. Войти в консоль управления Karaf
. Найти идентфикатор компонента `SYSTEM {two-colons} ENTAXY {two-colons} NEXUS {two-colons} DEPLOYER`
. Остановить его командой:
+
[source,bash]
----
karaf@root()> bundle:stop <id_компонента>
----
<<<
== Настройка обновления файла аутентификации `htpasswd`
В Entaxy используется Basic аутентификация для всех запросов, приходящих на балансировщик, функции которого выполняет `nginx`. Аутентификация производится средствами самого `nginx`.
В качестве базы для хранения пользователей `nginx` использует файл в специальном формате htpasswd.
Для того, чтобы вновь созданные пользователи в Системе могли аутентифицироваться, необходимо передать информацию о них в файл htpasswd. Для этого используется специальный скрипт, который отрабатывает по расписанию. Сам скрипт нужно предварительно скопировать из каталога `/home/<username>/distrib/script/htpasswd-checker.sh` в любой каталог, например, в `/opt/htpasswd-checker`:
[source,bash]
----
sudo mkdir -p /opt/htpasswd-checker/log
sudo cp /home/<username>/distrib/nginx/htpasswd /etc/nginx
sudo cp /home/<username>/distrib/script/htpasswd-checker.sh /opt/htpasswd-checker
sudo chown -R root:root /opt/htpasswd-checker
----
Так же требуется проверить адреса серверов кластера, публикующих сервис для работы с файлом htpasswd(сервера с karaf) для ключа KARAF_HOST_NAMES:
[source,bash]
----
KARAF_HOST_NAMES=("http://192.168.122.93:9091" "http://192.168.122.94:9091")
----
Затем создать расписание запуска для `cron`:
[source,bash]
----
sudo crontab -e
----
В открывшемся редакторе добавить запись:
[source,bash]
----
* * * * * /opt/htpasswd-checker/htpasswd-checker.sh
----
и сохранить файл. Теперь скрипт будет отрабатывать каждую минуту, подключаться к сервису аутентификации в Apache Karaf, проверять изменение пользовательской информации, и обновлять файл `/etc/nginx/htpasswd` если информация обновилась.
<<<
== Проверка работоспособности сервисов
Чтобы проверить, что сервисы Entaxy работают, можно провести быстрый тест.
Для этого открыть браузер на машине, где установлена Система, и перейти по адресу `http://localhost:8181/cxf`. Браузер запросит имя пользователя и пароль. Ввести `admin` в качестве имени пользователя, и `admin` в качестве пароля. Логин и пароль уже прописаны в файле `/etc/nginx/htpasswd`. При успешной аутентификации отобразится страница следующего вида:
image::img/services.png[]
На этом установку Системы можно считать законченной.

View File

@@ -0,0 +1,10 @@
__Alternative languages:__
* xref:installation-table-of-contents.ru.adoc[Russian]
= Installation
Entaxy have different installation ways OOTB:
* xref:../../temp/entaxy-docker/ReadMe.md[Development docker installation]
* xref:../../features/README.md[Development standalone installation]
* xref:install.adoc[Enterprise environment installation]

View File

@@ -0,0 +1,10 @@
__Alternative languages:__
* xref:installation-table-of-contents.adoc[English]
= Установка
Entaxy из коробки имеет разные варианты установки:
* xref:../../temp/entaxy-docker/ReadMe.md[Установка для разработки в докер]
* xref:../../features/README.ru.md[Установка для разработки отдельных серверных приложений]
* xref:install.adoc[Установка на промышленное окружение]

152
features/README.md Normal file
View File

@@ -0,0 +1,152 @@
# Entaxy features install
### Alternative languages
[Russian](README.ru.md)
### Introduction
You need several steps for Entaxy features installation.
Use Java 11+.
### Build
You will need to compile this example first:
mvn install
### Run
To run the example on Apache Karaf 4.x or newer
#### Step 1: Karaf
Launch the server
karaf / karaf.bat
#### Step 2: DB Setup
If use docker:
docker run --name entaxy_db -p 5432:5432 -e POSTGRES_PASSWORD=entaxy -e POSTGRES_USER=entaxy -e POSTGRES_DB=cache -d postgres
#### Step 3: Add features
Add features required
feature:repo-add mvn:ru.entaxy.esb/karaf-features/LATEST/xml/features
feature:install liquibase-updater
feature:install entaxy-esb-api
Install nsi
feature:install nsi
Install permission
feature:install permission
Install system-registry
feature:install system-registry
Install system-group-registry
feature:install system-group-registry
Install system-group-profile
install -s blueprint:mvn:ru.entaxy.esb.integration.esb.test.profiles/test-profiles/1.0-SNAPSHOT/xml/g_test
Install bridge
feature:install bridge
Install basic-auth
feature:install basic-auth
Install events
feature:install events
Useful comand for dev
bundle:watch mvn:ru.entaxy.esb/nsi-esb/1.0-SNAPSHOT
#### Step 4: Verify that your service is available using the following url in the browser.
We assume you're using Karaf's default PAX Web configuration which uses port `8181` for http. If you would like to use another port or https, change the configuration in `${KARAF_HOME}/etc/org.ops4j.pax.web.cfg`. The immediate extension after the hostname and port ("cxf" in the below URL) is configured via the org.apache.cxf.osgi.cfg file (Please see [http://team.ops4j.org/wiki//display/paxweb/Pax+Web](http://team.ops4j.org/wiki//display/paxweb/Pax+Web) for more information on PAX Web).
[http://localhost:8181/cxf/xdto/NSI?wsdl](http://localhost:8181/cxf/xdto/NSI?wsdl)
#### Step 5: Start SOAPUI or Postman
POST request to
http://localhost:8181/cxf/xdto/NSI
Send test request:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xdto="http://www.entaxy.ru/xdto_NSI">
<soap:Header/>
<soap:Body>
<xdto:GetMDMReferences/>
</soap:Body>
</soap:Envelope>
Response contains GUID, copy it and send request for get result:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xdto="http://www.entaxy.ru/xdto_NSI">
<soap:Header/>
<soap:Body>
<xdto:GetResult>
<xdto:RequestNumber>{GUID}</xdto:RequestNumber>
</xdto:GetResult>
</soap:Body>
</soap:Envelope>
#### Step 6: Check the file system and DB
Check the folder "target/inbox/" in the Karaf base directory to see that a message has arrived.
### Forum, Help, etc
If you hit an problems please let us know on the Camel Forums
<http://camel.apache.org/discussion-forums.html>
Please help us make Apache Camel better - we appreciate any feedback you may
have. Enjoy!
The Camel riders!
## Reinstall
bin/karaf clean
shell:source install.karaf
## Tests
<https://learning.getpostman.com/docs/postman/collection_runs/command_line_integration_with_newman/>
#### Install
npm install -g newman
#### Run
cd test
newman run "Entaxy Integration Tests.postman_collection.json" -e "entaxy dev proxy.postman_environment.json"
or
newman run "Entaxy Integration Tests.postman_collection.json" --env-var base_url=http://192.168.122.83:8181/cxf
#### CXF logging messages
config:property-set -p org.apache.cxf.features.logging enabled true
and after restart bundle with cxf service

181
features/README.ru.md Normal file
View File

@@ -0,0 +1,181 @@
# Установка фич (features)
### Languages
[English](README.md)
### Введение
Для установки фич понадобятся несколько шагов.
Использовать Java 8
### Шаг 1: Сборка проекта
Необходимо локально собрать корневой проект:
mvn install
#### Шаг 2: Настройка брокера, БД и менеджера артефактов.
При использовании докера запустите Артемис
sudo docker run --rm -p 8161:8161 -p 61616:61616 -e ARTEMIS_USERNAME=entaxy -e ARTEMIS_PASSWORD=entaxy --name=artemis1 -d vromero/activemq-artemis
И запустите постгрес
sudo docker run --name entaxy_db -p 5432:5432 -v /etc/timezone:/etc/timezone:ro -e POSTGRES_PASSWORD=entaxy -e POSTGRES_USER=entaxy -e POSTGRES_DB=cache -d postgres
или Майкрософт Сиквел
sudo docker run --name mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=entaxy' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-CU8-ubuntu
`По умолчанию в проекте используется 2 базы данных: cache и esb_entaxy,`
`Названия баз данных прописаны в конфигурациях соединений с бд org.ops4j.datasource-entaxy.esb.*.cfg`
и осталось поднять nexus(необходимо для работы system-management)
sudo docker run -d -p 8081:8081 --name nexus sonatype/nexus3
Теперь смотрим админский пароль через команду:
docker exec nexus cat /nexus-data/admin.password
И далее заходим в админку через браузер на http://localhost:8081/.
По умолчанию для работы требуется создать пользователя entaxy/entaxy и maven репозиторий с названием entaxy.
На Docker Toolbox могут возникнуть ошибки из-за нехватки памяти, решается изменением выделения памяти при запуске`
docker run -d -p 8081:8081 --name nexus -e INSTALL4J_ADD_VM_PARAMS="-Xms2g -Xmx2g -XX:MaxDirectMemorySize=3g" sonatype/nexus3
#### Шаг 3: Подготовка и запуск карафа
Скопировать в карафовский etc следующие файлы из репозитория entaxy-framework\features\src\main\cfg\
jre.properties
org.apache.karaf.cellar.groups.cfg
Так же локальный нексус репозиторий необходимо добавить к стандартным репозиториям в файле org.ops4j.pax.url.mvn.cfg свойство org.ops4j.pax.url.mvn.repositories.`
`Пользователь и название репозитория прописано в конфигурационном файле ru.entaxy.esb.deployer.nexus.cfg.`
Запуск Apache Karaf 4.x или новее
karaf
Или запуск карафа с очисткой до первоначального состояния
karaf clean
## Шаг 4: Установка всех фич за один раз, используя командную строку карафа
shell:source <project-directory>/entaxy-framework/features/src/main/script/install.karaf
- После требуется проверить конфигурации соединений с бд в файлах org.ops4j.datasource-entaxy.esb.*.cfg
- Проверить адрес брокера в файле ru.entaxy.esb.cfg свойство ru.entaxy.esb.jms.url
- Проверить адреса брокеров для моста в файле ru.entaxy.esb.system.bridge.cfg свойства jms.url.*
- Заменить файл org.apache.karaf.cellar.groups.cfg
#### Шаг 4a: Или можно установить фичи вручную
Добавить необходимые фичи
feature:repo-add mvn:ru.entaxy.esb/karaf-features/LATEST/xml/features
feature:install liquibase-updater
feature:install entaxy-esb-api
Установить nsi
feature:install nsi
Установить permission
feature:install permission
Установить реестр систем
feature:install system-registry
Установить тестовый профиль
install -s blueprint:mvn:ru.entaxy.esb.integration.esb.test.profiles/test-profiles/1.0-SNAPSHOT/xml/s_s1
Установить реестр групп систем
feature:install system-group-registry
Установить профиль группы систем
install -s blueprint:mvn:ru.entaxy.esb.integration.esb.test.profiles/test-profiles/1.0-SNAPSHOT/xml/g_fzd
Установить мост
feature:install bridge
Установить сервис управления учётными записями
feature:install basic-auth
Установить events
feature:install events
Для дев окружения может быть полезна команда watch
bundle:watch mvn:ru.entaxy.esb/nsi-esb/1.0-SNAPSHOT
#### Шаг 5: Проверка доступности сервиса через браузер, используя следующий адрес.
Подразумевается использование настроек по умолчанию для карафовского PAX Web, который для http настроен на порт `8181`. Если Вы желаете использовать другой порт или https, то необходимо поменять настройки в `${KARAF_HOME}/etc/org.ops4j.pax.web.cfg`. Непосредственное продолжение адреса после имени хоста и номера порта (в примере ниже `cxf`) можно настроить в файле `org.apache.cxf.osgi.cfg`. (Для более подробной информации по PAX Web перейдите по ссылке [http://team.ops4j.org/wiki/display/paxweb/Pax+Web](http://team.ops4j.org/wiki/display/paxweb/Pax+Web))
#### Шаг 6: Запуск SOAPUI или Postman
Отправка POST запроса на адрес
http://localhost:8181/cxf/xdto/NSI
Тестовый запрос:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xdto="http://www.entaxy.ru/xdto_NSI">
<soap:Header/>
<soap:Body>
<xdto:GetMDMReferences/>
</soap:Body>
</soap:Envelope>
Ответ сожержит GUID, скопируйте его и отправьте для получения результата:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xdto="http://www.entaxy.ru/xdto_NSI">
<soap:Header/>
<soap:Body>
<xdto:GetResult>
<xdto:RequestNumber>{GUID}</xdto:RequestNumber>
</xdto:GetResult>
</soap:Body>
</soap:Envelope>
## Автотесты
<https://learning.getpostman.com/docs/postman/collection_runs/command_line_integration_with_newman/>
#### Установка
npm install -g newman
#### Запуск
cd test
newman run "Entaxy Integration Tests.postman_collection.json" -e "entaxy dev proxy.postman_environment.json"
#### Запуск нагрузочных тестов через Jmeter
В тестах прописана система s1, запросы направляются на 83 ноду
* 1C-EXCHANGE_SEND_GET_ASK.jmx - запись и чтение с подтверждением последовательно
* 1C-EXCHANGE_SEND_GET_ASK_ASYNC.jmx - запись и чтение с подтверждением в параллельных потоках
Можно запускать с машины 192.168.122.76
cd /opt/jenkins/.jenkins/workspace/test_master/test/jmeter
/opt/apache-jmeter-5.2.1/bin/jmeter.sh -n -t ./1C-EXCHANGE_SEND_GET_ASK_ASYNC.jmx

196
features/pom.xml Normal file
View File

@@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>ru.entaxy.esb</groupId>
<artifactId>root</artifactId>
<version>1.8.0</version>
</parent>
<artifactId>karaf-features</artifactId>
<name>SYSTEM :: ENTAXY :: Features</name>
<packaging>pom</packaging>
<profiles>
<profile>
<id>cfg.dev</id>
<properties>
<environmentConfigurationDirectory>cfg</environmentConfigurationDirectory>
</properties>
<build>
<resources>
<resource>
<directory>src/main/${environmentConfigurationDirectory}</directory>
<filtering>true</filtering>
<targetPath>${project.build.directory}/cfg</targetPath>
</resource>
</resources>
</build>
<activation>
<property>
<name>!skipDevConfig</name>
</property>
</activation>
</profile>
<profile>
<id>cfg.local</id>
<properties>
<environmentConfigurationDirectory>cfg.local</environmentConfigurationDirectory>
</properties>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>src/main/feature</directory>
<filtering>true</filtering>
<targetPath>${project.build.directory}/feature</targetPath>
</resource>
<resource>
<directory>src/main/script</directory>
<filtering>true</filtering>
<targetPath>${project.build.directory}/script</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<id>attach-artifacts</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>target/feature/feature.xml</file>
<type>xml</type>
<classifier>features</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.connector.1c.service.soap.passive.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.connector.1c.service.soap.passive</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.connector.1c.soap.passive.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.connector.1c.soap.passive</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.connector.1c.support.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.connector.1c.support</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.system.basic_auth.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.system.basic_auth</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.system.basic_auth.htpasswd.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.system.basic_auth.htpasswd</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.system.event.rest.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.system.event.rest</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.system.event.handler.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.system.event.handler</classifier>
</artifact>
<artifact>
<file>target/cfg/org.ops4j.datasource-entaxy.esb.cache.cfg</file>
<type>cfg</type>
<classifier>datasource-cache</classifier>
</artifact>
<artifact>
<file>target/cfg/org.ops4j.datasource-entaxy.esb.storage.cfg</file>
<type>cfg</type>
<classifier>datasource-storage</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.deployer.nexus.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.deployer.nexus</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.deployer.cellar.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.deployer.cellar</classifier>
</artifact>
<artifact>
<file>target/script/install.karaf</file>
<type>script</type>
<classifier>install</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.error.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.error</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.error.code.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.error.code</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.error.text.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.error.text</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.deployer.file.system.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.deployer.file.system</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.system.schema.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.system.schema</classifier>
</artifact>
<artifact>
<file>target/cfg/ru.entaxy.esb.system.management.cfg</file>
<type>cfg</type>
<classifier>ru.entaxy.esb.system.management</classifier>
</artifact>
<artifact>
<file>target/cfg/jre.properties</file>
<type>properties</type>
<classifier>jre</classifier>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,725 @@
################################################################################
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
################################################################################
#
# Java platform package export properties.
#
# Standard package set. Note that:
# - javax.transaction* is exported with a mandatory attribute
jre-1.6=\
javax.accessibility, \
javax.activation;version="1.1", \
javax.activity, \
javax.annotation;version="1.0", \
javax.annotation.processing;version="1.0", \
javax.crypto, \
javax.crypto.interfaces, \
javax.crypto.spec, \
javax.imageio, \
javax.imageio.event, \
javax.imageio.metadata, \
javax.imageio.plugins.bmp, \
javax.imageio.plugins.jpeg, \
javax.imageio.spi, \
javax.imageio.stream, \
javax.jws, \
javax.jws.soap, \
javax.lang.model, \
javax.lang.model.element, \
javax.lang.model.type, \
javax.lang.model.util, \
javax.management, \
javax.management.loading, \
javax.management.modelmbean, \
javax.management.monitor, \
javax.management.openmbean, \
javax.management.relation, \
javax.management.remote, \
javax.management.remote.rmi, \
javax.management.timer, \
javax.naming, \
javax.naming.directory, \
javax.naming.event, \
javax.naming.ldap, \
javax.naming.spi, \
javax.net, \
javax.net.ssl, \
javax.print, \
javax.print.attribute, \
javax.print.attribute.standard, \
javax.print.event, \
javax.rmi, \
javax.rmi.CORBA, \
javax.rmi.ssl, \
javax.script, \
javax.security.auth, \
javax.security.auth.callback, \
javax.security.auth.kerberos, \
javax.security.auth.login, \
javax.security.auth.spi, \
javax.security.auth.x500, \
javax.security.cert, \
javax.security.sasl, \
javax.sound.midi, \
javax.sound.midi.spi, \
javax.sound.sampled, \
javax.sound.sampled.spi, \
javax.sql, \
javax.sql.rowset, \
javax.sql.rowset.serial, \
javax.sql.rowset.spi, \
javax.swing, \
javax.swing.border, \
javax.swing.colorchooser, \
javax.swing.event, \
javax.swing.filechooser, \
javax.swing.plaf, \
javax.swing.plaf.basic, \
javax.swing.plaf.metal, \
javax.swing.plaf.multi, \
javax.swing.plaf.synth, \
javax.swing.table, \
javax.swing.text, \
javax.swing.text.html, \
javax.swing.text.html.parser, \
javax.swing.text.rtf, \
javax.swing.tree, \
javax.swing.undo, \
javax.tools, \
javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
javax.xml, \
javax.xml.bind;version="2.2.1", \
javax.xml.bind.annotation;version="2.2.1", \
javax.xml.bind.annotation.adapters;version="2.2.1", \
javax.xml.bind.attachment;version="2.2.1", \
javax.xml.bind.helpers;version="2.2.1", \
javax.xml.bind.util;version="2.2.1", \
javax.xml.crypto, \
javax.xml.crypto.dom, \
javax.xml.crypto.dsig, \
javax.xml.crypto.dsig.dom, \
javax.xml.crypto.dsig.keyinfo, \
javax.xml.crypto.dsig.spec, \
javax.xml.datatype, \
javax.xml.namespace, \
javax.xml.parsers, \
javax.xml.soap;version="1.3", \
javax.xml.stream;version="1.2", \
javax.xml.stream.events;version="1.2", \
javax.xml.stream.util;version="1.2", \
javax.xml.transform, \
javax.xml.transform.dom, \
javax.xml.transform.sax, \
javax.xml.transform.stax, \
javax.xml.transform.stream, \
javax.xml.validation, \
javax.xml.ws;version="2.2", \
javax.xml.ws.handler;version="2.2", \
javax.xml.ws.handler.soap;version="2.2", \
javax.xml.ws.http;version="2.2", \
javax.xml.ws.soap;version="2.2", \
javax.xml.ws.spi;version="2.2", \
javax.xml.ws.wsaddressing;version="2.2", \
javax.xml.ws.spi.http;version="2.2", \
javax.xml.xpath, \
org.ietf.jgss, \
org.omg.CORBA, \
org.omg.CORBA_2_3, \
org.omg.CORBA_2_3.portable, \
org.omg.CORBA.DynAnyPackage, \
org.omg.CORBA.ORBPackage, \
org.omg.CORBA.portable, \
org.omg.CORBA.TypeCodePackage, \
org.omg.CosNaming, \
org.omg.CosNaming.NamingContextExtPackage, \
org.omg.CosNaming.NamingContextPackage, \
org.omg.Dynamic, \
org.omg.DynamicAny, \
org.omg.DynamicAny.DynAnyFactoryPackage, \
org.omg.DynamicAny.DynAnyPackage, \
org.omg.IOP, \
org.omg.IOP.CodecFactoryPackage, \
org.omg.IOP.CodecPackage, \
org.omg.Messaging, \
org.omg.PortableInterceptor, \
org.omg.PortableInterceptor.ORBInitInfoPackage, \
org.omg.PortableServer, \
org.omg.PortableServer.CurrentPackage, \
org.omg.PortableServer.POAManagerPackage, \
org.omg.PortableServer.POAPackage, \
org.omg.PortableServer.portable, \
org.omg.PortableServer.ServantLocatorPackage, \
org.omg.SendingContext, \
org.omg.stub.java.rmi, \
org.omg.stub.javax.management.remote.rmi, \
org.w3c.dom, \
org.w3c.dom.bootstrap, \
org.w3c.dom.css, \
org.w3c.dom.events, \
org.w3c.dom.html, \
org.w3c.dom.ls, \
org.w3c.dom.ranges, \
org.w3c.dom.stylesheets, \
org.w3c.dom.traversal, \
org.w3c.dom.views, \
org.w3c.dom.xpath, \
org.xml.sax, \
org.xml.sax.ext, \
org.xml.sax.helpers
# Standard package set. Note that:
# - javax.transaction* is exported with a mandatory attribute
jre-1.7=\
javax.accessibility, \
javax.activation;version="1.1", \
javax.activity, \
javax.annotation;version="1.0", \
javax.annotation.processing;version="1.0", \
javax.crypto, \
javax.crypto.interfaces, \
javax.crypto.spec, \
javax.imageio, \
javax.imageio.event, \
javax.imageio.metadata, \
javax.imageio.plugins.bmp, \
javax.imageio.plugins.jpeg, \
javax.imageio.spi, \
javax.imageio.stream, \
javax.jws, \
javax.jws.soap, \
javax.lang.model, \
javax.lang.model.element, \
javax.lang.model.type, \
javax.lang.model.util, \
javax.management, \
javax.management.loading, \
javax.management.modelmbean, \
javax.management.monitor, \
javax.management.openmbean, \
javax.management.relation, \
javax.management.remote, \
javax.management.remote.rmi, \
javax.management.timer, \
javax.naming, \
javax.naming.directory, \
javax.naming.event, \
javax.naming.ldap, \
javax.naming.spi, \
javax.net, \
javax.net.ssl, \
javax.print, \
javax.print.attribute, \
javax.print.attribute.standard, \
javax.print.event, \
javax.rmi, \
javax.rmi.CORBA, \
javax.rmi.ssl, \
javax.script, \
javax.security.auth, \
javax.security.auth.callback, \
javax.security.auth.kerberos, \
javax.security.auth.login, \
javax.security.auth.spi, \
javax.security.auth.x500, \
javax.security.cert, \
javax.security.sasl, \
javax.sound.midi, \
javax.sound.midi.spi, \
javax.sound.sampled, \
javax.sound.sampled.spi, \
javax.sql, \
javax.sql.rowset, \
javax.sql.rowset.serial, \
javax.sql.rowset.spi, \
javax.swing, \
javax.swing.border, \
javax.swing.colorchooser, \
javax.swing.event, \
javax.swing.filechooser, \
javax.swing.plaf, \
javax.swing.plaf.basic, \
javax.swing.plaf.metal, \
javax.swing.plaf.multi, \
javax.swing.plaf.synth, \
javax.swing.table, \
javax.swing.text, \
javax.swing.text.html, \
javax.swing.text.html.parser, \
javax.swing.text.rtf, \
javax.swing.tree, \
javax.swing.undo, \
javax.tools, \
javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
javax.xml, \
javax.xml.bind;version="2.2.1", \
javax.xml.bind.annotation;version="2.2.1", \
javax.xml.bind.annotation.adapters;version="2.2.1", \
javax.xml.bind.attachment;version="2.2.1", \
javax.xml.bind.helpers;version="2.2.1", \
javax.xml.bind.util;version="2.2.1", \
javax.xml.crypto, \
javax.xml.crypto.dom, \
javax.xml.crypto.dsig, \
javax.xml.crypto.dsig.dom, \
javax.xml.crypto.dsig.keyinfo, \
javax.xml.crypto.dsig.spec, \
javax.xml.datatype, \
javax.xml.namespace, \
javax.xml.parsers, \
javax.xml.soap;version="1.3", \
javax.xml.stream;version="1.2", \
javax.xml.stream.events;version="1.2", \
javax.xml.stream.util;version="1.2", \
javax.xml.transform, \
javax.xml.transform.dom, \
javax.xml.transform.sax, \
javax.xml.transform.stax, \
javax.xml.transform.stream, \
javax.xml.validation, \
javax.xml.xpath, \
org.ietf.jgss, \
org.omg.CORBA, \
org.omg.CORBA_2_3, \
org.omg.CORBA_2_3.portable, \
org.omg.CORBA.DynAnyPackage, \
org.omg.CORBA.ORBPackage, \
org.omg.CORBA.portable, \
org.omg.CORBA.TypeCodePackage, \
org.omg.CosNaming, \
org.omg.CosNaming.NamingContextExtPackage, \
org.omg.CosNaming.NamingContextPackage, \
org.omg.Dynamic, \
org.omg.DynamicAny, \
org.omg.DynamicAny.DynAnyFactoryPackage, \
org.omg.DynamicAny.DynAnyPackage, \
org.omg.IOP, \
org.omg.IOP.CodecFactoryPackage, \
org.omg.IOP.CodecPackage, \
org.omg.Messaging, \
org.omg.PortableInterceptor, \
org.omg.PortableInterceptor.ORBInitInfoPackage, \
org.omg.PortableServer, \
org.omg.PortableServer.CurrentPackage, \
org.omg.PortableServer.POAManagerPackage, \
org.omg.PortableServer.POAPackage, \
org.omg.PortableServer.portable, \
org.omg.PortableServer.ServantLocatorPackage, \
org.omg.SendingContext, \
org.omg.stub.java.rmi, \
org.omg.stub.javax.management.remote.rmi, \
org.w3c.dom, \
org.w3c.dom.bootstrap, \
org.w3c.dom.css, \
org.w3c.dom.events, \
org.w3c.dom.html, \
org.w3c.dom.ls, \
org.w3c.dom.ranges, \
org.w3c.dom.stylesheets, \
org.w3c.dom.traversal, \
org.w3c.dom.views, \
org.w3c.dom.xpath, \
org.xml.sax, \
org.xml.sax.ext, \
org.xml.sax.helpers, \
com.sun.nio.sctp
jre-1.8=\
javax.accessibility, \
javax.activity, \
javax.annotation;version="1.0", \
javax.annotation.processing;version="1.0", \
javax.crypto, \
javax.crypto.interfaces, \
javax.crypto.spec, \
javax.imageio, \
javax.imageio.event, \
javax.imageio.metadata, \
javax.imageio.plugins.bmp, \
javax.imageio.plugins.jpeg, \
javax.imageio.spi, \
javax.imageio.stream, \
javax.jws, \
javax.jws.soap, \
javax.lang.model, \
javax.lang.model.element, \
javax.lang.model.type, \
javax.lang.model.util, \
javax.management, \
javax.management.loading, \
javax.management.modelmbean, \
javax.management.monitor, \
javax.management.openmbean, \
javax.management.relation, \
javax.management.remote, \
javax.management.remote.rmi, \
javax.management.timer, \
javax.naming, \
javax.naming.directory, \
javax.naming.event, \
javax.naming.ldap, \
javax.naming.spi, \
javax.net, \
javax.net.ssl, \
javax.print, \
javax.print.attribute, \
javax.print.attribute.standard, \
javax.print.event, \
javax.rmi, \
javax.rmi.CORBA, \
javax.rmi.ssl, \
javax.script, \
javax.security.auth, \
javax.security.auth.callback, \
javax.security.auth.kerberos, \
javax.security.auth.login, \
javax.security.auth.spi, \
javax.security.auth.x500, \
javax.security.cert, \
javax.security.sasl, \
javax.sound.midi, \
javax.sound.midi.spi, \
javax.sound.sampled, \
javax.sound.sampled.spi, \
javax.sql, \
javax.sql.rowset, \
javax.sql.rowset.serial, \
javax.sql.rowset.spi, \
javax.swing, \
javax.swing.border, \
javax.swing.colorchooser, \
javax.swing.event, \
javax.swing.filechooser, \
javax.swing.plaf, \
javax.swing.plaf.basic, \
javax.swing.plaf.metal, \
javax.swing.plaf.multi, \
javax.swing.plaf.synth, \
javax.swing.table, \
javax.swing.text, \
javax.swing.text.html, \
javax.swing.text.html.parser, \
javax.swing.text.rtf, \
javax.swing.tree, \
javax.swing.undo, \
javax.tools, \
javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
javax.xml, \
javax.xml.bind;version="2.2.8", \
javax.xml.bind.annotation;version="2.2.8", \
javax.xml.bind.annotation.adapters;version="2.2.8", \
javax.xml.bind.attachment;version="2.2.8", \
javax.xml.bind.helpers;version="2.2.8", \
javax.xml.bind.util;version="2.2.8", \
javax.xml.crypto, \
javax.xml.crypto.dom, \
javax.xml.crypto.dsig, \
javax.xml.crypto.dsig.dom, \
javax.xml.crypto.dsig.keyinfo, \
javax.xml.crypto.dsig.spec, \
javax.xml.datatype, \
javax.xml.namespace, \
javax.xml.parsers, \
javax.xml.stream;version="1.2", \
javax.xml.stream.events;version="1.2", \
javax.xml.stream.util;version="1.2", \
javax.xml.transform, \
javax.xml.transform.dom, \
javax.xml.transform.sax, \
javax.xml.transform.stax, \
javax.xml.transform.stream, \
javax.xml.validation, \
javax.xml.ws;version="2.2", \
javax.xml.ws.handler;version="2.2", \
javax.xml.ws.handler.soap;version="2.2", \
javax.xml.ws.http;version="2.2", \
javax.xml.ws.soap;version="2.2", \
javax.xml.ws.spi;version="2.2", \
javax.xml.ws.wsaddressing;version="2.2", \
javax.xml.ws.spi.http;version="2.2", \
javax.xml.xpath, \
javafx.animation, \
javafx.application, \
javafx.beans, \
javafx.beans.binding, \
javafx.beans.property, \
javafx.beans.property.adapter, \
javafx.beans.value, \
javafx.collections, \
javafx.collections.transform, \
javafx.concurrent, \
javafx.css, \
javafx.embed.swing, \
javafx.embed.swt, \
javafx.event, \
javafx.fxml, \
javafx.geometry, \
javafx.print, \
javafx.scene, \
javafx.scene.canvas, \
javafx.scene.chart, \
javafx.scene.control, \
javafx.scene.control.cell, \
javafx.scene.effect, \
javafx.scene.image, \
javafx.scene.input, \
javafx.scene.layout, \
javafx.scene.media, \
javafx.scene.paint, \
javafx.scene.shape, \
javafx.scene.text, \
javafx.scene.transform, \
javafx.scene.web, \
javafx.stage, \
javafx.util, \
javafx.util.converter, \
netscape.javascript, \
org.ietf.jgss, \
org.omg.CORBA, \
org.omg.CORBA_2_3, \
org.omg.CORBA_2_3.portable, \
org.omg.CORBA.DynAnyPackage, \
org.omg.CORBA.ORBPackage, \
org.omg.CORBA.portable, \
org.omg.CORBA.TypeCodePackage, \
org.omg.CosNaming, \
org.omg.CosNaming.NamingContextExtPackage, \
org.omg.CosNaming.NamingContextPackage, \
org.omg.Dynamic, \
org.omg.DynamicAny, \
org.omg.DynamicAny.DynAnyFactoryPackage, \
org.omg.DynamicAny.DynAnyPackage, \
org.omg.IOP, \
org.omg.IOP.CodecFactoryPackage, \
org.omg.IOP.CodecPackage, \
org.omg.Messaging, \
org.omg.PortableInterceptor, \
org.omg.PortableInterceptor.ORBInitInfoPackage, \
org.omg.PortableServer, \
org.omg.PortableServer.CurrentPackage, \
org.omg.PortableServer.POAManagerPackage, \
org.omg.PortableServer.POAPackage, \
org.omg.PortableServer.portable, \
org.omg.PortableServer.ServantLocatorPackage, \
org.omg.SendingContext, \
org.omg.stub.java.rmi, \
org.omg.stub.javax.management.remote.rmi, \
org.w3c.dom, \
org.w3c.dom.bootstrap, \
org.w3c.dom.css, \
org.w3c.dom.events, \
org.w3c.dom.html, \
org.w3c.dom.ls, \
org.w3c.dom.ranges, \
org.w3c.dom.stylesheets, \
org.w3c.dom.traversal, \
org.w3c.dom.views, \
org.w3c.dom.xpath, \
org.xml.sax, \
org.xml.sax.ext, \
org.xml.sax.helpers, \
com.sun.nio.sctp, \
sun.nio.ch, \
com.sun.management
jre-9=\
javax.accessibility, \
javax.activation;version="1.2", \
javax.activity, \
javax.annotation;version="1.0", \
javax.annotation.processing;version="1.0", \
javax.crypto, \
javax.crypto.interfaces, \
javax.crypto.spec, \
javax.imageio, \
javax.imageio.event, \
javax.imageio.metadata, \
javax.imageio.plugins.bmp, \
javax.imageio.plugins.jpeg, \
javax.imageio.spi, \
javax.imageio.stream, \
javax.lang.model, \
javax.lang.model.element, \
javax.lang.model.type, \
javax.lang.model.util, \
javax.management, \
javax.management.loading, \
javax.management.modelmbean, \
javax.management.monitor, \
javax.management.openmbean, \
javax.management.relation, \
javax.management.remote, \
javax.management.remote.rmi, \
javax.management.timer, \
javax.naming, \
javax.naming.directory, \
javax.naming.event, \
javax.naming.ldap, \
javax.naming.spi, \
javax.net, \
javax.net.ssl, \
javax.print, \
javax.print.attribute, \
javax.print.attribute.standard, \
javax.print.event, \
javax.rmi, \
javax.rmi.CORBA, \
javax.rmi.ssl, \
javax.script, \
javax.security.auth, \
javax.security.auth.callback, \
javax.security.auth.kerberos, \
javax.security.auth.login, \
javax.security.auth.spi, \
javax.security.auth.x500, \
javax.security.cert, \
javax.security.sasl, \
javax.sound.midi, \
javax.sound.midi.spi, \
javax.sound.sampled, \
javax.sound.sampled.spi, \
javax.sql, \
javax.sql.rowset, \
javax.sql.rowset.serial, \
javax.sql.rowset.spi, \
javax.swing, \
javax.swing.border, \
javax.swing.colorchooser, \
javax.swing.event, \
javax.swing.filechooser, \
javax.swing.plaf, \
javax.swing.plaf.basic, \
javax.swing.plaf.metal, \
javax.swing.plaf.multi, \
javax.swing.plaf.synth, \
javax.swing.table, \
javax.swing.text, \
javax.swing.text.html, \
javax.swing.text.html.parser, \
javax.swing.text.rtf, \
javax.swing.tree, \
javax.swing.undo, \
javax.tools, \
javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
javax.xml, \
javax.xml.bind;version="2.3.0", \
javax.xml.bind.annotation;version="2.3.0", \
javax.xml.bind.annotation.adapters;version="2.3.0", \
javax.xml.bind.attachment;version="2.3.0", \
javax.xml.bind.helpers;version="2.3.0", \
javax.xml.bind.util;version="2.3.0", \
javax.xml.crypto, \
javax.xml.crypto.dom, \
javax.xml.crypto.dsig, \
javax.xml.crypto.dsig.dom, \
javax.xml.crypto.dsig.keyinfo, \
javax.xml.crypto.dsig.spec, \
javax.xml.datatype, \
javax.xml.namespace, \
javax.xml.parsers, \
javax.xml.stream;version="1.2", \
javax.xml.stream.events;version="1.2", \
javax.xml.stream.util;version="1.2", \
javax.xml.transform, \
javax.xml.transform.dom, \
javax.xml.transform.sax, \
javax.xml.transform.stax, \
javax.xml.transform.stream, \
javax.xml.validation, \
javax.xml.xpath, \
javafx.animation, \
javafx.application, \
javafx.beans, \
javafx.beans.binding, \
javafx.beans.property, \
javafx.beans.property.adapter, \
javafx.beans.value, \
javafx.collections, \
javafx.collections.transformation, \
javafx.concurrent, \
javafx.css, \
javafx.embed.swing, \
javafx.embed.swt, \
javafx.event, \
javafx.fxml, \
javafx.geometry, \
javafx.print, \
javafx.scene, \
javafx.scene.canvas, \
javafx.scene.chart, \
javafx.scene.control, \
javafx.scene.control.cell, \
javafx.scene.effect, \
javafx.scene.image, \
javafx.scene.input, \
javafx.scene.layout, \
javafx.scene.media, \
javafx.scene.paint, \
javafx.scene.shape, \
javafx.scene.text, \
javafx.scene.transform, \
javafx.scene.web, \
javafx.stage, \
javafx.util, \
javafx.util.converter, \
netscape.javascript, \
org.ietf.jgss, \
org.omg.CORBA, \
org.omg.CORBA_2_3, \
org.omg.CORBA_2_3.portable, \
org.omg.CORBA.DynAnyPackage, \
org.omg.CORBA.ORBPackage, \
org.omg.CORBA.portable, \
org.omg.CORBA.TypeCodePackage, \
org.omg.CosNaming, \
org.omg.CosNaming.NamingContextExtPackage, \
org.omg.CosNaming.NamingContextPackage, \
org.omg.Dynamic, \
org.omg.DynamicAny, \
org.omg.DynamicAny.DynAnyFactoryPackage, \
org.omg.DynamicAny.DynAnyPackage, \
org.omg.IOP, \
org.omg.IOP.CodecFactoryPackage, \
org.omg.IOP.CodecPackage, \
org.omg.Messaging, \
org.omg.PortableInterceptor, \
org.omg.PortableInterceptor.ORBInitInfoPackage, \
org.omg.PortableServer, \
org.omg.PortableServer.CurrentPackage, \
org.omg.PortableServer.POAManagerPackage, \
org.omg.PortableServer.POAPackage, \
org.omg.PortableServer.portable, \
org.omg.PortableServer.ServantLocatorPackage, \
org.omg.SendingContext, \
org.omg.stub.java.rmi, \
org.omg.stub.javax.management.remote.rmi, \
org.w3c.dom, \
org.w3c.dom.bootstrap, \
org.w3c.dom.css, \
org.w3c.dom.events, \
org.w3c.dom.html, \
org.w3c.dom.ls, \
org.w3c.dom.ranges, \
org.w3c.dom.stylesheets, \
org.w3c.dom.traversal, \
org.w3c.dom.views, \
org.w3c.dom.xpath, \
org.xml.sax, \
org.xml.sax.ext, \
org.xml.sax.helpers, \
com.sun.nio.sctp, \
sun.nio.ch, \
com.sun.management
jre-10=${jre-9}
jre-11=${jre-10}

View File

@@ -0,0 +1,68 @@
#
# This property stores the cluster groups for which the local node is member
#
groups = default
#
# Filtering of the bundles in the default cluster group
#
default.bundle.whitelist.inbound=*
default.bundle.whitelist.outbound=*
default.bundle.blacklist.inbound=none
default.bundle.blacklist.outbound=none
#
# Filtering of the configurations in the default cluster group
#
default.config.whitelist.inbound=*
default.config.whitelist.outbound=*
default.config.blacklist.inbound=org.apache.felix.fileinstall*, \
org.apache.karaf.management, \
org.apache.karaf.shell, \
org.ops4j.pax.web, \
org.apache.aries.transaction, \
org.ops4j.pax.logging, \
org.apache.karaf.cellar.node, \
org.apache.karaf.cellar.groups.cfg
default.config.blacklist.outbound=org.apache.felix.fileinstall*, \
org.apache.karaf.management, \
org.apache.karaf.shell, \
org.ops4j.pax.web, \
org.apache.aries.transaction, \
org.ops4j.pax.logging, \
org.apache.karaf.cellar.node, \
org.apache.karaf.cellar.groups.cfg
#
# Filtering of the features in the default cluster group
#
default.feature.whitelist.inbound=*
default.feature.whitelist.outbound=*
default.feature.blacklist.inbound=none
default.feature.blacklist.outbound=none
#
# The following properties define the behavior to use when the node joins the cluster (the usage of the bootstrap
# synchronizer), per cluster group and per resource.
# The following values are accepted:
# disabled: means that the synchronizer doesn't sync cluster group and node states
# cluster: the synchronizer retrieves the state from the cluster group first (pull first), and push the node the state
# to the cluster group after (push after)
# node: the synchronizer push the node state to the cluster group (push first), and pull the state from the cluster group
# after (pull after)
# clusterOnly: the cluster is the "master", the node only retrieves and applies the cluster group state, nothing is
# pushed to the cluster group
# nodeOnly: the node is the "master", the node pushes his state to the cluster group, nothing is pulled from the
# cluster group
#
default.bundle.sync=cluster
default.config.sync=disabled
default.feature.sync=cluster
default.obr.urls.sync=cluster
default.balanced.servlet.sync=cluster
default.event.blacklist.inbound = none
default.event.blacklist.outbound = none
default.event.whitelist.inbound = subscription
default.event.whitelist.outbound = subscription

View File

@@ -0,0 +1,10 @@
dataSourceName=entaxy.esb.cache
osgi.jdbc.driver.name=PostgreSQL JDBC Driver
serverName=localhost
portNumber=5432
databaseName=cache
user=entaxy
password=entaxy
pool=dbcp2
xa=true
jdbc.pool.maxTotal=100

View File

@@ -0,0 +1,10 @@
dataSourceName=entaxy.esb.storage
osgi.jdbc.driver.name=PostgreSQL JDBC Driver
serverName=localhost
portNumber=5432
databaseName=esb_entaxy
user=entaxy
password=entaxy
pool=dbcp2
xa=true
jdbc.pool.maxTotal=100

View File

@@ -0,0 +1,23 @@
# адреса кластера брокеров сообщений, задаются:
# если tcp в скобках и через запятую: (tcp://192.168.122.81:61616,tcp://192.168.122.82:61616)
# если amqp с failover и в скобках через запятую: failover:(amqp://192.168.122.81:5672,amqp://192.168.122.82:5672)
common.jms.url=tcp://localhost:61616
# логин для аутентификации в брокере сообщений
common.jms.username=entaxy
# пароль для аутентификации в брокере сообщений
common.jms.password=entaxy
# максимальное количество соединений
# подробнее можно почитать здесь: https://github.com/messaginghub/pooled-jms/blob/master/pooled-jms-docs/Configuration.md
common.jms.maxConnections=20
# максимальное количество сессий для каждого соединения
# подробнее можно почитать здесь: https://github.com/messaginghub/pooled-jms/blob/master/pooled-jms-docs/Configuration.md
common.jms.maxSessionsPerConnection=100
# наименование драйвера для инициализации фабрики планировщика quartz
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
# название очереди, через которую ходят большие пакеты и файлы
common.bridge.file.queue.name=file.queue
# восстановление профилей, коннекторов и других созданных пользователем блюпринтов с помощью базы данных
is.restore.from.db=true

View File

@@ -0,0 +1,8 @@
# адрес service-soap, будет формироваться host/cxf + passive.endpoint.address,
# по умолчанию passive.endpoint.address=/service
passive.endpoint.address=/service
# включение кастомной валидации soap сообщений по wsdl
passive.endpoint.validation=true
# название системы, в которую будут отправляться сообщения, если не был выставлен destination
passive.error.system.name=error

View File

@@ -0,0 +1,5 @@
# адрес soap-connector, будет формироваться host/cxf + passive.endpoint.address,
# по умолчанию passive.endpoint.address=/exchange
passive.endpoint.address=/exchange
# включение кастомной валидации soap сообщений по wsdl
passive.endpoint.validation=true

View File

@@ -0,0 +1,28 @@
# максимальное количество попыток отправить сообщение в очередь из агрегатора
redelivery.maximumRedeliveries=2
# очередь для отправки сообщений, которые не смог отправить агрегатор в destination
redelivery.deadLetterQueue=revert.message.dead
# задается в mc, значение по умолчанию 10 минут
acknowledge.completion.timeout=600000
# настройка способа агрегирования через игнайт или бд
# Важно! следить за тем чтобы данный параметр был одинаковым во всем кластере
# варианты - igniteAggregationRepository, jdbcAggregationRepository (для всех бд кроме postgres), postgresAggregationRepository
# по умолчанию - jdbcAggregationRepository
acknowledge.aggregation.repository=jdbcAggregationRepository
# Поднимается endpoint /active_connector_test_consumer
# при выставленной настройке mode.dev=true
active.mode.dev=false
active.username=Администратор
active.password=
# валидация сообщения по wsdl
active.validation=false
# uuid шины, для отправки в активном режиме в систему от имени шины
bus.id=FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
get.destination=
# параметр для тестирования активного коннектора
test.empty.rate=20

View File

@@ -0,0 +1,2 @@
# название группы cellar, которая прописывается в org.apache.karaf.cellar.groups.cfg, org.apache.karaf.cellar.node.cfg
cellar.group = default

View File

@@ -0,0 +1,2 @@
#Корневая папка репозитория
folder.root=entaxy/bundle-repository

View File

@@ -0,0 +1,12 @@
# все смены адреса расположения nexus и изменение наименования репозитория, необходимо фиксировать в файле
# org.ops4j.pax.url.mvn.cfg параметр: org.ops4j.pax.url.mvn.repositories
# url расположения nexus
nexus.deployer.url=http://localhost:8081
# название репозитория в nexus, необходимого для конфигурирования шины из вне(создание профилей, коннекторов и т д)
nexus.deployer.repository=entaxy
# логин для авторизации в nexus
nexus.deployer.username=entaxy
# пароль для авторизации в nexus
nexus.deployer.password=entaxy

View File

@@ -0,0 +1,21 @@
# асинхронный пакет с ошибкой отправляется от имени:
# 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

View File

@@ -0,0 +1,22 @@
# Справочник содержит соответствие имён классов исключений и http кодов ошибок.
# И будет наполняться по мере использования шины в разных ситуациях.
# Для исключения, имя которого ещё не указано в этом файле,
# будет возвращаться http код 520 (Unknown Error).
# согласование кодов ошибок происходит в https://docs.google.com/spreadsheets/d/1rvRyiSN-khuuRSJenwP5g7Q-ilbctOGCFgDfdM-abEk/edit#gid=1202937725
DefaultException=520
com.ctc.wstx.exc.WstxParsingException=400
java.lang.NullPointerException=418
java.security.AccessControlException=403
org.apache.cxf.interceptor.security.AuthenticationException=401
javax.ws.rs.ForbiddenException=403
org.apache.camel.language.bean.RuntimeBeanExpressionException=500
ConnectorNotFound=424
ru.entaxy.esb.system.common.exception.DefaultException=520
ProfileNotFound=424
java.io.FileNotFoundException=404

View File

@@ -0,0 +1,14 @@
# 1xx: Informational
# 2xx: Success
200=OK
# 3xx: Redirection
# 4xx: Client Error
400=Bad Request
401=Unauthorized
403=Forbidden
418=Im a teapot
424=Failed Dependency
# 5xx: Server Error
520=Unknown Error

View File

@@ -0,0 +1,12 @@
# адрес basic-auth, будет формироваться host/cxf + basic_auth_endpoint.address,
# по умолчанию basic_auth_endpoint.address=/basic-auth-management
basic_auth_endpoint.address=/basic-auth-management
#worked and tested on nginX MD5 and SHA-1(recommended)
еncryption.algorithm=SHA-1
#salt for encryption 1 to 8 characters ([\\.\\/a-zA-Z0-9]{1,8})
#when salt changed all password need to remake!
еncryption.salt=kDfq0qZJ
#Встроенная аутентификация
internal.authentication.enabled=true

View File

@@ -0,0 +1,11 @@
#наименование файла htpasswd на сервере karaf
htpasswd.file.name=htpasswd
#путь сохранения файла htpasswd на сервере karaf,
#при использовании кластера karaf-ов сохранять файл требуется в папку доступную на всех серверах, входящих в кластер
htpasswd.file.directory=entaxy/security
#наименование файла для сохранения контрольной суммы файла htpasswd
htpasswd.file.checksum=MD5.md5
htpasswd.service.host=http://0.0.0.0
htpasswd.service.port=9091
htpasswd.service.root.path=/htpasswd

View File

@@ -0,0 +1,9 @@
# максимальное колчичество попыток отправить сообщение в очередь
# почитать подробнее можно в https://camel.apache.org/components/latest/eips/dead-letter-channel.html#deadLetterChannel-Redelivery
redelivery.maximumRedeliveries=-1
# время между попытками отправить сообщение в очередь
redelivery.redeliveryDelay=5000
#cron - every 00:00:00,
#cron expression use "+" separator for quartz in camel
quirtz.job.clean.cron=0+0+0+*+*+?+*

View File

@@ -0,0 +1,9 @@
service.host=http://0.0.0.0
service.port.management=9090
#with changing path you must edit according records in permission table for accounts
service.root.path.management=/topic-management
service.port.subscription=9092
#with changing path you must edit according records in permission table for accounts
service.root.path.subscription=/topic-subscription

View File

@@ -0,0 +1,6 @@
# адрес system-management, будет формироваться host/cxf + system-management.endpoint.address,
# по умолчанию system-management.endpoint.address=/exchange
system-management.endpoint.address=/system-management
# флаг, отвечающий за публикацию сервиса system-management
system-management.endpoint.master=true

View File

@@ -0,0 +1,3 @@
# адрес schema-soap, будет формироваться host/cxf + schema-management.endpoint.address,
# по умолчанию schema-management.endpoint.address=/schema-management
schema-management.endpoint.address=/schema-management

View File

@@ -0,0 +1,482 @@
<?xml version="1.0" encoding="UTF-8"?>
<features name="karaf-entaxy-${project.version}"
xmlns="http://karaf.apache.org/xmlns/features/v1.3.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.3.0 http://karaf.apache.org/xmlns/features/v1.3.0">
<repository>mvn:org.apache.camel.karaf/apache-camel/${camel.version}/xml/features</repository>
<repository>mvn:org.apache.activemq/artemis-features/${activemq.version}/xml/features</repository>
<repository>mvn:org.hibernate/hibernate-osgi/${hibernate.version}/xml/karaf</repository>
<repository>mvn:org.apache.karaf.cellar/apache-karaf-cellar/${cellar.version}/xml/features</repository>
<repository>mvn:org.apache.ignite/ignite-osgi-karaf/${ignite.version}/xml/features</repository>
<feature name="karaf-camel-common" version="${project.version}">
<feature prerequisite="true">aries-blueprint</feature>
<feature>cxf</feature>
<feature>camel</feature>
<feature>camel-blueprint</feature>
<feature>camel-jaxb</feature>
<feature>camel-cxf</feature>
<feature>camel-amqp</feature>
<feature>camel-core</feature>
<feature>camel-http</feature>
<bundle>mvn:ru.entaxy.esb.system/component-bean-fix/${project.version}</bundle>
<capability>
osgi.service;objectClass=org.apache.aries.blueprint.NamespaceHandler;osgi.service.blueprint.namespace=http://camel.apache.org/schema/blueprint;effective:=active;
</capability>
</feature>
<feature name="system-entaxy-jms" version="${project.version}">
<feature>artemis-jms-client</feature>
<feature>camel-jms</feature>
<bundle>mvn:org.messaginghub/pooled-jms/1.0.6</bundle>
<bundle>mvn:org.apache.commons/commons-pool2/2.6.2</bundle>
</feature>
<feature name="system-entaxy-db" version="${project.version}">
<feature>hibernate</feature>
<feature>jdbc</feature>
<feature>pax-jdbc-pool-dbcp2</feature>
<feature>jndi</feature>
<feature>spring-jdbc</feature>
<feature version="[2,3)">jpa</feature>
<bundle>wrap:mvn:org.postgresql/postgresql/${postgresql.version}</bundle>
<bundle>wrap:mvn:com.microsoft.sqlserver/mssql-jdbc/${mssql.version}</bundle>
<configfile finalname="${karaf.etc}/org.ops4j.datasource-entaxy.esb.cache.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/datasource-cache
</configfile>
<configfile finalname="${karaf.etc}/org.ops4j.datasource-entaxy.esb.storage.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/datasource-storage
</configfile>
</feature>
<feature name="error-handler" version="${project.version}">
<bundle>mvn:ru.entaxy.esb.system.core/error-handler/${project.version}</bundle>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.error.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.error
</configfile>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.error.code.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.error.code
</configfile>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.error.text.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.error.text
</configfile>
</feature>
<feature name="entaxy-common" version="${project.version}">
<configfile finalname="${karaf.etc}/jre.properties" override="true">
mvn:ru.entaxy.esb/karaf-features/${project.version}/properties/jre
</configfile>
<feature version="${project.version}">karaf-camel-common</feature>
<feature version="${project.version}">system-entaxy-db</feature>
<feature version="${project.version}">system-entaxy-jms</feature>
<feature dependency="true">ignite-core</feature>
<bundle>mvn:org.apache.ignite/ignite-jcl/${ignite.version}</bundle>
<feature>camel-ignite</feature>
<feature>camel-sql</feature>
<feature version="${project.version}">entaxy-esb-api</feature>
</feature>
<feature name="system-maven" version="${project.version}">
<bundle>mvn:org.eclipse.aether/aether-transport-http/1.1.0</bundle>
<bundle>mvn:org.eclipse.aether/aether-transport-file/1.1.0</bundle>
<bundle>mvn:org.eclipse.aether/aether-connector-basic/1.1.0</bundle>
<bundle>mvn:org.eclipse.aether/aether-impl/1.1.0</bundle>
<bundle>wrap:mvn:org.apache.maven/maven-aether-provider/3.3.9</bundle>
</feature>
<feature name="system-common" version="${project.version}">
<feature dependency="true">aries-blueprint</feature>
<feature version="${project.version}">karaf-camel-common</feature>
<feature version="${project.version}">system-entaxy-db</feature>
<feature version="${project.version}">system-entaxy-jms</feature>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb
</configfile>
</feature>
<feature name="entaxy-esb-api" version="${project.version}">
<feature version="${cellar.version}">cellar</feature>
<feature version="${project.version}">bundle-service</feature>
<feature version="${project.version}">system-common</feature>
<feature version="${project.version}">entaxy-common</feature>
<feature>camel-gson</feature>
<bundle>mvn:ru.entaxy.esb.system.core/template/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.commons/system-commons/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.core.dispatcher/dispatcher/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.profile.commons/profile-commons/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.connector/connector-impl/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.connector/connector-api/${project.version}</bundle>
<feature version="${project.version}">system-api</feature>
<feature version="${project.version}">nexus-deployer</feature>
<feature version="${project.version}">file-system-deployer</feature>
<feature version="${project.version}">cellar-deployer</feature>
<feature version="${project.version}">blueprint-generator</feature>
<!-- <feature version="${project.version}">file-connector</feature>-->
<bundle>mvn:ru.entaxy.esb.system.management.bundle.manager/bundle-manager/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.management.connector.manager/connector-manager/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.management.bridge.profile.manager/bridge-profile-manager/${project.version}
</bundle>
<bundle>mvn:ru.entaxy.esb.system.management.profile.manager/profile-manager/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.management.route.manager/route-manager/${project.version}</bundle>
<feature version="${project.version}">system-management</feature>
<feature version="${project.version}">schema</feature>
</feature>
<feature name="file-system-deployer" version="${project.version}">
<feature>camel-blueprint</feature>
<bundle>mvn:ru.entaxy.esb.system.deployer/deployer-api/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.deployer/file-system-deployer/${project.version}</bundle>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.deployer.file.system.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.deployer.file.system
</configfile>
</feature>
<feature name="nexus-deployer" version="${project.version}">
<bundle>mvn:org.eclipse.aether/aether-api/${aether.version}</bundle>
<feature>camel-http</feature>
<feature>camel-cxf</feature>
<bundle>mvn:ru.entaxy.esb.system.deployer/deployer-api/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.deployer/nexus-deployer/${project.version}</bundle>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.deployer.nexus.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.deployer.nexus
</configfile>
</feature>
<feature name="cellar-deployer" version="${project.version}">
<bundle>mvn:ru.entaxy.esb.system.deployer/cellar-deployer/${project.version}</bundle>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.deployer.cellar.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.deployer.cellar
</configfile>
</feature>
<feature name="blueprint-generator" version="${project.version}">
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.freemarker/2.3.29_1</bundle>
<bundle>mvn:ru.entaxy.esb.system.management.blueprint.generator/blueprint-generator/${project.version}</bundle>
</feature>
<feature name="bundle-service" version="${project.version}">
<bundle>mvn:ru.entaxy.esb.system.management.bundle.jpa/bundle-service/${project.version}</bundle>
<capability>
osgi.service;objectClass=org.hibernate.SessionFactory;effective:=active;
</capability>
</feature>
<feature name="system-management" version="${project.version}">
<configfile finalname="${karaf.etc}/ru.entaxy.esb.system.management.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.system.management
</configfile>
<bundle>mvn:ru.entaxy.esb.system.management/system-management-api/${project.version}</bundle>
<capability>
osgi.service;objectClass=org.hibernate.SessionFactory;effective:=active;
</capability>
</feature>
<feature name="profile-commons" version="${project.version}">
<bundle>mvn:ru.entaxy.esb.system.core.dispatcher/dispatcher/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.profile.commons/profile-commons/${project.version}</bundle>
</feature>
<feature name="liquibase-updater" version="${project.version}">
<feature version="${project.version}">karaf-camel-common</feature>
<feature version="${project.version}">system-entaxy-db</feature>
<feature version="${project.version}">system-entaxy-jms</feature>
<bundle>mvn:org.liquibase/liquibase-core/${liquibase.version}</bundle>
<bundle>mvn:ru.entaxy.esb.platform.runtime.core.initializer.storage.initializer/liquibase-updater/${project.version}</bundle>
<feature version="${project.version}">storage-cache</feature>
<feature version="${project.version}">storage-esb_entaxy</feature>
</feature>
<feature name="storage-cache" version="${project.version}">
<bundle>mvn:ru.entaxy.esb.platform.runtime.core.initializer.storage.initializer/storage-cache/${project.version}</bundle>
<capability>
osgi.service;effective:=active;objectClass=javax.sql.DataSource;osgi.jndi.service.name=entaxy.esb.cache;
</capability>
<capability>
osgi.service;objectClass=javax.sql.DataSource;osgi.jndi.service.name=entaxy.esb.cache-connector;
</capability>
</feature>
<feature name="storage-esb_entaxy" version="${project.version}">
<bundle>mvn:ru.entaxy.esb.platform.runtime.core.initializer.storage.initializer/storage-esb_entaxy/${project.version}</bundle>
<capability>
osgi.service;effective:=active;objectClass=javax.sql.DataSource;osgi.jndi.service.name=entaxy.esb.storage;
</capability>
</feature>
<feature name="system-profile" version="${project.version}">
<feature version="${project.version}">profile-commons</feature>
<bundle>mvn:ru.entaxy.esb.system.registry.systems.profile/system-profile-api/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.systems.profile/system-profile-collector/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.systems.profile/system-profile-impl-default/${project.version}
</bundle>
</feature>
<feature name="system-api" version="${project.version}">
<feature version="${project.version}">system-entaxy-db</feature>
<feature version="${project.version}">system-entaxy-jms</feature>
<feature version="${project.version}">bundle-service</feature>
<feature version="${project.version}">permission-api</feature>
<bundle>mvn:ru.entaxy.esb.system.commons/system-commons/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.connector/connector-api/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.systems/system-api/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.systems/system-impl/${project.version}</bundle>
<capability>
osgi.service;objectClass=org.hibernate.SessionFactory;effective:=active;
</capability>
</feature>
<feature name="system-registry" version="${project.version}">
<feature version="${project.version}">karaf-camel-common</feature>
<feature version="${project.version}">system-entaxy-jms</feature>
<feature version="${project.version}">system-common</feature>
<feature version="${project.version}">system-profile</feature>
<bundle>mvn:ru.entaxy.esb.system.registry.systems/system-component/${project.version}</bundle>
<capability>
osgi.service;objectClass=org.hibernate.SessionFactory;effective:=active;
</capability>
</feature>
<feature name="system-group-profile" version="${project.version}">
<bundle>mvn:ru.entaxy.esb.system.registry.system-groups.profile/system-group-profile-api/${project.version}
</bundle>
<bundle>
mvn:ru.entaxy.esb.system.registry.system-groups.profile/system-group-profile-collector/${project.version}
</bundle>
<bundle>
mvn:ru.entaxy.esb.system.registry.system-groups.profile/system-group-profile-impl-default/${project.version}
</bundle>
</feature>
<feature name="system-group-registry" version="${project.version}">
<feature version="${project.version}">karaf-camel-common</feature>
<feature version="${project.version}">system-entaxy-jms</feature>
<feature version="${project.version}">system-common</feature>
<feature version="${project.version}">system-group-profile</feature>
<bundle>mvn:ru.entaxy.esb.system.registry.system-groups/system-group-component/${project.version}</bundle>
</feature>
<feature name="basic-auth" version="${project.version}">
<feature version="${project.version}">karaf-camel-common</feature>
<feature version="${project.version}">liquibase-updater</feature>
<bundle>mvn:commons-codec/commons-codec/${commons-codec.version}</bundle>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.system.basic_auth.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.system.basic_auth
</configfile>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.system.basic_auth.htpasswd.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.system.basic_auth.htpasswd
</configfile>
<bundle>mvn:ru.entaxy.esb.system.auth.basic.api/basic-auth-api/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.auth.basic.impl/basic-auth-impl/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.auth.basic.htpasswd/htpasswd/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.auth.basic/basic-auth-soap/${project.version}</bundle>
<capability>
osgi.service;objectClass=org.hibernate.SessionFactory;effective:=active;
</capability>
</feature>
<feature name="events" version="${project.version}">
<feature version="${project.version}">events-impl</feature>
<feature version="${project.version}">events-rest</feature>
<feature version="${project.version}">events-handler</feature>
</feature>
<feature name="events-common" version="${project.version}">
<bundle>mvn:ru.entaxy.esb.system.core.events/events-common/${project.version}</bundle>
</feature>
<feature name="events-rest" version="${project.version}">
<feature version="${cellar.version}">cellar</feature>
<feature version="${cellar.version}">cellar-eventadmin</feature>
<feature>camel-eventadmin</feature>
<feature version="${project.version}">karaf-camel-common</feature>
<feature>camel-jsonpath</feature>
<feature>camel-gson</feature>
<feature version="${project.version}">system-common</feature>
<feature version="${project.version}">error-handler</feature>
<feature version="${project.version}">system-registry</feature>
<feature version="${project.version}">system-api</feature>
<feature version="${project.version}">events-api</feature>
<feature version="${project.version}">basic-auth</feature>
<feature version="${project.version}">events-common</feature>
<feature version="${project.version}">permission-impl</feature>
<feature version="${project.version}">permission-handler</feature>
<feature version="${project.version}">permission-component</feature>
<bundle>mvn:ru.entaxy.esb.system.commons/system-commons/${project.version}</bundle>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.system.event.rest.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.system.event.rest
</configfile>
<bundle>mvn:ru.entaxy.esb.system.core.events/events-rest/${project.version}</bundle>
</feature>
<feature name="events-api" version="${project.version}">
<feature version="${project.version}">system-entaxy-db</feature>
<feature version="${project.version}">events-common</feature>
<bundle>mvn:ru.entaxy.esb.system.core.events/events-api/${project.version}</bundle>
</feature>
<feature name="events-impl" version="${project.version}">
<feature version="${project.version}">system-common</feature>
<feature version="${project.version}">events-api</feature>
<feature version="${project.version}">events-common</feature>
<bundle>mvn:ru.entaxy.esb.system.core.events/events-impl/${project.version}</bundle>
<capability>
osgi.service;objectClass=org.hibernate.SessionFactory;effective:=active;
</capability>
</feature>
<feature name="events-handler" version="${project.version}">
<feature>camel-ognl</feature>
<feature>camel-gson</feature>
<feature>camel-quartz</feature>
<feature version="${project.version}">system-common</feature>
<feature version="${project.version}">events-api</feature>
<feature version="${project.version}">events-common</feature>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.system.event.handler.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.system.event.handler
</configfile>
<bundle>mvn:ru.entaxy.esb.system.core.events/events-handler/${project.version}</bundle>
<capability>
osgi.service;effective:=active;objectClass=javax.sql.DataSource;osgi.jndi.service.name=entaxy.esb.cache;
</capability>
</feature>
<feature name="permission" version="${project.version}">
<feature version="${project.version}">permission-impl</feature>
<feature version="${project.version}">permission-handler</feature>
<feature version="${project.version}">permission-component</feature>
<feature version="${project.version}">permission-soap</feature>
<feature version="${project.version}">permission-manager</feature>
</feature>
<feature name="permission-common" version="${project.version}">
<bundle>mvn:ru.entaxy.esb.system.core.permission/permission-common/${project.version}</bundle>
</feature>
<feature name="permission-api" version="${project.version}">
<feature version="${project.version}">system-entaxy-db</feature>
<bundle>mvn:ru.entaxy.esb.system.core.permission/permission-api/${project.version}</bundle>
</feature>
<feature name="permission-impl" version="${project.version}">
<feature version="${project.version}">liquibase-updater</feature>
<feature version="${project.version}">system-entaxy-db</feature>
<feature version="${project.version}">system-common</feature>
<feature version="${project.version}">permission-api</feature>
<feature version="${project.version}">permission-common</feature>
<bundle>mvn:ru.entaxy.esb.system.core.permission/permission-impl/${project.version}</bundle>
<capability>
osgi.service;objectClass=org.hibernate.SessionFactory;effective:=active;
</capability>
</feature>
<feature name="permission-handler" version="${project.version}">
<feature>camel-ognl</feature>
<feature version="${project.version}">system-entaxy-jms</feature>
<feature version="${project.version}">system-common</feature>
<feature version="${project.version}">permission-impl</feature>
<feature version="${project.version}">permission-common</feature>
<!-- <configfile finalname="${karaf.etc}/ru.entaxy.esb.system.event.handler.cfg" override="false">mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.system.event.handler</configfile> -->
<bundle>mvn:ru.entaxy.esb.system.core.permission/permission-handler/${project.version}</bundle>
</feature>
<feature name="permission-manager" version="${project.version}">
<feature version="${project.version}">permission-component</feature>
<bundle>mvn:ru.entaxy.esb.system.management.permission.manager/permission-manager/${project.version}</bundle>
</feature>
<feature name="permission-component" version="${project.version}">
<feature version="${project.version}">system-common</feature>
<feature>camel-gson</feature>
<feature version="${project.version}">permission-common</feature>
<feature version="${project.version}">permission-impl</feature>
<feature version="${project.version}">system-api</feature>
<bundle>mvn:ru.entaxy.esb.system.commons/system-commons/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.core.permission/permission-component/${project.version}</bundle>
</feature>
<feature name="permission-soap" version="${project.version}">
<feature version="${project.version}">basic-auth</feature>
<feature version="${project.version}">karaf-camel-common</feature>
<bundle>mvn:ru.entaxy.esb.system.core.permission/permission-soap/${project.version}</bundle>
</feature>
<feature name="schema" version="${project.version}">
<feature version="${project.version}">system-entaxy-db</feature>
<configfile finalname="${karaf.etc}/ru.entaxy.esb.system.schema.cfg" override="false">
mvn:ru.entaxy.esb/karaf-features/${project.version}/cfg/ru.entaxy.esb.system.schema
</configfile>
<bundle>mvn:ru.entaxy.esb.system.registry.schema/schema-api/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.schema/schema-impl/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.schema/schema-soap/${project.version}</bundle>
<bundle>mvn:ru.entaxy.esb.system.registry.schema/schema-component/${project.version}</bundle>
<capability>
osgi.service;objectClass=org.hibernate.SessionFactory;effective:=active;
</capability>
</feature>
<feature name="entaxy-service" version="${project.version}">
<feature version="${project.version}">basic-auth</feature>
<feature version="${project.version}">permission</feature>
<feature version="${project.version}">entaxy-esb-api</feature>
<feature version="${project.version}">system-registry</feature>
<feature version="${project.version}">system-group-registry</feature>
<feature version="${project.version}">events</feature>
</feature>
<feature name="entaxy-all" version="${project.version}">
<configfile finalname="${karaf.etc}/branding.properties" override="true">
mvn:ru.entaxy.esb.platform.runtime.base/branding/${project.version}/properties/branding
</configfile>
<feature version="${project.version}">entaxy-service</feature>
</feature>
</features>

View File

@@ -0,0 +1,9 @@
## Репозиторий с релизами
http://192.168.122.76:8081/service/rest/repository/browse/karaf_patch/
## Install patch
tar -zxf karaf_update_1.0.10-SNAPSHOT.tgz install.sh; ./install.sh 1.0.10-SNAPSHOT

View File

@@ -0,0 +1,5 @@
#!/bin/sh
sed -i s/192.168.122.81/artemis1/g ru.entaxy.esb.*
sed -i s/192.168.122.82/artemis2/g ru.entaxy.esb.*
sed -i s/192.168.122.84/database/g org.ops4j.datasource-entaxy.esb.*

View File

@@ -0,0 +1,47 @@
#!/bin/sh
DIRNAME="$( cd "$(dirname "$0")" ; pwd -P )"
INSTALL_DIR=$DIRNAME/karaf-full-$(date +%d%m%Y-%H%M)
mkdir -p $INSTALL_DIR/bin
mkdir -p $INSTALL_DIR/etc
mkdir -p $INSTALL_DIR/lib
mkdir -p $INSTALL_DIR/system
mkdir -p $INSTALL_DIR/data
mkdir -p $INSTALL_DIR/systemd/system
sudo systemctl stop karaf
echo "Stopped karaf"
cp -R /opt/karaf/bin/* $INSTALL_DIR/bin
cp -R /opt/karaf/etc/* $INSTALL_DIR/etc
cp -R /opt/karaf/lib/* $INSTALL_DIR/lib
cp -R /opt/karaf/system/* $INSTALL_DIR/system
cp -R /opt/karaf/data/* $INSTALL_DIR/data
cp /etc/systemd/system/karaf $INSTALL_DIR/systemd/system
cp /etc/systemd/system/karaf.service $INSTALL_DIR/systemd/system
sudo systemctl start karaf
echo "Started karaf"
rm -rf $INSTALL_DIR/data/tmp/*
rm -rf $INSTALL_DIR/data/log/*
rm -rf $INSTALL_DIR/data/txlog/*
#pushd ./$INSTALL_DIR/etc
#$DIRNAME/change_ips.sh
#popd
if test -f "$DIRNAME/version"; then
ESB_ENTAXY_VERSION=`cat $DIRNAME/version`
else
ESB_ENTAXY_VERSION=1.0-SNAPSHOT
fi
echo "Installing $ESB_ENTAXY_VERSION"
pushd $INSTALL_DIR
tar czvf $DIRNAME/karaf_full_$ESB_ENTAXY_VERSION.tgz *
popd
rm -rf $INSTALL_DIR

View File

@@ -0,0 +1,44 @@
#!/bin/sh
# создает архив с обновлением
DIRNAME="$( cd "$(dirname "$0")" ; pwd -P )"
if test -f "$DIRNAME/version"; then
ESB_ENTAXY_VERSION=`cat $DIRNAME/version`
else
ESB_ENTAXY_VERSION=1.0-SNAPSHOT
fi
echo "Create patch version $ESB_ENTAXY_VERSION"
RELEASE_DIR=$DIRNAME/karaf-$(date +%d%m%Y-%H%M)
mkdir -p $RELEASE_DIR
mkdir -p $RELEASE_DIR/etc
mkdir -p $RELEASE_DIR/data
sudo systemctl stop karaf
echo "Stopped karaf"
cp -R /opt/karaf/etc/* $RELEASE_DIR/etc
cp -R /opt/karaf/data/* $RELEASE_DIR/data
cp $DIRNAME/change_ips.sh $RELEASE_DIR/etc
cp $DIRNAME/install_patch.sh $RELEASE_DIR/install.sh
sudo systemctl start karaf
echo "Started karaf"
rm -rf $RELEASE_DIR/data/tmp/*
rm -rf $RELEASE_DIR/data/log/*
rm -rf $RELEASE_DIR/data/txlog/*
pushd $RELEASE_DIR
tar czvf $DIRNAME/karaf_update_$ESB_ENTAXY_VERSION.tgz *
popd
rm -rf $RELEASE_DIR
curl -v --user 'deployer:deployer' --upload-file $DIRNAME/README.md http://192.168.122.76:8081/repository/karaf_patch/README.md
curl -v --user 'deployer:deployer' --upload-file $DIRNAME/karaf_update_$ESB_ENTAXY_VERSION.tgz http://192.168.122.76:8081/repository/karaf_patch/karaf_update_$ESB_ENTAXY_VERSION.tgz
echo "Upload path to nexus http://192.168.122.76:8081/service/rest/repository/browse/karaf_patch/"

View File

@@ -0,0 +1,26 @@
#ESB_ENTAXY_VERSION=1.0-SNAPSHOT
echo "== Install hawtio"
feature:repo-add hawtio 2.12.0
feature:install hawtio
echo "== Install decanter"
#feature:repo-add decanter
#feature:install decanter-appender-elasticsearch decanter-collector-log decanter-collector-jmx
sleep 5
feature:repo-add mvn:ru.entaxy.esb/karaf-features/$ESB_ENTAXY_VERSION/xml/features
sleep 30
echo "== Install entaxy-all"
feature:install entaxy-all
sleep 10
feature:repo-add mvn:ru.entaxy.esb.platform.runtime/base/$ESB_ENTAXY_VERSION/xml/features
feature:install connecting
install -s mvn:ru.entaxy.esb.platform.runtime.core.management/connection-manager/$ESB_ENTAXY_VERSION
install -s mvn:ru.entaxy.esb.platform.runtime.core.initializer/connection-initializer/$ESB_ENTAXY_VERSION
sleep 10
feature:repo-add mvn:ru.entaxy.esb.platform.runtime.modules/uniform-service/$ESB_ENTAXY_VERSION/xml/features
feature:install entaxy-uniform-service

View File

@@ -0,0 +1,55 @@
#!/bin/sh
# первый параметр номер версии
# если задан второй параметр чистит конфиги
DIRNAME="$( cd "$(dirname "$0")" ; pwd -P )"
ESB_ENTAXY_VERSION=$1
PATCH_FILE=$DIRNAME/karaf_update_$ESB_ENTAXY_VERSION.tgz
if test -f "$PATCH_FILE"; then
echo "Installing $ESB_ENTAXY_VERSION, use patch file: $PATCH_FILE"
else
echo "Error: patch file $PATCH_FILE not found"
fi
sudo systemctl stop karaf
echo "Stopped karaf"
BKPDIR=$DIRNAME/backup-karaf-$(date +%d%m%Y-%H%M)
mkdir -p $BKPDIR
echo "Created dir $BKPDIR"
# create backup
sudo cp -r /opt/karaf/etc $BKPDIR
sudo cp -r /opt/karaf/data $BKPDIR
# clean backed dirs
sudo su - -c "rm -rf /opt/karaf/data/*" karaf
if [ -n "$2" ]
then
# clean configs
sudo su - -c "rm -rf /opt/karaf/etc/ru.entaxy.esb.*" karaf
sudo su - -c "rm -rf /opt/karaf/etc/org.ops4j.datasource-entaxy.esb.*" karaf
echo "Karaf data and configs cleaned up"
else
echo "Karaf data cleaned up"
fi
sudo tar -zxk -f $PATCH_FILE -C /opt/karaf/
if [ -n "$2" ]
then
sudo /opt/karaf/etc/change_ips.sh
echo "Run change_ips.sh"
fi
# restore file owner
sudo chown -R karaf. /opt/karaf/{etc,data}
sudo systemctl start karaf
echo "Started karaf"
sleep 30
sudo su - -c "/opt/karaf/bin/client 'list --no-format | grep -v Active'" karaf

View File

@@ -0,0 +1,63 @@
#!/bin/sh
# берет номер версии из файла version, если его нет то используется 1.0-SNAPSHOT
# если задан первый параметр чистит конфиги
DIRNAME="$( cd "$(dirname "$0")" ; pwd -P )"
if test -f "$DIRNAME/version"; then
ESB_ENTAXY_VERSION=`cat $DIRNAME/version`
else
ESB_ENTAXY_VERSION=1.0-SNAPSHOT
fi
echo "Installing $ESB_ENTAXY_VERSION"
sudo systemctl stop karaf
echo "Stopped karaf"
BKPDIR=$DIRNAME/backup-karaf-$(date +%d%m%Y-%H%M)
mkdir -p $BKPDIR
echo "Created dir $BKPDIR"
# create backup
cp -r /opt/karaf/etc $BKPDIR
cp -r /opt/karaf/data $BKPDIR
# clean backed dirs
sudo rm -rf /opt/karaf/data/*
if [ -n "$1" ]
then
# clean configs
sudo rm -rf /opt/karaf/etc/ru.entaxy.esb.*
sudo rm -rf /opt/karaf/etc/org.ops4j.datasource-entaxy.esb.*
echo "Karaf data and configs cleaned up"
else
echo "Karaf data cleaned up"
fi
# restore file owner
sudo chown -R karaf. /opt/karaf/{etc,data}
sudo systemctl start karaf
echo "Started karaf"
sleep 15
sudo cp -r $DIRNAME/install.karaf /opt/karaf/
sudo su - -c "/opt/karaf/bin/client 'esb_entaxy_VERSION=$ESB_ENTAXY_VERSION; shell:source /opt/karaf/install.karaf;'" karaf
echo "== Update database"
sudo su - -c "/opt/karaf/bin/client 'feature:install liquibase-updater'" karaf
sleep 60
echo "== Install all features"
sudo su - -c "/opt/karaf/bin/client 'feature:install entaxy-all'" karaf
sleep 60
echo "== Install system-group profile"
sudo su - -c "/opt/karaf/bin/client 'bundle:install -s blueprint:mvn:ru.entaxy.esb.integration.esb.test.profiles/test-profiles/$ESB_ENTAXY_VERSION/xml/g_test'" karaf
echo "Install process finished"

20
platform/pom.xml Normal file
View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>root</artifactId>
<groupId>ru.entaxy.esb</groupId>
<version>1.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>platform</artifactId>
<name>ENTAXY :: PLATFORM</name>
<description>Entaxy Platform</description>
<packaging>pom</packaging>
<modules>
<module>runtime</module>
</modules>
</project>

View File

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>ru.entaxy.esb.platform.runtime</groupId>
<artifactId>base</artifactId>
<version>1.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>ru.entaxy.esb.platform.runtime.base</groupId>
<artifactId>branding</artifactId>
<name>ENTAXY :: PLATFORM :: RUNTIME :: BASE :: BRANDING</name>
<description>Entaxy Branding</description>
<packaging>pom</packaging>
<build>
<resources>
<resource>
<directory>src/main/cfg</directory>
<filtering>true</filtering>
<targetPath>${project.build.directory}/cfg</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<id>attach-artifacts</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>target/cfg/branding.properties</file>
<type>properties</type>
<classifier>branding</classifier>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,17 @@
welcome = \
\u001B[36m :::::::::: :::: ::: ::::::::::: ::: ::: ::: ::: ::: \u001B[0m\r\n\
\u001B[36m :+: :+:+: :+: :+: :+: :+: :+: :+: :+: :+: \u001B[0m\r\n\
\u001B[36m +:+ :+:+:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ \u001B[0m\r\n\
\u001B[36m +#++:++# +#+ +:+ +#+ +#+ +#++:++#++: +#++:+ +#++: \u001B[0m\r\n\
\u001B[36m +#+ +#+ +#+#+# +#+ +#+ +#+ +#+ +#+ +#+ \u001B[0m\r\n\
\u001B[36m #+# #+# #+#+# #+# #+# #+# #+# #+# #+# \u001B[0m\r\n\
\u001B[36m ########## ### #### ### ### ### ### ### ### \u001B[0m\r\n\
\r\n\
\u001B[1m Entaxy \u001B[0m (${project.version})\r\n\
\u001B[1m Karaf version: \u001B[0m (${karaf.version})\r\n\
\u001B[1m Camel version: \u001B[0m (${camel.version})\r\n\
\u001B[1m CXF version: \u001B[0m (${cxf.version})\r\n\
\r\n\
Hit '\u001B[1m<tab>\u001B[0m' for a list of available commands\r\n\
and '\u001B[1m[cmd] --help\u001B[0m' for help on a specific command.\r\n\
Hit '\u001B[1m<ctrl-d>\u001B[0m' or '\u001B[1mosgi:shutdown\u001B[0m' to shutdown Entaxy.\r\n

View File

@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>ru.entaxy.esb.platform.runtime.base.connecting</groupId>
<artifactId>adapter</artifactId>
<version>1.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>ru.entaxy.esb.platform.runtime.base.connecting.adapter</groupId>
<artifactId>adapters-core</artifactId>
<packaging>bundle</packaging>
<name>ENTAXY :: PLATFORM :: RUNTIME :: BASE :: CONNECTING :: ADAPTER :: ADAPTER CORE</name>
<description>ENTAXY :: PLATFORM :: RUNTIME :: BASE :: CONNECTING :: ADAPTER :: ADAPTER CORE</description>
<properties>
<bundle.osgi.export.pkg>
ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.api,
ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.impl,
ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.metadata,
ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.tracker,
ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.util
</bundle.osgi.export.pkg>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-Activator>ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.tracker.AdapterTrackerActivator</Bundle-Activator>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>osgi.core</artifactId>
<version>${osgi.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<dependency>
<groupId>ru.entaxy.esb.system.management.blueprint.generator</groupId>
<artifactId>blueprint-generator</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>ru.entaxy.esb.platform.runtime.base.connecting.generator</groupId>
<artifactId>generator-factory</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,32 @@
package ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.api;
import ru.entaxy.esb.system.management.blueprint.generator.Blueprint;
import java.util.HashMap;
import java.util.Map;
public interface Adapter {
public static final String ADAPTER_CLASS_HEADER_NAME = "Entaxy-Adapter-Class";
public static final String ADAPTER_HEADER_NAME = "Entaxy-Adapter";
public default boolean isInited() {
return false;
}
public default String getId() {
return "none";
}
public default String getName() {
return "Undefined";
}
public default String getDescription() {
return "Undefined";
}
public default Map<String, String> getOptions() {
return new HashMap<>();
}
public default Map<String, String> getProperties() {
return new HashMap<>();
}
public default Blueprint generate(String type, Map<String, Object> map) throws Exception {
return null;
}
}

View File

@@ -0,0 +1,142 @@
package ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.impl;
import com.google.gson.*;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.api.Adapter;
import ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.metadata.AdapterFieldElement;
import ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.metadata.AdapterGeneratorElement;
import ru.entaxy.esb.platform.runtime.base.connecting.adapter.core.metadata.AdapterMetadataElement;
import ru.entaxy.esb.platform.runtime.base.connecting.generator.Generator;
import ru.entaxy.esb.platform.runtime.base.connecting.generator.factory.GeneratorFactory;
import ru.entaxy.esb.platform.runtime.base.connecting.generator.ftl.FTLGenerator;
import ru.entaxy.esb.system.management.blueprint.generator.Blueprint;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
public class DefaultAdapter implements Adapter {
protected static final Logger log = LoggerFactory.getLogger(DefaultAdapter.class);
protected BundleContext bundleContext;
protected boolean isInited = false;
protected String defaultId = "none";
protected String defaultName = "Undefined";
protected String defaultDescription = "Undefined";
protected AdapterMetadataElement adapterMetadata;
protected Map<String, Generator> generatorList = new HashMap<>();
public DefaultAdapter(BundleContext bundleContext) throws IOException {
this.bundleContext = bundleContext;
log.debug("Constructor of adapter {}", DefaultAdapter.class.getName());
this.isInited = this.init();
}
protected boolean init() throws IOException {
URL metadataUrl = this.bundleContext.getBundle().getEntry("/ru/entaxy/adapter/metadata.json");
log.debug("Json URL is {}", metadataUrl.toString());
String metadata = new BufferedReader (
new InputStreamReader(
metadataUrl.openStream(), StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"));
log.debug("Adapter json description: \n" + metadata);
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
JsonElement je = (new JsonParser()).parse(metadata);
JsonObject root = je.getAsJsonObject();
JsonElement adapterElement = root.get("adapter");
this.adapterMetadata = gson.fromJson(adapterElement, AdapterMetadataElement.class);
initGenerators(adapterMetadata.getGenerators());
return this.adapterMetadata != null && !generatorList.isEmpty();
}
private void initGenerators(List<AdapterGeneratorElement> generators) {
for (AdapterGeneratorElement generator: generators) {
String usageType = generator.getType();
String generatorType = generator.getGenerator();
generatorList.put(usageType,
GeneratorFactory.createGenerator(generatorType, usageType, bundleContext));
}
log.debug("generatorList: " + generatorList);
//TODO checkGeneratorList();
}
/* Interface */
@Override
public boolean isInited() {
return isInited;
}
@Override
public String getId() {
return this.isInited?this.adapterMetadata.getId():this.defaultId;
}
public void setId(String id) {
this.adapterMetadata.setId(id);
}
@Override
public String getName() {
return this.isInited?this.adapterMetadata.getName():this.defaultName;
}
public void setName(String name) {
this.adapterMetadata.setName(name);
}
@Override
public String getDescription() {
return this.isInited?this.adapterMetadata.getDescription():this.defaultDescription;
}
public void setDescription(String description) {
this.adapterMetadata.setDescription(description);
}
@Override
public Map<String, String> getProperties(){
return this.adapterMetadata.getFields()
.stream()
.filter(field -> field.isProperty())
.collect(Collectors.toMap(AdapterFieldElement::getName, AdapterFieldElement::getType));
}
@Override
public Map<String, String> getOptions(){
return this.adapterMetadata.getFields()
.stream()
.filter(field -> field.isOption())
.collect(Collectors.toMap(AdapterFieldElement::getName, AdapterFieldElement::getType));
}