entaxy-public/documentation/connectors/create_new_connectors.adoc

204 lines
10 KiB
Plaintext
Raw Normal View History

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