В предыдущем посте к этому блогу мы рассмотрели организацию сервисов JBossESB из процесса RiftSaw BPEL. В этом посте мы рассмотрим другую сторону интеграции RiftSaw-JBossESB; вызов процесса RiftSaw BPEL из службы ESB.
Вызов процесса RiftSaw BPEL — с точки зрения JBossESB, это веб-сервис.
Есть несколько способов сделать это. Помните, что с точки зрения JBossESB, процесс RiftSaw BPEL — это веб-сервис. Это означает, что действие службы JBossESB может вызвать процесс BPEL таким же образом, как и любой другой веб-сервис, который предоставляет определение WSDL. Есть несколько примеров этого подхода, проиллюстрированных в кратких руководствах JBossESB. Например, в быстром запуске «webservice_consumer1»,действие, используемое для вызова веб-службы, определяется как:
В jboss-esb.xml:
<actions mep="OneWay">
<action name="request-mapper"
class="org.jboss.soa.esb.samples.quickstart.webservice_consumer1.MyRequestAction">
</action>
<action name="soapui-client-action"
class="org.jboss.soa.esb.actions.soap.SOAPClient">
<property name="wsdl"
value="http://127.0.0.1:8080/Quickstart_webservice_consumer1/HelloWorldWS?wsdl"/>
<property name="responseAsOgnlMap" value="true" />
<property name="SOAPAction" value="sayHello"/>
</action>
<action name="response-mapper"
class="org.jboss.soa.esb.samples.quickstart.webservice_consumer1.MyResponseAction">
</action>
<action name="testStore" class=
"org.jboss.soa.esb.actions.TestMessageStore"/>
</actions>
- Строка 6: класс SOAPClient выполняет вызов веб-службы.
- Строка 9: параметр responseAsOgnlMap говорит JBossESB переместить данные ответа SOAP в эту карту на основе OGNL и прикрепить их к сообщению.
- Строка 10: ссылка на метод, который будет вызван в веб-сервисе.
ОК. Это было просто. Мы завершили цикл оркестрации сервисов JBossESB из BPEL-процесса RiftSaw и вызова сервисных действий JBossESB из BPEL-процесса RiftSaw.
Но ждать! Мы еще не закончили. Интеграция RiftSaw-JBossESB также поддерживает другой способ вызывать действия службы JBossESB из процесса RiftSaw BPEL без использования HTTP, веб-служб и WSDL.
Другой путь — действие BPELInvoke
Одна из функций JBossESB — это обширный набор предопределенных («из коробки») действий, которые могут быть включены в ваши приложения. Эти действия поддерживают широкий спектр задач, включая:
- Трансформаторы и преобразователи — преобразование данных сообщения из одной формы в другую
- Управление бизнес-процессами — интеграция с JBoss jBPM
- Сценарии — автоматизация задач на поддерживаемых языках сценариев
- Услуги — интеграция с EJB
- Маршрутизация — перемещение данных сообщения в правильные сервисы
- Уведомитель — отправка данных в ESB неосведомленных адресатов
- Webservices / SOAP — название говорит само за себя — поддержка веб-сервисов
(Существует также группа Разное, которая включает только одно действие — org.jboss.soa.esb.actions.SystemPrintln. Это действие печатает сообщение.)
JBossESB также поддерживает новое готовое действие, которое можно использовать для напрямую вызвать процесс RiftSaw BPEL. Это действие (org.jboss.soa.esb.actions.bpel.BPELInvoke) можно использовать, если RiftSaw установлен и работает на той же виртуальной машине Java, что и JBossESB, и если целевой процесс BPEL развернут в локальном экземпляре RiftSaw. Если ваша конфигурация соответствует этим требованиям, то может быть проще использовать действие BPELInvoke. Вы также должны увидеть лучшую производительность, чем при использовании веб-сервисов, поскольку процессы RiftSaw BPEL и сервисные действия JBossESB выполняются в одной и той же JVM.
Действие BPELInvoke позволяет вам указать не только процесс RiftSaw, который будет вызываться, но также и конкретную операцию в этом процессе. Вы настраиваете действие BPELInvoke со следующими свойствами:
- service — это обязательное свойство ссылается на имя службы, как определено в WSDL, для целевого процесса RiftSaw BPEL.
- операция — название говорит само за себя. Это обязательное свойство ссылается на операцию, также определенную в целевом процессе Riftsaw BPEL WSDL, которая должна быть вызвана.
- requestPartName — это свойство определяет часть сообщения WSDL, в которую должно быть отображено содержимое сообщения для сообщения с поддержкой JBossESB, обработанного действием JBossESB. Это свойство является необязательным и используется, когда входящее сообщение JBossESB еще не представляет собой сообщение, состоящее из нескольких частей.
- responsePartName — И, наконец, это свойство используется для извлечения содержимого ответного WSDL-сообщения из нескольких частей и вставки его в сообщение с поддержкой JBossESB, которое передается следующему действию JBossESB в конвейере действий. Это свойство является необязательным, и если оно не определено, полное сообщение из нескольких частей будет использоваться в сообщении, поддерживающем JBossESB.
Действие BPELInvoke может обрабатывать входящие сообщения с двумя типами содержимого:
- Объектная модель документа. Если содержимое входящего сообщения является документом или элементом DOM, его можно использовать как полное сообщение, состоящее из нескольких частей, или как содержимое части сообщения, как определено необязательным свойством action requestPartName. Однако, если содержимое сообщения является текстовым узлом DOM, его можно использовать только в том случае, если в необязательном свойстве action requestPartName определено имя, состоящее из нескольких частей.
- Java String — если содержимое входящего сообщения является строковым представлением документа XML, то свойство requestPartName является необязательным. Если это свойство не определено, то документ должен представлять полное составное сообщение. Однако, если содержимое сообщения представляет собой строку, которая не представляет документ XML, тогда requestPartName не является обязательным и должно быть указано.
Давайте посмотрим на действие BPELInvoke в действии, запустив пример программы быстрого запуска.
BPELInvoke в Quickstart
Я не могу сказать это достаточно часто; Быстрый старт — отличный ресурс для изучения работы продуктов JBoss и отправная точка для разработки собственного кода. Действие BPELInvoke используется в быстром запуске «bpel_helloworld». Этот быстрый запуск устанавливается в каталог / samples / quickstarts вашего сервера JBossESB как часть установок RiftSaw, которые мы рассмотрели в этом сообщении в блоге: (подсказка — это на шаге 6).
Этот быстрый запуск основан на быстром запуске riftsaw-2.0-SNAPSHOT / samples / quickstart / hello_world. В частности, быстрый запуск bpel_helloworld вызывает процесс RiftSaw BPEL, определенный в быстром запуске hello_world. Итак, перед запуском быстрого запуска bpel_helloworld необходимо развернуть быстрый запуск hello_world.
Интересная часть быстрого запуска bpel_helloworld для нас — это раздел файла jboss-esb.xml:
<service
category="HelloWorldBPELESB"
name="SayHello"
description="Hello World">
<listeners>
<jms-listener name="JMS-Gateway"
busidref="quickstartGwChannel"
is-gateway="true" />
<jms-listener name="helloWorld"
busidref="quickstartEsbChannel" />
</listeners>
<actions>
<action name="action1" class="org.jboss.soa.esb.actions.SystemPrintln">
<property name="printfull" value="true"/>
</action>
<action name="action2" class="org.jboss.soa.esb.actions.bpel.BPELInvoke">
<property name="service" value="{http://www.jboss.org/bpel/examples/wsdl}HelloService"/>
<property name="operation" value="hello" />
<property name="requestPartName" value="TestPart" />
<property name="responsePartName" value="TestPart" />
</action>
<!-- The next action is for Continuous Integration testing -->
<action name="testStore" class="org.jboss.soa.esb.actions.TestMessageStore"/>
</actions>
</service>
- Строка 16: Здесь мы начинаем определение действия BPELInvoke.
- Строка 17: служба в процессе Riftsaw BPEL, которая будет вызвана.
- Строка 18: И операция.
- Строки 19 и 20: части запроса и ответа WSDL.
Эта диаграмма иллюстрирует взаимосвязь быстрого запуска JBossESB bpel_helloworld и файлов конфигурации процесса RiftSaw BPEL.
Прежде чем мы запустим быстрый старт, есть еще одна вещь, на которую нужно посмотреть; клиент. В случае быстрого запуска это программа SendEsbMessage.java. Эта программа вызывается, когда вы выполняете цель ant ant sendesb, как это определено в строках 11-20 в файле faststart build.xml:
<project name="Quickstart_esb_bpel_hello_world" default="run" basedir=".">
<description>
${ant.project.name}
${line.separator}
</description>
<!-- Import the base Ant build script... -->
<import file="../conf/base-build.xml"/>
<target name="sendesb" depends="compile"
description="Will send an esb Message">
<echo>Runs Test ESB Message Sender</echo>
<java fork="yes" classname="org.jboss.soa.esb.samples.quickstart.helloworld.test.SendEsbMessage" failonerror="true">
<arg value="HelloWorldBPELESB"/> <!-- service category -->
<arg value="SayHello"/> <!-- service name -->
<arg value="Hello World via ESB to BPEL"/> <!-- Message text -->
<classpath refid="exec-classpath"/>
</java>
</target>
</project>
Параметры команды передаются в SendEsbMessage.java. Если мы посмотрим на строку 18 в этой программе (см. Ниже), мы увидим, что клиент отправляет сообщение и получает ответ. (Помните, что с BPEL весь трафик следует схеме синхронного обмена сообщениями.)
public class SendEsbMessage
{
public static void main(String args[]) throws Exception
{
// Setting the ConnectionFactory such that it will use scout
System.setProperty("javax.xml.registry.ConnectionFactoryClass","org.apache.ws.scout.registry.ConnectionFactoryImpl");
if (args.length < 3)
{
System.err.println("Usage SendEsbMessage <category><name> <text to send>");
System.exit(1);
}
Message esbMessage = MessageFactory.getInstance().getMessage();
esbMessage.getBody().add(args[2]);
Message respMessage = new ServiceInvoker(args[0],args[1]).deliverSync(esbMessage, 5000);
System.out.println("REPLY: "+respMessage.getBody().get());
}
}
Хорошо, давайте развернем и запустим быстрый старт. Вот команды ant и вывод, отображаемый клиентом:
sendesb:
[echo] Runs Test ESB Message Sender
[java] REPLY: Hello World via ESB to BPEL World
BUILD SUCCESSFUL
Total time: 10 seconds
А вот информация, записанная в журнал сервера) Я немного обрезал это …)
22:57:05,591 INFO [STDOUT] Message structure:
22:57:05,592 INFO [STDOUT] [ message: [ JBOSS_XML ]
.
.
.
context: {}
body: [ objects: {org.jboss.soa.esb.message.defaultEntry=Hello World via ESB to BPEL} ]
fault: [ ]
attachments: [ Named:{}, Unnamed:[] ]
properties: [ {org.jboss.soa.esb.message.byte.size=3920,
org.jboss.soa.esb.message.time.dod=Tue Nov 10 22:57:05 EST 2009,
javax.jms.message.redelivered=false} ] ]
Хорошо, это не совсем захватывающе, но, если вы посмотрите внимательно, вы увидите, что клиент отправил это сообщение:
Hello World via ESB to BPEL
И процесс RiftSaw BPEL ответил так:
Hello World via ESB to BPEL World
Это правильно. Операция приветствия в процессе RiftSaw BPEL сделала свое дело и добавила «Мир» к сообщению!
Заключение Мысли о том, что с точки зрения ESB процесс RiftSaw BPEL является веб-службой, делает управление процессами ESB простой задачей. Следствие также верно, так как действие JBossESB может также вызывать процесс RiftSaw BPEL таким же образом, как и веб-сервис. Однако также возможно вызвать BPEL-процесс RiftSaw с помощью одного из готовых действий JBossESB, BPELInvoke. В следующем посте к этому блогу мы рассмотрим, как обрабатываются исключения при интеграции RiftSaw-JBossESB.
Благодарности
Как всегда, я хочу поблагодарить сообщество RiftSaw (особенно Курта Стэма и Гэри Брауна), как за создание RiftSaw, за написание руководства пользователя, на котором основана эта запись в блоге, так и за их своевременный обзор отзывов для этого сообщения в блоге!