 |
本コネクタはESB Mule1.4から対応しています。Web Serviceを利用してESB MuleとOracle BPELの連携に付いては、ESB MuleとOracle SOA BPELの統合ページを参照してください。Oracle BPELエンジンのAPIを利用してWeb Serviceではなく、本ページで説明しているような機能も実装することができると思います。 |
BPM Connector
BPMコネクターはESB Muleイベントで、BPMS(ビジネス・プロセス・マネージメント・システム)のプロセスを新規に起動したり、起動中のプロセスの処理を次の処理へ進めまたりすることができます。また、実行中のプロセスからESB Muleイベントを発生させることもできます。
概要
BPMとESB Muleの関係の概要はTravis Carlson氏のMuleCon 2007の発表を参照してください。
BPM ConnectorとJBoss jBPMを連携される例はESB Muleに同梱されているLoanBroker BPMを参照してください。
BPM Connnector用のJavadocsは
BPM Transport
にあります。
特長
- ESB Muleが受信してイベントにより、新プロセスを起動、実行中のプロセスを進めることや中断させることができます。
- 実行中のプロセスがESB Muleの非同期又は同期イベントを生成することができます。
- 「bpm://プロセス」型のエンドポイントを利用して、ESB Muleの生成されたイベントをルーティングすることができます。
- ESB Muleからの同期レスポンスは、自動的に実行中プロセスを送信されます。
- ESB Muleは、並行して複数のプロセスを処理することができます。
 | BPEL
ESB MuleのBPMコネクタは、Java APIが公開されているBPMエンジンのみと連携することが可能です。SOAPエンドポイントのみが公開されているBPELエンジンと連携する場合は、Web Serviceを利用する必要があります。この場合の例はここにあります。 |
利用
BPMSへイベントを送信
URIの文法は以下のようです:
(新プロセスの場合) 又は
(実行中のプロセスの場合)
「MyBigProcess」型の新規プロセスを起動する
実行中のID=4561のプロセスの処理を進める
又は、
(実行中プロセスに対して、処理を進めるのがデフォルトです)
プロセスの変数を更新(処理を進めない)
実行中のプロセスを中断する (BPMSによって未対応)
 |
実際のシステムでは、動的に「processId」をメッセージのプロパティに設定する場合が多くあります。 |
BPMSの受信メッセージ
BPMSがメッセージを受信した場合は、以下の2つの処理が実行されます。
- メッセージの内容をプロセスの変数「incoming」に設定する *
- メッセージを受け取ったESB Muleのエンドポイントをプロセスの変数「incomingSource」に設定する *
この2つのプロセス変数を利用して、実行中のプロセスを処理することができます。
BPMSからイベントを投げる
実行中のプロセスからイベントを投げる方法はBPMSに依存します。
実行中のプロセスから送られたメッセージは、該当するESB Muleのエンドポイントが受信します。例えば、実行中のIDが4561のプロセス「MyBigProcess」がメッセージをESB Muleに送ったとします。このメッセージは以下のようなESB Muleエンドポイントで受信されます:
又は、下のようなエンドポイントで受信されます:
最後に、プロパティ「allowGlobalReceiver」が「true」に設定されている場合は、以下のようなエンドポイントでも受信することができます。
コネクタのプロパティ「allowGlobalDispatcher」が「true」に設定されていなければ、新しいメッセージは受信したコンポーネントからルーティングされます。メッセージが同期の場合は、レスポンスが自動的に送り返されます。
設定
Connectorプロパティ
| プロパティ |
説明 |
デフォルト |
必須 |
| bpms |
BPPSはインターフェース
org.mule.providers.bpm.BPMS
を実装しなければなりません。 |
|
○ |
| processIdField |
メッセージとプロセスを対応付けます。 |
processId |
× |
| allowGlobalReceiver |
タイプ「bpm://*」のグローバル・レシーバーはプロセスに関係なくメッセージを受信します。「false」に設定された場合は、各エンドポイントにプロセス名を指定する必要があります。例:「bpm://MyProcess」は「MyProcess」プロセスのみのメッセージを受信します。 |
false |
× |
| allowGlobalDispatcher |
「false」の場合は、プロセスが送信たメッセージは、受信したコンポーネントのみににルーティングされます。「true」の場合は、プロセスはコンポーネントの任意のエンドポイントにメッセージを送ることができます。 |
false |
× |
Messageプロパティ
| プロパティ |
説明 |
デフォルト |
必須 |
| processType |
プロセスの名前 |
|
○ |
| processId |
実行中プロセスの識別子ID |
|
actionが「yes」以外の場合は必須 |
| action |
BPMS:「start」で行う処理。 / 「advance」 / 「update」 / 「abort」 |
processIdが存在する場合は「advance」。それ以外は「start」 |
× |
| transition |
現状から複数の状態に移行が可能な場合は、移行する状態 |
|
× |
設定の例
以下は簡単な設定の例です:
<connector name="jBpmConnector" className="org.mule.providers.bpm.ProcessConnector">
<properties>
<!-- ここで、SpringFrameworkのようなコンテナからプロパティ「bpms」を設定する(以下の例を参照してください)
又は,プログラムから設定する -->
</properties>
</connector>
<model name="bpm_example">
<mule-descriptor name="ToBPMS" implementation="org.mule.components.simple.LogComponent">
<inbound-router>
<endpoint address="Incoming1"/>
<endpoint address="Incoming2"/>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.FilteringOutboundRouter">
<endpoint address="bpm://MyProcess" synchronous="false" />
</router>
</outbound-router>
</mule-descriptor>
<mule-descriptor name="FromBPMS" implementation="org.mule.components.simple.LogComponent">
<inbound-router>
<endpoint address="bpm://MyProcess" />
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.EndpointSelector">
<endpoint address="Outgoing1"/>
<endpoint address="Outgoing2"/>
<endpoint address="Outgoing3"/>
</router>
</outbound-router>
</mule-descriptor>
</model>
BPMエンジンと統合
ESB Muleの基本理念の一つは、ユーザに最大の柔軟性を提供することです。この理念からは、ESB Muleに任意のBPMエンジンをプラグインできるようにすることが理想です。残念ながら、まだこれを実現するためのJEE標準がありません。JSR-207のような試しはありましたが、今のところは進捗はあまりみえていめせん。BPELからも対策が進められましたが、JBIのようにSOAP Web Serviceに限定しているために、ESB Muleの柔軟性理念に満たしていません。
このような状況のために、標準ができるまでは、ESB Muleは独自のBPMトランスポートを定義することに決めました。(^^)
public interface BPMS
{
public Object startProcess(Object processType, Map processVariables);
public Object advanceProcess(Object processId, Object transition, Map processVariables);
public Object updateProcess(Object processId, Map processVariables);
public void abortProcess(Object processId);
public void setMessageService(MessageService msgService);
}
(
org.mule.providers.bpm.BPMS
)インターフェースを実装したBPMエンジンは、ESB MuleのBPM Transportを介してプラグインすることができます。
現在、このインターフェースを実装した製品はJBoss jBPMにみですが、ESB Muleコミュニティが他BPMエンジンの実装を作成しているることを期待しています。(^^;
JBoss jBPMと接続
jBPMの設定及び使い方に付いては、以下のサイトを参照してください:
JBoss jBPMユーザガイド
英語:http://docs.jboss.com/jbpm/v3/userguide
BPMSインターフェースを実装するjBPMのクラスで、コネクタのプロパティ「bpms」をするのは
org.mule.providers.bpm.jbpm.Jbpm
です。ESB MuleのjBPM連携に関するJavaDocは以下にあります:
jBPM Integration
設定
ESB MuleからjBPMを設定するには、SpringとSpringのjBPM Moduleを利用することを推奨します。
<!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN"
"http://mule.mulesource.org/dtds/mule-spring-configuration.dtd">
<mule-configuration id="Mule_BPM" version="1.0">
<connector name="jBpmConnector" className="org.mule.providers.bpm.ProcessConnector">
<properties>
<spring-property name="bpms"><ref local="jbpm" /></spring-property>
</properties>
</connector>
<bean id="jbpm" class="org.mule.providers.bpm.jbpm.Jbpm" destroy-method="destroy">
<spring-property name="jbpmConfiguration">
<ref local="jbpmConfig" />
</spring-property>
</bean>
<!-- jBPMの設定
注:LocalJbpmConfigurationFactoryBeanWorkaroundは以下の問題の回避策です:
http://opensource.atlassian.com/projects/spring/browse/MOD-266 -->
<bean id="jbpmConfig" class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBeanWorkaround">
<spring-property name="sessionFactory">
<ref local="jbpmSessionFactory"/>
</spring-property>
<spring-property name="configuration">
<value>jbpm.cfg.xml</value>
</spring-property>
<spring-property name="createSchema"><value>false</value></spring-property>
</bean>
<bean id="jbpmSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<spring-property name="dataSource">
<ref local="jbpmDataSource" />
</spring-property>
<spring-property name="mappingLocations">
<value>classpath*:/org/jbpm/**/*.hbm.xml</value>
</spring-property>
<spring-property name="typeDefinitions">
<ref local="jbpmTypes" />
</spring-property>
<spring-property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.c3p0.min_size">1</prop>
<prop key="hibernate.c3p0.max_size">3</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.query.substitutions">true 1, false 0</prop>
<prop key="hibernate.jdbc.batch_size">0</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</spring-property>
</bean>
<bean id="jbpmTypes" class="org.springframework.orm.hibernate3.TypeDefinitionBean">
<spring-property name="typeName"><value>string_max</value></spring-property>
<spring-property name="typeClass"><value>org.jbpm.db.hibernate.StringMax</value></spring-property>
</bean>
<bean id="jbpmDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<spring-property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></spring-property>
<spring-property name="url"><value>jdbc:hsqldb:mem:.;sql.enforce_strict_size=true</value></spring-property>
<spring-property name="username"><value>sa</value></spring-property>
<spring-property name="password"><value></value></spring-property>
</bean>
</mule-configuration>
Springを利用しないで、jBPMを設定するには、jBPMインスタンスを基にorg.mule.providers.bpm.jbpm.Jbpmラッパーを作成して、BPMコネクタのプロパティ「bpms」に設定します。
例:
ProcessConnector connector = new ProcessConnector();
BPMS bpms = new org.mule.providers.bpm.jbpm.Jbpm(yourJbpmInstance);
connector.setBpms(bpms);
MuleManager.getInstance().registerConnector(connector);
jBPMでESB Muleメッセージの作成
jBPMプロセスからESB Muleメッセージを作成するには、
org.mule.providers.bpm.jbpm.actions.SendMuleEvent
ActionHandlerを使います。
<process-definition name="sendMessageProcess">
<description>Generates a simple Mule event.</description>
<start-state name="start">
<transition to="sendMessage" />
</start-state>
<state name="sendMessage">
<event type="node-enter">
<action class="org.mule.providers.bpm.jbpm.actions.SendMuleEvent">
<endpoint>file:///tmp</endpoint>
<payload>Message in a bottle.</payload>
<synchronous>false</synchronous>
</action>
</event>
<transition to="end" />
</state>
<end-state name="end" />
</process-definition>
ESB Mule用のjBPMアクション・ハンドラー
jBPMにカスタム機能を追加するにはActionHandlersを利用します。jBPMとESB Muleを連携する場合に、BPMトランスポートから提供されているActionHandlerすると便利に行えます。
SendMuleEvent - 特定のエンドポイントにESB Muleメッセージを送信する。同期メッセージの場合は、ESB Muleからのレスポンスは自動的にプロセス変数「incoming」に設定されます。
詳細...
org.mule.providers.bpm.jbpm.actions.SendMuleEvent
StoreIncomingData - 受信したメッセージを指定した変数に設定する。
詳細...
org.mule.providers.bpm.jbpm.actions.StoreIncomingData
ValidateMessageSource - メッセージの差出人が予定外の場合は例外を投げる。
詳細...
org.mule.providers.bpm.jbpm.actions.ValidateMessageSource
ValidateMessageType - 受信したメッセージのクラスが予定外の場合は、例外を投げる。
詳細...
org.mule.providers.bpm.jbpm.actions.ValidateMessageType