Entaxy

Работа с коннекторами

Для создания полноценного коннектора необходимо создать bundle с такой структурой:

  1. src/main/resource/template/<название endpoint>-in-connector.ftl

  2. src/main/resource/template/<название endpoint>-out-connector.ftl

  3. src/main/resource/OSGI-INF/blueprint/camel-context.xml

  4. pom.xml

Создание шаблона входного коннектора(in-connector)

Входной коннектор - это коннектор, который получает сообщения из вне Entaxy.

Шаблон входного коннектора - ftl файл, на основе которого шина будет создавать индивидуальные входные коннекторы для каждой системы, с помощью подстановки параметров, полученных от пользователя.

Пример созданного шаблона, где название endpoint - example: src/main/resource/template/example-in-connector.ftl

<?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>

Создание и публикация бина: для связи коннектора с профилем, возможности получить весь список коннекторов определенного типа.

<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.

<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):

<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>

И отправлять сообщения с помощью:

<bean ref="inConnectorRegistry" method="send"/>

Создание шаблона выходного коннектора(out-connector)

Выходной коннектор - это коннектор, который отправляет сообщения из Entaxy в систему (вне Entaxy).

Шаблон выходного коннектора - ftl файл, на основе которого шина будет создавать индивидуальные выходные коннекторы для каждой системы, с помощью подстановки параметров, полученных от пользователя.

Пример созданного шаблона, где название endpoint - example: src/main/resource/template/example-out-connector.ftl

<?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>

Создание и публикация бина: для связи коннектора с профилем, возможности получить весь список коннекторов определенного типа.

<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>

Маршрут выходного коннектора должен стартовать с:

<from uri="direct-vm:example-out-connector-[=systemName]"/>

Публикация созданных шаблонов

Необходимо опубликовать osgi сервис с информацией об созданных шаблонах для того, чтобы механизм создания коннекторов увидел их.

src/main/resource/OSGI-INF/blueprint/camel-context.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>