ENTAXY-480 release version 1.8.3

This commit is contained in:
Валерия Бородина 2023-08-03 04:44:09 +03:00
parent 603889d627
commit 5844a2e5cf
2546 changed files with 11242 additions and 207556 deletions

View File

@ -1,141 +0,0 @@
## Docker compose для сборки и запуска Entaxy.
Запуск локального окружения с несколькими docker контейнерами:
* Караф
* Брокер
* СУБД
* Менеджер артефактов
Для начала клонируем репозиторий и переходим в корень проекта:
```bash
git clone <entaxy-framework-repository>
cd entaxy-framework
```
Далее у нас есть разные варианты хранения необходимых для установки Entaxy артефактов.
### 1. Самый простой способ: локальный репозиторий артефактов включаеться в образ карафа.
В корневом POM находится профиль для деплоя артефактов в образ карафа:
```xml
<profile>
<id>docker.file.repo</id>
<distributionManagement>
<snapshotRepository>
<id>entaxy-maven-repo-file</id>
<url>file:./distribution/entaxy-docker/karaf/repo</url>
</snapshotRepository>
</distributionManagement>
</profile>
```
Запускаем мевен деплой из корня проекта с этим профилем:
```bash
mvn deploy -P docker.file.repo
```
И после успешной сборки запускаем контейнеры из директории проекта, в которой находится docker-compose.yml:
```bash
cd ./distribution/entaxy-docker
docker-compose up
```
Или `docker compose up` для новых версий docker.
После запуска комманды мы будем видеть прогресс сборки образов, запуска контейнеров и логи запущенных приложений. Для остановки контейнеров достаточно нажать сочетание клавиш Ctrl+C или через команды запущенные из другого окна/вкладки терминала.
```bash
docker-compose stop
docker-compose start
```
После запуска контейнеров открываем новый терминал и заходим в караф:
```bash
docker-compose exec karaf /opt/apache-karaf/bin/client
```
или ssh клиент с дальнейшим вводом пароля (karaf)
```bash
ssh -p 8101 karaf@localhost
```
И в консоли карафа запускаем скрипт с установкой необходимых фич:
```bash
shell:source ./install.karaf
```
Ждём окончания деплоя в караф.
(Не всегда полная установка проходит с первой попытки и тогда помогает повторный запуск `source install.karaf`)
### 2. Reposilite: легковесный http репозиторий артефактов запускается в отдельном контейнере.
Комментируем в файле install.karaf строку начинающуюся с:
```bash
config:property-set -p org.ops4j.pax.url.mvn org.ops4j.pax.url.mvn.repositories file:/opt/apache-karaf/repo
```
И убираем комментарий в строке начинающейся:
```bash
#config:property-set -p org.ops4j.pax.url.mvn org.ops4j.pax.url.mvn.repositories http://maven-repo/snapshots
```
Запускаем контейнеры из директории проекта, в которой находится docker-compose.yml:
```bash
cd ./distribution/entaxy-docker
docker-compose up
```
Или `docker compose up` для новых версий docker.
После запуска комманды мы будем видеть прогресс сборки образов, запуска контейнеров и логи запущенных приложений. Для остановки контейнеров достаточно нажать сочетание клавиш Ctrl+C или через команды запущенные из другого окна/вкладки терминала.
```bash
docker-compose stop
docker-compose start
```
Для деплоя в reposilite добавляем учётные данные в конфигурацию мавена (`~/.m2/settings.xml`):
```xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>entaxy-maven-repo</id>
<username>admin</username>
<password>aW7frfS9NPGrOnuNBMf9gyO0eXNRaCoOGtXHTcLU5akDFJ9ACiUJhgmZxlOKnLC5</password>
</server>
</servers>
</settings>
```
В корневом POM находится профиль для деплоя артефактов на сервер reposilite:
```xml
<profile>
<id>docker.reposilite</id>
<distributionManagement>
<snapshotRepository>
<id>entaxy-maven-repo</id>
<url>http://127.0.0.1:8081/snapshots</url>
</snapshotRepository>
</distributionManagement>
</profile>
```
Запускаем мевен деплой из корня проекта с этим профилем:
```bash
mvn deploy -P docker.reposilite
```
После успешной сборки открываем новый терминал и заходим в караф:
```bash
docker-compose exec karaf /opt/apache-karaf/bin/client
```
или ssh клиент с дальнейшим вводом пароля (karaf)
```bash
ssh -p 8101 karaf@localhost
```
И в консоли карафа запускаем скрипт с установкой необходимых фич:
```bash
shell:source ./install.karaf
```
Ждём окончания деплоя в караф.
(Не всегда полная установка проходит с первой попытки и тогда помогает повторный запуск `source install.karaf`)
Также есть вариант с nexus
После старта получаем пароль для admin через команду:
`docker-compose exec nexus cat /nexus-data/admin.password`.
Через админку нужно разрешить анонимный деплой или настроить доступы.
Урл для install.karaf
`http://nexus:8081/repository/maven-snapshots/@id=local-nexus@snapshots@noreleases`
Остановить все контейнеры
`docker-compose down`
Остановить и удалить хранилища с БД и репой
`docker-compose down -v`

View File

@ -1,78 +0,0 @@
version: '3'
services:
broker:
container_name: broker
image: vromero/activemq-artemis
restart: unless-stopped
environment:
- ARTEMIS_USERNAME=entaxy
- ARTEMIS_PASSWORD=entaxy
ports:
- 8161:8161
- 61616:61616
db-postgres:
container_name: db-postgres
# image: postgres
build: ./postgres
restart: unless-stopped
volumes:
- db-vol:/var/lib/postgresql/data
# - /etc/localtime:/etc/localtime:ro
environment:
- POSTGRES_USER=entaxy
- POSTGRES_PASSWORD=entaxy
- POSTGRES_DB=cache
ports:
- 5432:5432
# db-mssql:
# container_name: db-mssql
# image: mcr.microsoft.com/mssql/server:2017-CU8-ubuntu
# restart: unless-stopped
# environment:
# - SA_PASSWORD=123mssql
# - ACCEPT_EULA=Y
# - POSTGRES_DB=cache
# ports:
# - 1433:1433
# nexus:
# container_name: nexus
# image: sonatype/nexus3
# restart: unless-stopped
# volumes:
# - nexus-data:/nexus-data
# environment:
# - INSTALL4J_ADD_VM_PARAMS=-Xms2g -Xmx2g -XX:MaxDirectMemorySize=3g
# ports:
# - 8081:8081
maven-repo:
container_name: maven-repo
build: ./reposilite
# image: dzikoysk/reposilite
restart: unless-stopped
volumes:
- nexus-data:/app/data
ports:
- 8081:80
karaf:
# image: apache/karaf:4.2.9
build:
context: karaf/
container_name: karaf
# environment:
# - ESB_ENTAXY_VERSION=1.8.0
# - ESB_ENTAXY_MAVEN_REPO=http://nexus:8081/repository/maven-snapshots/@id=local-nexus@snapshots@noreleases
restart: unless-stopped
ports:
- 8101:8101
- 8181:8181
- 8080:8080
volumes:
db-vol:
driver: local
nexus-data:
driver: local

View File

@ -1,13 +0,0 @@
FROM apache/karaf:4.2.9
COPY repo /opt/apache-karaf/repo
COPY init /opt/apache-karaf/etc/init
COPY jre.properties /opt/apache-karaf/etc/
COPY org.apache.karaf.cellar.groups.cfg /opt/apache-karaf/etc/
COPY org.ops4j.datasource-entaxy.esb.cache.cfg /opt/apache-karaf/etc/
COPY org.ops4j.datasource-entaxy.esb.db_connector.cfg /opt/apache-karaf/etc/
COPY org.ops4j.datasource-entaxy.esb.storage.cfg /opt/apache-karaf/etc/
COPY ru.entaxy.esb.cfg /opt/apache-karaf/etc/
COPY ru.entaxy.esb.system.bridge.cfg /opt/apache-karaf/etc/
COPY install.karaf /opt/apache-karaf/

View File

@ -1,54 +0,0 @@
{
"connections": [
{
"nodeType": "connection",
"uuid": "connection-uuid-1",
"name": "entaxy-file",
"adapterName": "fileAdapter",
"platform": true,
"pathParameter": "data/shared",
"properties": {},
"options": {
"noop": true,
"fileName": "default.txt",
"allowNullBody": "true"
}
},
{
"nodeType": "connection",
"uuid": "connection-uuid-2",
"name": "entaxy-broker",
"adapterName": "artemisAdapter",
"platform": true,
"pathParameter": "queue:entaxy.default",
"properties": {
"url": "(tcp://broker:61616)",
"username": "entaxy",
"password": "entaxy",
"maxConnections": "20",
"maxSessionsPerConnection": "100"
},
"options": {}
},
{
"nodeType": "connection",
"uuid": "connection-uuid-3",
"name": "entaxy-db-storage",
"adapterName": "postgresqlAdapter",
"platform": true,
"pathParameter": "entaxy.esb.storage",
"properties": {},
"options": {}
},
{
"nodeType": "connection",
"uuid": "connection-uuid-4",
"name": "entaxy-db-cache",
"adapterName": "postgresqlAdapter",
"platform": true,
"pathParameter": "entaxy.esb.cache",
"properties": {},
"options": {}
}
]
}

View File

@ -1,21 +0,0 @@
ESB_ENTAXY_VERSION=1.8.0
echo "Maven repo=$ESB_ENTAXY_MAVEN_REPO, Version=$ESB_ENTAXY_VERSION"
# docker.file.repo
config:property-set -p org.ops4j.pax.url.mvn org.ops4j.pax.url.mvn.repositories file:/opt/apache-karaf/repo@id=local-repo@snapshots@noreleases,https://repo1.maven.org/maven2@id=central,https://repository.apache.org/content/groups/snapshots-group@id=apache@snapshots@noreleases,https://oss.sonatype.org/content/repositories/ops4j-snapshots@id=ops4j.sonatype.snapshots.deploy@snapshots@noreleases
# docker.reposilite
#config:property-set -p org.ops4j.pax.url.mvn org.ops4j.pax.url.mvn.repositories http://maven-repo/releases@id=local-releases@update=always,http://maven-repo/snapshots@id=local-snapshots@snapshots@noreleases@update=always,https://repo1.maven.org/maven2@id=central,https://repository.apache.org/content/groups/snapshots-group@id=apache@snapshots@noreleases,https://oss.sonatype.org/content/repositories/ops4j-snapshots@id=ops4j.sonatype.snapshots.deploy@snapshots@noreleases
feature:repo-add mvn:ru.entaxy.esb/karaf-features/$ESB_ENTAXY_VERSION/xml/features
echo "feature:install entaxy-all"
feature:install entaxy-all
feature:repo-add mvn:ru.entaxy.esb.platform.runtime/base/$ESB_ENTAXY_VERSION/xml/features
echo "feature:install base"
feature:install base
feature:repo-add mvn:ru.entaxy.esb.platform.runtime/core/$ESB_ENTAXY_VERSION/xml/features
echo "feature:install core"
feature:install core
feature:repo-add mvn:ru.entaxy.esb.platform.runtime.modules/uniform-service/$ESB_ENTAXY_VERSION/xml/features
echo "feature:install entaxy-uniform-service"
feature:install entaxy-uniform-service

View File

@ -1,725 +0,0 @@
################################################################################
#
# 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

@ -1,68 +0,0 @@
#
# 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 = disabled
default.config.sync = disabled
default.feature.sync = disabled
default.obr.urls.sync = disabled
default.balanced.servlet.sync = disabled
default.event.blacklist.inbound = none
default.event.blacklist.outbound = none
default.event.whitelist.inbound = subscription
default.event.whitelist.outbound = subscription

View File

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

View File

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

View File

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

View File

@ -1,20 +0,0 @@
# адреса кластера брокеров сообщений, задаются:
# если 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://broker: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

View File

@ -1,58 +0,0 @@
# имя локальной шины(<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=broker:61616
# логин для подключения к брокеру(jms.username.<node_name>)
jms.username.test1=entaxy
# пароль для подключения к брокеру(jms.password.<node_name>)
jms.password.test1=entaxy
# протокол для передачи сообщений внутри шины(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=broker:61616
# логин для подключения к брокеру(jms.username.<node_name>)
jms.username.test2=entaxy
# пароль для подключения к брокеру(jms.password.<node_name>)
jms.password.test2=entaxy
# 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

View File

@ -1,3 +0,0 @@
FROM postgres
COPY create-db.sql /docker-entrypoint-initdb.d/

View File

@ -1,4 +0,0 @@
CREATE DATABASE esb_entaxy;
GRANT ALL PRIVILEGES ON DATABASE esb_entaxy TO entaxy;
CREATE DATABASE db_connector_test;
GRANT ALL PRIVILEGES ON DATABASE db_connector_test TO entaxy;

View File

@ -1,3 +0,0 @@
FROM dzikoysk/reposilite:2.9.23
COPY tokens.dat /app/data

View File

@ -1,6 +0,0 @@
!!org.panda_lang.reposilite.auth.TokenCollection
"tokens":
- "alias": "admin"
"path": "/"
"permissions": "m"
"token": "$2a$10$Xrurah6y4IOijq9EtFlAIe2wlhlUScggEBS88DriZDM9MCrAGwqdS"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

View File

@ -1,203 +0,0 @@
= План создания коннектора
Для создания полноценного коннектора необходимо создать 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.DirectVMInConnectorImpl">
<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.DirectVMInConnectorImpl">
<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.DirectVMOutConnectorImpl">
<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.DirectVMOutConnectorImpl">
<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.

Before

Width:  |  Height:  |  Size: 169 KiB

View File

@ -1,86 +0,0 @@
= Используемые служебные заголовки 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.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

View File

@ -1,76 +0,0 @@
= Активный режим коннектора
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

@ -1,35 +0,0 @@
= 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

@ -1,35 +0,0 @@
== Работа с artemis, проверка сообщений
Консоль управления artemis расположена на _http://localhost:8161/console/login_
* Необходимо аутентифицироваться в artemis(где логин и пароль по умолчанию entaxy/entaxy)
image::img/image_2021-09-13_21-39-23.png[]
* После успешного прохождения аутентификации, консоль artemis будет выглядеть так:
image::img/image_2021-09-13_21-40-11.png[]
* В левой части интерфейса находятся созданные очереди artemis, где необходимо выбрать очередь, как и показано на скрине:
image::img/image_2021-09-13_21-40-38.png[]
* В верхней части artemis необходимо выбрать раздел _Browse_, который отображает находящиеся в очереди сообщения:
image::img/image_2021-09-13_21-41-56.png[]
* Выбрав сообщение, отобразится информация о сообщении:
а) тело сообщения
image::img/image_2021-09-13_21-42-24.png[]
б) заголовки сообщения
image::img/image_2021-09-13_21-42-53.png[]
* После того как сообщение было прочитано из entaxy, и если оно было там одно, то очередь автоматически удалится из artemis. Иначе сообщение будет забрано из очереди.
image::img/image_2021-09-13_21-43-15.png[]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View File

@ -1,89 +0,0 @@
= Инструкция для работы с шиной через универсальный коннектор
=== Преднастройка окружения
. Скачать и установить postman(https://www.postman.com/downloads/).
. Импортировать коллекцию запросов и окружение в postman
Далее показано как импортироваться коллекцию запросов и окружение в postman Version 8.11.1, если стоит другая версия и возникли сложности с инструкцией, то обратитесь к документации postman(https://learning.postman.com/docs/getting-started/importing-and-exporting-data/).
=== Импорт коллекции запросов и окружения в postman
* Если вы на домашней странице postman, то нажмите _Import file_, как показано ниже на скрине.
image::img/photo5298499320133302025.jpg[]
* Если вы не на домашней странице postman, то нажмите _File_, _Import..._, как показано ниже на скрине.
image::img/photo5298499320133302031.jpg[]
* Далее откроется окно с импортом файла, где нужно нажать на _Upload Files_ и импортировать файлы, по одному или сразу оба(xref:postman/uniform-connector.postman_environment.json[Окружение], xref:postman/uniform-connector.postman_collection.json[Коллекция запросов])
image::img/photo5298499320133302028.jpg[]
* Или можно импортировать сразу всю папку с файлами(xref:postman/uniform-connector.postman_environment.json[Окружение], xref:postman/uniform-connector.postman_collection.json[Коллекция запросов])
image::img/photo5298499320133302034.jpg[]
image::img/photo5298499320133302035.jpg[]
* Далее мы увидим импортированную коллекцию запросов слева и необходимо выбрать импортированное ранее окружение
image::img/photo5298499320133302038.jpg[]
image::img/photo5298499320133302039.jpg[]
* Есть возможность настраивать параметры запросов, документация на данную тему(https://learning.postman.com/docs/sending-requests/managing-environments/)
image::img/photo5298499320133302041.jpg[]
* Коллекция запросов и окружение были успешно импортированы в postman и готовы к использованию, можно запустить все запросы в автоматическом режиме или запускать их в ручную по очереди
=== Запуск всех запросов в автоматическом режиме
* Необходимо нажать на _Run Collection_ в меню коллекции, как показано ниже
image::img/photo5298499320133302042.jpg[]
image::img/photo5298499320133302043.jpg[]
* Можно увидеть успешное прохождение коллекции. При успешном прохождении коллекции тестов шина будет очищена. Если не подразумевалось данное поведение, то необходимо снять выделение с запросов(_Remove profile system1_, _Remove profile system2_, _Remove Account system1_, _Remove Account system2_)
image::img/photo5298499320133302044.jpg[]
image::img/photo5298499320133302046.jpg[]
=== Запуск запросов в ручную по очереди
* Для запуска конкретного запроса нужно нажать на него в меню слева, затем откроется меню редактирования запроса, где можно посмотреть все параметры запроса и настроить его как необходимо и нажимая на кнопку _Send_ запрос отправляется на шину
image::img/photo5298499320133302047.jpg[]
=== Описание окружения
... _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)
=== Содержимое тестов
. Коллекция запросов содержит следующие шаги:
.. _Create profile system1_ - создание профиля системы 1, которая будет отправлять сообщения в шину
.. _Create profile system2_ - создание профиля системы 2
.. _Add Account system1_ - создание учетной записи для системы 1
.. _Add Account system2_ - создание учетной записи для системы 2
.. _Create uniform-service-in-connector_ - создание входящего коннектора к универсальному сервису для системы 1
.. _Create uniform-service-out-connector_ - создание исходящего коннектора к универсальному сервису для системы 1
.. _Create uniform-service-in-connector_ - создание входящего коннектора к универсальному сервису для системы 2
.. _Get profile system1_ - запросы для проверки на корректное создания профиля системы1 и коннекторов к нему(uniform-service-in-connector)
.. _Get profile system2_ - запросы для проверки на корректное создания профиля системы1 и коннекторов к нему(uniform-service-in-connector, uniform-service-out-connector)
.. _Create permission_ - создание разрешения для отправки сообщений из системы 1 в систему 2
.. _SEND_ - отправка тестового сообщения из системы 1 в систему 2 (если необходимо, то можно посмотреть как сообщение появилось в xref:artemis.adoc[artemis])
.. _GET_ - получение тестового сообщения из системы 1 системой 2(если необходимо, то можно посмотреть как сообщение было получено из xref:artemis.adoc[artemis])
.. _ACK_ - отправка подтверждения получения сообщения системы 2(иначе сообщение будет восстановлено)
.. _Remove profile system1_ - удаление из шины профиля системы 1 и всех связанных с ней коннекторов
.. _Remove profile system2_ - удаление из шины профиля системы 2 и всех связанных с ней коннекторов
.. _Remove Account system1_ - удаление учетной записи системы 1 из шины
.. _Remove Account system2_ - удаление учетной записи системы 2 из шины

View File

@ -1,54 +0,0 @@
{
"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

@ -1,38 +0,0 @@
= Универсальный сервис(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

@ -1,219 +0,0 @@
= Общее описание 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.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

View File

@ -1,169 +0,0 @@
= Общие положения
При передаче сообщения от внешней системы в шину происходит процесс аутентификации внешней системы в шине. Т.е. при передаче сообщения шине с помощью сервера _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

@ -1,79 +0,0 @@
Связь между двумя независимыми брокерами осуществляется с помощью моста. Карафы подключенные к одному брокеру далее будут именоваться шиной.
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.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

View File

@ -1,44 +0,0 @@
= Файловые репозитории
*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

@ -1,144 +0,0 @@
Централизованный обработчик ошибок для формирования кодов ошибок, их синхронного возврата клиенту и для асинхронного дублирования более подробного описания ошибки для клиента и для Центральной Базы Интеграции.
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

@ -1,31 +0,0 @@
= Использование обработчика ошибок
Для централизованной обработки ошибок будем использовать “процессор” зарегистрированный через _<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.

Before

Width:  |  Height:  |  Size: 82 KiB

View File

@ -1,318 +0,0 @@
= 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.

Before

Width:  |  Height:  |  Size: 184 KiB

View File

@ -1,462 +0,0 @@
= Sсhema
Есть три типа ресурсов, которые можно загружать в шину и использовать в маршрутах:
. Валидационные типы ресурсов (нпрм 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.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

View File

@ -1,555 +0,0 @@
= 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
quartz.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_ в свойстве quartz.job.clean.cron=0+0+0+*+*+?+*
с помощью cron выражения. Особенность cron выражения для quartz в том что “++” используется, как разделитель.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

View File

@ -1,171 +0,0 @@
= Хранилище данных EAV
== Описание модуля EXTRAS :: ENTAXY :: EAV (Entity, Attribute, Value)
Хранилище данных EAV реализует модель _Сущность-Атрибут-Значение_ - это модель данных, предназначенная для описания сущностей, в которых количество атрибутов (свойств, параметров) не ограничено или не известно заранее.
== Объекты модуля ЕАV
image::eav_objects.png[]
*Внешняя сущность*(External Entity) - любая внешняя сущность относительно модуля EAV.
*Сущность EAV*(Entity EAV) - именованная сущность, связывающая аттрибуты с внешней сущностью.
Модуль предоставляет возможность объединять сущности EAV в одноуровневую иерархию.
*Атрибут*(Attribute) - именованный атрибут сущности EAV, содержит значение и его тип.
*Типы значений:*
* DOUBLE
* LONG
* TEXT
* JSON
== Использование хранилища EAV
В BLUEPRINT подключаем OSGI-сервис EAVProcessor
[source]
----
<reference id="eavProcessor" interface="ru.entaxy.eav.service.EAVProcessor"/>
----
в маршрутах или java коде осуществляем необходимые вызовы для создания/получения/изменения значений.
*Примеры вызовов из маршрута Apache Camel XMLDSL*
Создание атрибута для внешней сущности
[source]
----
<bean ref="eavProcessor" method="createPrimitive('externalIdTest', 'externalTypeTest', 'entityNameTest', 'attributeNameTest', 'textValue', 'testLogin')"/>
----
Получить все значения сохранённой сущности
[source]
----
<bean ref="eavProcessor" method="getEntityWithValues('externalIdTest', 'externalTypeTest', 'entityNameTest')"/>
----
Удалить сохранённые значения
[source]
----
<bean ref="eavProcessor" method="deleteExternalEntity('externalIdTest', 'externalTypeTest')"/>
----
== OSGI-сервис EAVProcessor.
Сервис, выставляющий api для работы с EAV хранилищем.
*Методы:*
* _createPrimitive_ - простой метод сохранения примитивного значения(числового, строкового)
* _createComplex_ - простой метод сохранения комплексного значения(JSON)
* _getEntityWithValues_ - получение значений сущности EAV по имени
* _fetchEntityWithValues_ - получение значений сущности EAV по имени либо null, без исключений
* _getEntityNamedAttributes_ - получение значений с определённым именем для сущности EAV
* _getEntityByNameAndAttributeValue_ - получение сущности EAV по атрибуту
* _getParentEntity_ - получение родительской сущности EAV для внешней связанной сущности
* _getChildEntities_ - получение дочерних сущностей EAV для внешней связанной сущности с именем сущности EAV по умолчанию(PARENT)
* _getChildEntitiesByName_ - получение дочерних сущностей EAV для внешней связанной сущности с указанным именем сущности EAV
* _getByExternalEntity_ - получение всех сущностей EAV для внешней связанной сущности
* _getByAttributeSet_ - получение сущностей EAV по множественным наборов параметров, каждый набор составляется из значений элементов с одним порядковым номером всех списков
* _updateAttribute_ - метод для изменения значения аттрибута
* _deleteExternalEntity_ - удаление всех записей связанных с внешней сущностью
* _deleteEntity_ - удаление именованной сущности EAV
* _deleteAllEntityAttributes_ - удаление атрибутов именованной сущности EAV
* _deleteAllEntityAttributesByName_ - удаление аттрибута сущности EAV с определённым наименованием
* _combineEntities_ - метод для объединения внешних сущностей под 1 родителем
== Схема базы данных(БД).
Схема БД при таком подходе остаётся неизменной независимо от состава и структуры хранимых данных.
Бандл eav-storage разворачивает структуру из 2 таблиц:
*Таблица eav_entity*
|===
|Слолбец |Параметры |Описание
//----------------------
|id
|bigint, not null
|идентификатор сущности модуля EAV
|external_id
|text, not null
|внешний идентификатор связываемой сущности
|external_type
|text, not null
|тип связываемой сущности
|name
|text
|наименование сущности модуля EAV
|parent_id
|bigint, not null, default 0
|идентификатор(поле id) родительской сущности модуля EAV
|create_date
|timestamp, not null
|служебное поле, дата создания
|edit_date
|timestamp
|служебное поле, дата изменения
|created_by
|text, not null
|служебное поле, логин автора записи
|external_type
|text
|служебное поле, логин последнего изменившего сущность
|===
*Таблица eav_attribute*
|===
|Слолбец |Параметры |Описание
//----------------------
|id
|bigint, not null
|идентификатор атрибута
|entity_id
|text, not null
|идентификатор сущности eav_entity
|name
|text, not null
|наименование аттрибута
|type
|text
|тип аттрибута
|double
|double
|служебное поле для хранения значения
|long
|bigint
|служебное поле для хранения значения
|text
|text
|служебное поле для хранения значения
|text2
|text
|служебное поле для хранения значения
|===

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,177 +0,0 @@
= Entaxy
:imagesdir: .
:hardbreaks:
Entaxy - шина, которую можно конфигурировать извне с помощью графического интерфейса или API, состоящая из модулей:
image::Entaxy.png[]
== *Управленческий слой(core):*
=== basic-auth
модуль, отвечающий за аутентификацию в шине. Tак же занимается хранением, созданием, редактированием и удалением учетных записей.
xref:core/auth/Authorization.adoc[Более полную информации о basic-auth найдете по этой ссылке]
_Для разработчиков:
-имеет Api, который занимается Crud операциями,
-хранит учетные записи в базе данных,
-предоставляет файл с актуальной информацией для nginx,
-выставляет interceptor для аутентификации в других сервисах,
-выставляет interceptor для определения принадлежности аккаунта определённой системе._
=== permission
модуль, отвечающий за управление правами доступа.
xref:core/permission/SOAP-service-Permission-management.adoc[Более полную информации о permission найдете по этой ссылке]
_Для разработчиков:
-имеет Api, который занимается Crud операциями
- хранит права в базе данных,
-(camel)компонент, который используется в маршрутах, для проверки возможности отправки из системы a в систему b.
-выставляет interceptor для авторизации в служебных сервисах._
=== 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.

Before

Width:  |  Height:  |  Size: 168 KiB

View File

@ -1,633 +0,0 @@
= Руководство по установке 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
----
+
. Отредактировать переменную окружения `EXTRA_JAVA_OPTS` для Karaf, чтобы устранить возможность эксплуатацию критической уязвимости Log4j CVE-2021-44228:
+
[source,bash]
----
sudo sed -i 's/# export EXTRA_JAVA_OPTS/export EXTRA_JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true/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.8.1/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

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Some files were not shown because too many files have changed in this diff Show More