Статьи

От BPEL к ESB и обратно — Введение в интеграцию Riftsaw-JBoss ESB

Одна из сильных сторон программного обеспечения JBoss заключается в интеграции между проектами. В этой статье мы рассмотрим интеграцию Riftsaw — JBoss ESB для подключения процессов Riftsaw BPEL к сервисам ESB.

Справочная информация —

Сервис-ориентированная архитектура (SOA) JBosssESB — это не отдельная программа или технология. Это действительно вопрос архитектуры программного обеспечения или дизайна. С аппаратной точки зрения «шина» — это физический соединитель, который связывает несколько систем или подсистем. Вместо того чтобы иметь большое количество двухточечных соединителей между парами систем, вы подключаете каждую систему к шине один раз. Enterprise Service Bus (ESB) делает то же самое, логически, в программном обеспечении.

Вместо передачи электрического тока или данных по шине в и из соединений (или «конечных точек») на ESB, ESB логически располагается на архитектурном уровне над системой обмена сообщениями. Система обмена сообщениями обеспечивает асинхронную связь между службами через ESB. Фактически, когда вы работаете с ESB, все это либо служба (которая в данном контексте является вашим прикладным программным обеспечением), либо сообщение, отправляемое между службами. Важно отметить, что «сервис» не является автоматически веб-сервисом. Другие типы приложений, использующие транспорты, такие как FTP или JMS, также могут быть сервисами. ESB — это то же самое, что SOA (сервис-ориентированная архитектура)? Не совсем. ESB не предоставляет сервис-ориентированную архитектуру,но он предоставляет инструменты, которые могут быть использованы для создания односвязных и особенно асинхронных сообщений. SOA — это набор принципов, шаблонов и лучших практик.

JBossESB [1] — это реализация ESB с открытым исходным кодом, которая поддерживает несколько транспортов, протоколов, модель действия слушателя для слабой связи служб, маршрутизацию на основе контента с правилами JBoss (Drools) и управление процессами BPEL с помощью Riftsaw.

Интеграция Riftsaw-JBoss ESB

При рассмотрении интеграции Riftsaw-JBossESB необходимо рассмотреть три темы:

  • Управление сервисами ESB От BPEL в Рифсаве к ESB
  • Выполнение вызовов из ESB для определения процесса BPEL в Riftsaw
  • Обработка исключений

(Для справки: интеграция Riftsaw-JBossESB аналогична интеграции jBPM-JBossESB [2] в том, что она охватывает темы, связанные с этими тремя темами, но есть важные различия. В интеграции Riftsaw-JBossESB связь синхронный (помните, что мы работаем с веб-сервисами) и следует шаблону запрос-ответ. В результате интеграция Riftsaw-JBossESB проще, чем соответствующая интеграция jBPM-JBossESB.)

Мы рассмотрим эти темы по одному за раз. Начнем с: Управление сервисами ESB От BPEL в Рифтсаве до ESB.

Вы можете подумать, что такую ​​мощную функцию, как оркестровка сервисов ESB, будет сложно настроить, но на самом деле это очень просто. Помните, что с точки зрения JBoss ESB процесс BPEL — это веб-сервис. ESB может получать сообщения от BPEL-процесса Riftsaw так же, как и от любого веб-сервиса. Давайте проиллюстрируем это, изменив быстрый запуск BPEL «hello_world» Riftsaw, чтобы организовать службу, как это определено в быстром запуске JBoss ESB «helloworld».

Изменение

быстрых запусков В определении процесса быстрого запуска BPEL «hello_world» мы должны изменить этот файл:

Файл: samples / quickstart / hello_world / bpel / HelloWorld.wsdl

   1    <?xml version="1.0" encoding="utf-8" ?>
2 <!--
3 ~ Licensed to the Apache Software Foundation (ASF) under one
4 ~ or more contributor license agreements. See the NOTICE file
5 ~ distributed with this work for additional information
6 ~ regarding copyright ownership. The ASF licenses this file
7 ~ to you under the Apache License, Version 2.0 (the
8 ~ "License"); you may not use this file except in compliance
9 ~ with the License. You may obtain a copy of the License at
10 ~
11 ~ http://www.apache.org/licenses/LICENSE-2.0
12 ~
13 ~ Unless required by applicable law or agreed to in writing,
14 ~ software distributed under the License is distributed on an
15 ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 ~ KIND, either express or implied. See the License for the
17 ~ specific language governing permissions and limitations
18 ~ under the License.
19 -->
20 <wsdl:definitions
21 targetNamespace="http://www.jboss.org/bpel/examples/wsdl"
22 xmlns="http://schemas.xmlsoap.org/wsdl/"
23 xmlns:tns="http://www.jboss.org/bpel/examples/wsdl"
24 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
25 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
26 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
27 xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype">
28
29 <wsdl:message name="HelloMessage">
30 <wsdl:part name="TestPart" type="xsd:string"/>
31 </wsdl:message>
32
33 <wsdl:portType name="HelloPortType">
34 <wsdl:operation name="hello">
35 <wsdl:input message="tns:HelloMessage" name="TestIn"/>
36 <wsdl:output message="tns:HelloMessage" name="TestOut"/>
37 </wsdl:operation>
38 </wsdl:portType>
39
40 <wsdl:binding name="HelloSoapBinding" type="tns:HelloPortType">
41 <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
42 <wsdl:operation name="hello">
43 <soap:operation soapAction="" style="rpc"/>
44 <wsdl:input>
45 <soap:body
46 namespace="http://www.jboss.org/bpel/examples/wsdl"
47 use="literal"/>
48 </wsdl:input>
49 <wsdl:output>
50 <soap:body
51 namespace="http://www.jboss.org/bpel/examples/wsdl"
52 use="literal"/>
53 </wsdl:output>
54 </wsdl:operation>
55 </wsdl:binding>
56 <wsdl:service name="HelloService">
57 <wsdl:port name="HelloPort" binding="tns:HelloSoapBinding">
58 <soap:address location="http://localhost:8081/bpel/processes/helloWorld"/>
59 </wsdl:port>
60 </wsdl:service>
61
62 <plnk:partnerLinkType name="HelloPartnerLinkType">
63 <plnk:role name="me" portType="tns:HelloPortType"/>
64 <plnk:role name="you" portType="tns:HelloPortType"/>
65 </plnk:partnerLinkType>
66 </wsdl:definitions>

 Изменение в примечании находится в строке 58: так как мы хотим, чтобы приложение ESB определяло прослушиватель для «прослушивания» входящего http-трафика, нам нужно изменить порт для процесса BPEL, чтобы он не конфликтовал с самим сервером JBoss AS. Мы выбрали порт 8081 в качестве нового порта для процесса BPEL. Помните, что для ESB процесс BPEL является веб-службой.

В быстром запуске JBoss ESB «helloworld» мы должны изменить эти 4 файла:

Файл: jbossesb-4.6 / samples / quickstarts / helloworld / jboss-esb.xml

 1    <?xml version = "1.0" encoding = "UTF-8"?>
2 <jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd" parameterReloadSecs="5">
3
4 <providers>
5 <jms-provider name="JBossMQ" connection-factory="ConnectionFactory">
6 <jms-bus busid="quickstartGwChannel">
7 <jms-message-filter
8 dest-type="QUEUE"
9 dest-name="queue/quickstart_helloworld_Request_gw"
10 />
11 </jms-bus>
12 <jms-bus busid="quickstartEsbChannel">
13 <jms-message-filter
14 dest-type="QUEUE"
15 dest-name="queue/quickstart_helloworld_Request_esb"
16 />
17 </jms-bus>
18
19 <jms-bus busid="quickstartEsbReplyChannel">
20 <jms-message-filter
21 dest-type="QUEUE"
22 dest-name="queue/quickstart_helloworld_Request_esb_reply"
23 />
24 </jms-bus>
25
26
27 </jms-provider>
28
29 <jbr-provider name="JBR-Http-1" protocol="http" host="localhost">
30 <jbr-bus busid="Http-1" port="8081"/>
31 </jbr-provider>
32 </providers>
33
34 <services>
35 <service
36 category="FirstServiceESB"
37 name="SimpleListener"
38 description="Hello World">
39
40 <listeners>
41 <jms-listener name="JMS-Gateway"
42 busidref="quickstartGwChannel"
43 is-gateway="true"
44 />
45 <jms-listener name="helloWorld"
46 busidref="quickstartEsbChannel"
47 />
48 <jbr-listener name="Http-Gateway" busidref="Http-1" is-gateway="true"/>
49
50 </listeners>
51
52 <actions mep="RequestResponse">
53 <action name="action1"
54 class="org.jboss.soa.esb.samples.quickstart.helloworld.MyJMSListenerAction"
55 process="displayMessage"
56 />
57 <action name="action2" class="org.jboss.soa.esb.actions.SystemPrintln">
58 <property name="printfull" value="false"/>
59 </action>
60 <!-- The next action is for Continuous Integration testing -->
61 <action name="testStore" class="org.jboss.soa.esb.actions.TestMessageStore"/>
62 </actions>
63 </service>
64 </services>
65
66 </jbossesb>

Изменения:

  • Строки 29-31 и 48: Здесь мы определяем прослушиватель шлюза HTTP, который будет отслеживать сообщение (запрос), отправленное процессом BPEL.
  • Строка 52: Это важное изменение. В первоначальном быстром запуске ESB helloworld шаблон обмена сообщениями (mep) был установлен на «OneWay». В нашем измененном быстром запуске нам нужно отправить ответ обратно в процесс BPEL, чтобы завершить последовательность запрос / ответ.
  • Строки 19-23: О чем все это? Для каждого канала шлюза, не поддерживающего ESB, ESB требует соответствующего канала, поддерживающего ESB. В этом контексте «ESB-осведомленный» относится к каналу, общающемуся через сообщения в формате org.jboss.soa.esb.message.Message, а «ESB-unaware» относится к общению через сообщения в формате, отличном от (org. jboss.soa.esb.message.Message). Мы также должны добавить этот ESB-совместимый канал к этим файлам:

Файл: jbossesb-4.6 / samples / quickstarts / helloworld / deploy.xml

   1    <jbossesb-deployment>
2 <depends>jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_esb_reply</depends>
3 <depends>jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_esb</depends>
4 <depends>jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_gw</depends>
5 </jbossesb-deployment>

Файл: jbossesb-4.6 / samples / quickstarts / helloworld / jbm-queue-service.xml

   1    <?xml version="1.0" encoding="UTF-8"?>
2 <server>
3
4 <mbean code="org.jboss.jms.server.destination.QueueService"
5 name="jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_esb_reply"
6 xmbean-dd="xmdesc/Queue-xmbean.xml">
7 <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
8 <depends>jboss.messaging:service=PostOffice</depends>
9 </mbean>
10
11 <mbean code="org.jboss.jms.server.destination.QueueService"
12 name="jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_esb"
13 xmbean-dd="xmdesc/Queue-xmbean.xml">
14 <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
15 <depends>jboss.messaging:service=PostOffice</depends>
16 </mbean>
17 <mbean code="org.jboss.jms.server.destination.QueueService"
18 name="jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_gw"
19 xmbean-dd="xmdesc/Queue-xmbean.xml">
20 <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
21 <depends>jboss.messaging:service=PostOffice</depends>
22 </mbean>
23 </server>

Наконец, нам нужно изменить build.xml, чтобы он ссылался на измененный номер порта для веб-сервисов — изменилась только одна строка:

    33   <arg value="http://localhost:8081/bpel/processes/helloWorld"/>

После развертывания обоих быстрых запусков мы можем инициировать оркестровку службы ESB, выполнив команду ant sendhello для процесса hello_world Riftsaw BPEL. Журнал сервера показывает этот вывод:

22:38:51,690 INFO  [STDOUT] &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
22:38:51,700 INFO [STDOUT] Body: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://www.jboss.org/bpel/examples/wsdl">
<soapenv:Header/>
<soapenv:Body>
<wsdl:hello>
<TestPart>Hello</TestPart>
<TestPart2>Hello</TestPart2>
</wsdl:hello>
</soapenv:Body>
</soapenv:Envelope>
22:38:51,701 INFO [STDOUT] &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
22:38:51,716 INFO [STDOUT] Message structure:
22:38:51,716 INFO [STDOUT] [<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://www.jboss.org/bpel/examples/wsdl">
<soapenv:Header/>
<soapenv:Body>
<wsdl:hello>
<TestPart>Hello</TestPart>
<TestPart2>Hello</TestPart2>
</wsdl:hello>
</soapenv:Body>
</soapenv:Envelope>

И клиент процесса Riftsaw BPEL hello_world показывает этот вывод:

$ ant sendhello
Buildfile: build.xml

sendhello:
[echo] Send test message to: Quickstart_bpel_hello_world
[java] <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://www.jboss.org/bpel/examples/wsdl">
[java] <soapenv:Header/>
[java] <soapenv:Body>
[java] <wsdl:hello>
[java] <TestPart>Hello</TestPart>
[java] <TestPart2>Hello</TestPart2>
[java] </wsdl:hello>
[java] </soapenv:Body>
[java] </soapenv:Envelope>
[java]
[java]

BUILD SUCCESSFUL
Total time: 2 seconds

 

Заключение Мысли о том, что с точки зрения ESB, процесс Riftsaw BPEL является веб-службой, делает управление процессами ESB простой задачей. В следующем посте к этому блогу мы рассмотрим обратный путь и вызов из JBossESB для определения BPEL-процесса в Riftsaw.

Ссылки

Благодарности

Как всегда, я хочу поблагодарить сообщество Riftsaw (особенно Курта Стэма и Гэри Брауна), как за создание Riftsaw (и его документацию, так и примеры), а также за их своевременную рецензию на этот пост в блоге.