Skip navigation

本コネクタは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の文法は以下のようです:

bpm://ProcessType

(新プロセスの場合) 又は

bpm://ProcessType/ProcessID

(実行中のプロセスの場合)

「MyBigProcess」型の新規プロセスを起動する

bpm://MyBigProcess

実行中のID=4561のプロセスの処理を進める

bpm://MyBigProcess?processId=4561&action=advance

又は、

bpm://MyBigProcess/4561

(実行中プロセスに対して、処理を進めるのがデフォルトです)

プロセスの変数を更新(処理を進めない)

bpm://MyBigProcess/4561?action=update

実行中のプロセスを中断する (BPMSによって未対応)

bpm://MyBigProcess/4561?action=abort

実際のシステムでは、動的に「processId」をメッセージのプロパティに設定する場合が多くあります。

BPMSの受信メッセージ

BPMSがメッセージを受信した場合は、以下の2つの処理が実行されます。

  • メッセージの内容をプロセスの変数「incoming」に設定する *
  • メッセージを受け取ったESB Muleのエンドポイントをプロセスの変数「incomingSource」に設定する *

この2つのプロセス変数を利用して、実行中のプロセスを処理することができます。

BPMSからイベントを投げる

実行中のプロセスからイベントを投げる方法はBPMSに依存します。

実行中のプロセスから送られたメッセージは、該当するESB Muleのエンドポイントが受信します。例えば、実行中のIDが4561のプロセス「MyBigProcess」がメッセージをESB Muleに送ったとします。このメッセージは以下のようなESB Muleエンドポイントで受信されます:

bpm://MyBigProcess/4561

又は、下のようなエンドポイントで受信されます:

bpm://MyBigProcess

最後に、プロパティ「allowGlobalReceiver」が「true」に設定されている場合は、以下のようなエンドポイントでも受信することができます。

bpm://*

コネクタのプロパティ「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">
    <!-- BPMSプロセス・エンジンにメッセージを送信する -->
    <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);
    
    // 「MessageService」はプロセスからESB Muleメッセージを作成するためのコールバック・メソッドです
    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>
	
	<!-- ESB Mule BPM Connector用のBPMSオブジェクト -->
	<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>
	
	<!-- JBPM Hibernate SessionFactory -->
	<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>
	            <!-- Create/update the database tables automatically when the JVM starts up -->
	            <prop key="hibernate.hbm2ddl.auto">update</prop>
	        </props>
	    </spring-property>
	</bean>
	
	<!-- JBPM data types -->
	<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>
	
	<!-- JBPM Datasource -->
	<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

Adaptavist Theme Builder Powered by Atlassian Confluence