Статьи

Сочетание мула с двигателем BPEL


В моем текущем проекте нам понадобится
BPEL- движок помимо нашей
реализации
Mule CE . На самом деле, мы будем использовать Mule для связи между системами без сохранения состояния и использовать BPEL для процессов с сохранением состояния. Одна из возможных платформ для использования в качестве BPEL-движка —
Apache ODE . В этой статье я покажу вам, как вы можете запустить процесс BPEL в Apache ODE с помощью Mule. Как вы увидите, это всего лишь комбинация постов, которые я сделал ранее, но я думаю, что было бы хорошо, чтобы все было в одном посте.

Шаг 0: Предположения s
Предполагается:

  • экземпляр Apache ODE (предпочтительно развернутый в Tomcat)
  • Maven 2.2.0
  • JDK 1.6
  • NetBeans 6,8,
  • Мул CE 2.2.2-SNAPSHOT

Конечно, это может работать с другой версией, но это те версии, которые я использовал.

Шаг 1. Создайте работающий процесс BPEL

Первый шаг — создать работающий пример BPEL. Я использую последнюю версию Netbeans для этого и этого поста . Чтобы использовать мастера SOA в новых Netbeans, вы должны включить это как расширение. Для создания примера BPEL выполните следующие шаги:

  1. Создание нового модуля BPEL с именем «TextModule»
  2. Добавить WSDL в проект
  3. Добавьте WSDL, описывающий веб-сервис (примечание: я не смог создать документально-документальный веб-сервис с мастером в Netbeans, поэтому впоследствии отредактировал источник вручную).

  4. Добавьте процесс BPEL в модуль, назовите его «txtLengthProcess»

    Этот созданный процесс пуст, поэтому добавьте к нему функциональность, следуя инструкциям, приведенным в этом посте . В итоге я получил следующую диаграмму процесса: Отображение на шаге присваивания выглядит следующим образом: я создал необходимые переменные для назначения значений на шаге «получение» и «ответ».



  5. Создайте файл «deploy.xml».
    Мой файл имеет следующее содержимое:
    <?xml version="1.0" encoding="UTF-8"?>
    <deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03"
        xmlns:pns="http://www.pascalalma.net/TxtLengthProcess"
        xmlns:wns="http://www.pascalalma.net/TxtLengthService">
    
        <process name="pns:TxtLengthProcess">
            <active>true</active>
            <provide partnerLink="TxtLengthPartnerLink">
                <service name="wns:TxtLengthServiceService" port="TxtLengthServicePort"/>
            </provide>
        </process>
    </deploy>

  6. Разверните его на экземпляр Tomcat, на котором выполняется Apache ODE.
    Для развертывания процесса создайте каталог с именем «TxtLengthService» в папке «/ webapps / ode / WEB-INF / process». Скопируйте три файла (deploy.xml, TxtLengthProcess.bpel и TxtLengthService.wsdl) в этот каталог. После успешного развертывания вы увидите файл TxtLengthService.wsdl по адресу http: // localhost: 8080 / ode / services / listServices :
  7. (Необязательно) вы можете протестировать сервис с SoapUI.
    При успешном запросе-ответе вы получите следующий результат:
    package net.pascalalma.ws.test;
    
    import net.pascalalma.txtlengthservice.TxtLengthService;
    import org.junit.Test;
    
    /**
     *
     * @author pascal
     */
    public class TestService {
    
        @Test
         public void testIt()
        {
            TxtLengthService service = new TxtLengthService();
    
            String value = service.getTxtLengthServiceSOAP11PortHttp().txtLengthOperation("Pascal Alma");
    
            System.out.println("result = " + value);
        }
    }
    


    Шаг 3: Создайте проект Mule

    Чтобы позволить Mule вызвать процесс BPEL, я создал новый проект Maven, который может проверить вызов с помощью клиента Mule. Используемый «ode-test-config.xml» выглядит так:

    <?xml version="1.0" encoding="UTF-8"?>
    <mule xmlns="http://www.mulesource.org/schema/mule/core/2.2"
           xmlns:spring="http://www.springframework.org/schema/beans"
           xmlns:test="http://www.mulesource.org/schema/mule/test/2.2"
           xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.2"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/mule.xsd
           http://www.mulesource.org/schema/mule/test/2.2 http://www.mulesource.org/schema/mule/test/2.2/mule-test.xsd
           http://www.mulesource.org/schema/mule/vm/2.2 http://www.mulesource.org/schema/mule/vm/2.2/mule-vm.xsd
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    
        <model name="mule-ode">
            <service name="start">
                <inbound>
                    <vm:inbound-endpoint path="msg-in" synchronous="true"/>
                </inbound>
                <component class="net.pascalalma.mule.BpelProcessClient" />
            </service>
        </model>
    </mule>

    Созданный класс компонента, который обрабатывает вызов клиента SOAP, выглядит следующим образом:

    package net.pascalalma.mule;
    
    import net.pascalalma.txtlengthservice.TxtLengthService;
    
    /**
     *
     * @author pascal
     */
    public class BpelProcessClient {
    
        public String callProcess(String request) {
            return new TxtLengthService().getTxtLengthServiceSOAP11PortHttp().txtLengthOperation(request);
        }
    }
    

    И используемый тестовый класс выглядит так:

    package net.pascalalma.mule;
    
    import org.junit.Test;
    import org.mule.api.MuleException;
    import org.mule.api.MuleMessage;
    import org.mule.module.client.MuleClient;
    import org.mule.tck.FunctionalTestCase;
    
    public class BpelProcessClientTest extends FunctionalTestCase {
    
        private MuleClient client = null;
    
        protected MuleClient getClient() {
            try {
                if (client == null) {
                    client = new MuleClient();
                }
            } catch (MuleException e) {
                throw new RuntimeException(e);
            }
            return client;
        }
    
       protected final String getConfigResources() {
            return "config/ode-test-config.xml ";
        }
    
        @Test
        public void testBpelTest() throws MuleException
        {
            MuleMessage msg = getClient().send("vm://msg-in", "123456789012345", null);
            System.out.println("payload = " + msg.getPayload());
        }
    }
    

    Когда тестовый класс выполняется, это приводит к следующему выводу:

    ************************************************** ********************
    * Mule ESB и интеграционная платформа *
    * Версия: 2.2.2-SNAPSHOT Сборка: 15252 *
    * MuleSource, Inc. *
    * Для получения дополнительной информации перейдите на на http://mule.mulesource.org *
    * *
    * Сервер запущен: 17.12.09 20:34 *
    * Идентификатор сервера: 3d3eb71b-eb43-11de-bca6-7b92b51f04e0 *
    * JDK: 1.6.0_17 (смешанный режим ) *
    * Кодировка ОС: MacRoman, кодировка Mule: UTF-8 *
    * ОС: Mac OS X (10.6.2, x86_64) *
    * Хост: macbook-van-pascal-alma.local (192.168.1.204) *
    * *
    * Агенты, работающие: Нет *
    ********************************************* *************************
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 50,730 [main] org.mule.module.client.MuleClient: Использование существующего MuleContext: org.mule.DefaultMuleContext@1d6b6c55
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 50,756 [main] org .mule.transport.vm.VMMessageDispatcher: Connected: endpoint.outbound.vm: //
    полезная информация msg-in = 15
    INFO 2009-12-17 20: 34: 51,784 [main] org.mule.transport.vm.VMConnector: удаление прослушиватель конечной точкиUri: vm: // msg-in
    INFO 2009-12-17 20: 34: 51,784 [main] org.mule.transport.vm.VMMessageReceiver: Disconnected: VMMessageReceiver {this = 5a56182f, receiveKey = msg-in, конечная точка = vm: // msg-in}
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 51,785 [main] org.mule.component.DefaultJavaComponent: Остановка: org.mule.component.DefaultJavaComponent для компонента: SedaService {запуск}
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 51,785 [main] org.mule.model.seda.SedaService: Запуск службы Mule успешно остановлен
    INFO 2009-12-17 20: 34: 51,787 [main] org.mule.transport .vm.VMConnector: Остановка: VMConnector {this = 75d709a5, запущено = true, инициализировано = true, name = ‘connector.VM.0 ′, disposed = false, numberOfConcurrentTransactedReceivers = 4, createMultipleTransactedReceivers = true, подключено = true, connectedProtocols = [ vm], serviceOverrides = null}
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 51,787 [main] org.mule.transport.vm.VMConnector: отключено: VMConnector {this = 75d709a5, запущено = false, инициализировано = true, name = ‘ соединитель.VM.0 ′, disposed = false, numberOfConcurrentTransactedReceivers = 4, createMultipleTransactedReceivers = true, подключено = false, supportProtocols = [vm], serviceOverrides = null}
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 51,787 [main] org.mule.transport.vm.VMConnector: остановлен: VMConnector {this = 75d709a5, запущен = false, инициализирован = true, имя = ‘connector.VM.0 ′, disposed = false, numberOfConcurrentTransactedReceivers = 4, createMultipleTransactedReceivers = true, подключено = false, supportProtocols = [vm], serviceOverrides = null}
    INFO 2009-12-17 20: 34: 51,788 [main] org.mule.util.queue.TransactionalQueueManager: Остановка ResourceManager
    INFO 2009-12-17 20: 34: 51,788 [main] org.mule.util.queue.TransactionalQueueManager: Остановленный ResourceManager
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 51,788 [main] org.mule.transport.vm.VMConnector: удаление: VMConnector {this = 75d709a5, запущено = false, инициализировано = true, имя = ‘соединитель.VM.0 ′, disposed = false, numberOfConcurrentTransactedReceivers = 4, createMultipleTransactedReceivers = true, подключено = false, supportProtocols = [vm], serviceOverrides = null}
    INFO 2009-12-17 20: 34: 51,788 [main] org.mule.transport.vm.VMMessageDispatcher Отключено: VMMessageDispatcher {this = 1915470e, конечная точка = vm: // msg-in, disposed = false}
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 51,788 [main] org.mule.transport.vm.VMConnector: удален: VMConnector { this = 75d709a5, началось = false, инициализировано = false, name = ‘connector.VM.0 ′, disposed = true, numberOfConcurrentTransactedReceivers = 4, createMultipleTransactedReceivers = true, подключено = false, supportProtocols = [vm], serviceOverrides = null}
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 51,789 [main] org.mule.config.spring.MuleApplicationContext: закрытие org.mule.config.spring.MuleApplicationContext@356f144c: отображаемое имя [org.mule.config.spring.MuleApplicationContext @ 356f144c]; дата запуска [четверг, 17 декабря 20:34:49 CET 2009]; корень контекстной иерархии
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 51,789 [main] org.springframework.beans.factory.support.DefaultListableBeanFactory: уничтожение синглетонов в org.springframework.beans.factory.support.DefaultListableBeanFactory@29abc69: определение пользовательского объекта _mulePropertyPlaceholderProcessor, _muleSimpleRegistryBootstrap, _muleNotificationManager, _muleConfiguration, ._ muleNotificationManager :tification.1, ._ muleNotificationManager: messages.2,. ._muleNotificationManager: Notification.7._muleProperties, _muleEndpointFactory, _muleStreamCloserService, _defaultThreadingProfile, _defaultMessageDispatcherThreadingProfile, _defaultMessageRequesterThreadingProfile, _defaultMessageReceiverThreadingProfile, _defaultServiceThreadingProfile, _defaultRetryPolicyTemplate, мул-ода, старт, .start: inbound.11, .start: inbound.11: въездной-endpoint.12, .start: component.13 ]; корень фабричной иерархии
    ИНФОРМАЦИЯ 2009-12-17 20: 34: 51,995 [main] org.mule.DefaultMuleContext:
    ****************************** ****************************************
    * Мул выключается нормально: 12/17 / 09 20:34 *
    * Сервер работал: 0 дней, 0 часов, 0 минут, 1,318 секунд *
    ************************* ********************************************* Выполнены
    тесты: 1, Сбои: 0, Ошибки: 0, Пропущено: 0, Время истекло: 3.103 сек.

    Таким образом, завершив этот пост, вы сможете выполнить (простой) BPEL-процесс в Apache ODE с помощью Mule. Однако нет уверенности, что мы будем использовать Apache ODE, как это. Я думаю, что нам бы больше хотелось Intalio | server из-за удобных функций / инструментов, которые они добавили в Apache ODE.