Red Hat Training

A Red Hat training course is available for JBoss Enterprise SOA Platform

第7章 JBPM 統合

7.1. はじめに

JBoss Business Process Manager (JBPM) 統合について学習するには、この章を参照してください (JBPM の基礎を把握しているとの前提で進めています。基礎を把握してない場合は、JBPM Reference Guide をまず参照してください)。
JBoss Business Process Manager はワークフローおよび business process management エンジンです。JBPM により、ビジネスプロセスの設計を行うように、人、アプリケーション、サービスを連携することができます。
ビジネスのプロシージャにて手順を図で作成したい場合は、JBPM の Process Designer 機能をご利用ください (このツールのもう1つ利点は、ビジネスアナリストと技術開発者との良好な関係を構築しやすくなります)。
JBoss Enterprise Service BusJBPM コンポーネントと統合される理由は2つあります。
  1. サービスオーケストレーション
    プロセス定義を作成することで、Business Process Manager を使いサービスのオーケストレーションが可能になります。
  2. ヒューマンタスク管理
    Business Process Manager により、マシンベースのサービスと人が行うタスク管理を統合することができます。

7.2. 統合の設定

完全な JBPM ランタイムエンジンとコンソールは JBoss Enterprise SOA Platform に含まれており、jbpm.esb ディレクトリに置かれています。
エンジンとコンソールは共通のデータベースを使っています。データベースを作成するには DatabaseInitializer m-bean を起動します (jbpm.esb/jbpm-service.xml ファイルの最初の設定要素に MBean 関連の設定があります)。
<classpath codebase="deploy" archives="jbpm.esb"/>
<classpath codebase="deploy/jbossesb.sar/lib" 
   archives="jbossesb-rosetta.jar"/>

<mbean code="org.jboss.internal.soa.esb.dependencies.DatabaseInitializer"
   name="jboss.esb:service=JBPMDatabaseInitializer">
   <attribute name="Datasource">java:/JbpmDS</attribute>
   <attribute name="ExistsSql">select * from JBPM_ID_USER</attribute>
   <attribute name="SqlFiles">
       jbpm-sql/jbpm.jpdl.hsqldb.sql,jbpm-sql/import.sql
   </attribute>
   <depends>jboss.jca:service=DataSourceBinding,name=JbpmDS</depends>
</mbean>

<mbean code="org.jboss.soa.esb.services.jbpm.configuration.JbpmService"
   name="jboss.esb:service=JbpmService">
</mbean>

表7.1 DatabaseInitializer MBean のデフォルト値

プロパティ 説明 デフォルト
Data Source JBPM データベースのデータソース java:/JbpmDS
ExistsSql この SQL コマンドを使いデータベースの存在を確認します。 JBPM_ID_USER から * を選択
SqlFiles これらのファイルには、SQL コマンドが含まれており、データベースがない場合は JBPM データベースを作成します。 jbpm-sql/jbpm.jpdl.hsqldb.sql, jbpm-sql/import.sql
デフォルトでは、DatabaseInitializer MBean が設定され、JbpmDS がデプロイされるまで待機し、その後 MBean が自身でデプロイを行います。
2つ目の MBean JbpmService は、JBoss Business Process Managerジョブエグゼキューターのライフサイクルと jbpm.esbのライフサイクルを連携します。job executor インスタンスを起動時に開始し、シャットダウン時に終了します。

警告

JbpmDS データソースを jbpm-ds.xml ファイルで定義します。デフォルトでは、Hypersonic データベースを使います。実稼働環境では、常にこれを実稼働品質のデータベースに変更してください。

警告

JBoss Enterprise SOA Platform にはインメモリ参照データベースの Hypesonic も同梱されています。これに関してもテスト環境でのみ利用してください。

注記

jbpm.esb デプロイメントはすべて同じデータベースインスタンスを共有するようにしてください (様々なエンタープライスサービスバス (ESB) ノードが同じプロセス定義にアクセスできるようにするためです)。
サーバーが起動すると、JBPM Console にアクセスできます。これは web ベースのアプリケーションで、http://localhost:8080/gpd-deployer のアドレスからアクセスしてください。
このアプリケーションのセキュリティ設定を変更する方法については、JBPM Reference Guide を参照してください。方法は、conf/login-config.xml ファイルの設定を変更します。
JBPM Console を使い JBPM プロセスとヒューマンタスク管理のプロシージャの両方をデプロイ、監視することができるようになりました (カスタマイズされたタスク一覧がユーザーごとに表示されるため、自分のタスクに関する作業を行うことができます)。bpm_orchestration4 クイックスタートはこの機能のデモを提供しています。
jbpm.esb/META-INF ディレクトリには、deployment.xmljboss-esb.xml ファイルが含まれています。
deployment.xml ファイルは、ESB アーカイブが従属する 2つのリソースファイルを指定します (jbossesb.esbJbpmDS のデータソースファイルがあります)。 これらのファイルの情報を使いデプロイメントの順番を判断します。
<jbossesb-deployment>
  <depends>jboss.esb:deployment=jbossesb.esb</depends>
  <depends>jboss.jca:service=DataSourceBinding,name=JbpmDS</depends>
</jbossesb-deployment>
jboss-esb.xml ファイルは JBpmCallbackService と呼ばれる、内部サービスを1つデプロイします。
<services>
  <service category="JBossESB-Internal" name="JBpmCallbackService"
    description="Service which makes Callbacks into jBPM">
    <listeners>
      <jms-listener name="JMS-DCQListener" 
        busidref="jBPMCallbackBus" maxThreads="1" />
    </listeners>
    <actions mep="OneWay">
      <action name="action" 
        class="org.jboss.soa.esb.services.jbpm.actions.JBpmCallback"/>
    </actions>
  </service>
</services>
この内部サービスは jBPMCallbackBus をリッスンします。このjBPMCallbackBus はデフォルトでは JBossMQ (jbmq-queue-service.xml ファイル経由) あるいは JBossMessaging (jbm-queue-service.xml ファイル経由) になるように設定されます。後者は Java Message Service Queue のメッセージプロバイダーです。このファイルのいずれかのみが jbpm.esb アーカイブにデプロイされるようにしてください。

注記

ご自身のメッセージングプロバイダーを利用になりたい場合は、jboss-esb.xml ファイルの該当セクションにて、そのメッセージングプロバイダーを参照するように変更してください。以下に例を示しています。
<providers>
  <jms-provider name="CallbackQueue-JMS-Provider" 
    connection-factory="ConnectionFactory">
    <jms-bus busid="jBPMCallbackBus">
      <jms-message-filter dest-type="QUEUE" 
        dest-name="queue/CallbackQueue" />
    </jms-bus>
  </jms-provider>
</providers>

7.3. JBPM の設定

JBoss Business Process Manager の設定は、jbpm.cfg.xmlhibernate.cfg.xmljbpm.mail.templates.xml の3つのファイルに保存されます。
jbpm.cfg.xml ファイルを JBPM が JTA Transaction Manager を使うように設定します。
<service name="persistence">
  <factory>
    <bean class="org.jbpm.persistence.jta.JtaDbPersistenceServiceFactory">
      <field name="isTransactionEnabled"><false/></field>
      <field name="isCurrentSessionEnabled"><true/></field>
      <!--field name="sessionFactoryJndiName">
      <string value="java:/myHibSessFactJndiName" />
      </field-->
    </bean>
  </factory>
</service>
また、hibernate.cfg.xml ファイルは、JBPM が JTA Transaction Manager を使うように指示をだします。
<!-- JTA transaction properties (begin) ===
    ==== JTA transaction properties (end) -->
<property name="hibernate.transaction.factory_class">
  org.hibernate.transaction.JTATransactionFactory</property>

<property name="hibernate.transaction.manager_lookup_class">
  org.hibernate.transaction.JBossTransactionManagerLookup</property>

注記

データベーススキーマの作成には、Hibernate を使わないでください。代わりに、DatabaseInitializer MBean を使うようにしてください。
デフォルトでは、jbpm.mail.templates.xml ファイルは空となています。

注記

これらの設定ファイルの詳細は、JBPM Reference Guide を参照してください。

7.4. プロセス定義の作成とデプロイ

Red Hat は JBoss Developer Studio JBPM Process Designer Plug-in (KA-JBPM-GPD) を使いプロセス定義を作成するよう推奨しています。手動でダウンロードしインストールするか、JBoss Developer Studio を使い実行してください。
JBPM Graphical Editor を使いプロセス定義を視覚的に作成します。ノードとノード間の移行を追加、削除、変更できます。このソフトが XML 形式でプロセス定義を保存します。
このファイルが保存されると、JBPM インスタンス (つまりデータベース) にデプロイできます。プロセスインスタンスをデプロイする度に JBPM はそのインスタンスをバージョニングし古いコピーも保存します。これにより、実行中のプロセスは既存のインスタンスを使って完了します。反対に、新規作成されたインスタンスはプロセス定義の最新のバージョンを使います。
プロセス定義をデプロイするには、サーバーが実行中か確認します。
次に、Graphical Editor の Deployment タブに移動し、プロセスアーカイブ を有効にします。

注記

processdefinition.xml ファイルしかデプロイする必要がない場合もありますが、通常はタスクフォームといった、他のartifacts もデプロイします。

警告

process archive に Java クラスをデプロイすることも可能です。つまり、最終的にデータベースに送られ、そこで保存、バージョニングされます。Red Hat では、Process archive への Java クラスのデプロイは推奨していません。理由としては、クラスローディングの問題が発生する可能性があるためです。代わりに、これらのクラスをサーバーの lib ディレクトリにデプロイしてください。
次に、以下の方法を使いプロセス定義をデプロイします。
  1. JBoss Developer StudioDeploy Process Archive ボタンをクリックする方法 (まず、デプロイヤーを使いアップロードサーブレットを設定してください)。Deployment ビューで確認できます。
  2. Deployment ビューからローカル .par ファイルにデプロイメントを保存し、JBPM Console を使いアーカイブを有効にする方法 (これには管理者権限でコンソールにログインしている必要があります)。
  3. DeployProcessToServer JBPM ant タスクを使う方法

7.5. Enterprise Service Bus から JBPM へ

JBoss Enterprise Service Bus は、BpmProcessor アクションを使い JBoss Business Process Manager へ呼び出すことができます。このアクションは、JBPM Command API を使います。利用可能な JBPM コマンドを以下に挙げています。

表7.2 JBPM コマンド

コマンド 説明
NewProcessInstanceCommand
このコマンドは、新規の ProcessInstance を開始し、そのうち、関連のプロセス定義が JBPM にデプロイされています。NewProcessInstanceCommandstart のステータスににプロセスインスタンスをのコアします。例えば、actor のタスクリストに1つある場合などです。
StartProcessInstanceCommand
これは、新規プロセスインスタンスが start の位置から最初のノードに自動的に移動される以外は、NewProcessInstanceCommand と同じです。
GetProcessInstanceVariablesCommand
このコマンドは、プロセスインスタンス識別子を使い、プロセスインスタンスにルートノードを取ります。
CancelProcessInstanceCommand
このコマンドは、ProcessInstance を取り消します。これは、イベントを受け取り ProcessInstance 全体をキャンセルする必要がある場合などに利用します (このアクションは JBPM コンテキスト変数をメッセージに設定する際に必要になります。特に ProcessInstance 識別子などです)。
このアクションに対する jboss-esb.xml の設定は以下のようになります。
<action name="create_new_process_instance" 
  class="org.jboss.soa.esb.services.jbpm.actions.BpmProcessor">

  <property name="command" value="StartProcessInstanceCommand" />
  <property name="process-definition-name" value="processDefinition2"/>
  <property name="actor" value="FrankSinatra"/>                                                 
  
  <property name="esbToBpmVars">
  <!-- esb-name maps to getBody().get("eVar1") -->
    <mapping esb="eVar1" bpm="counter" default="45" />
    <mapping esb="BODY_CONTENT" bpm="theBody" />
  </property>             

</action>
以下の2つの属性を利用する必要があります。
  1. 名前
    action pipelineで一意であれば、この name 属性の値のいずれかを使います。
  2. クラス
    常に、この属性を org.jboss.soa.esb.services.jbpm.actions.BpmProcessor に設定します。
これらの任意のプロパティも設定することができます。

表7.3 設定プロパティ

プロパティ 説明 必須
command
これは、NewProcessInstanceCommandStartProcessInstanceCommandGetProcessInstanceVariablesCommandCancelProcessInstanceCommand のいずれかでなければなりません。
はい
process-definition-name
このプロパティは、process-definition-id プロパティを使わない場合、NewProcessInstanceCommandsStartProcessInstanceCommands に必要です。このプロパティの値は、新規インスタンスを作成したいと考えているデプロイ済みのプロセス定義を参照する必要があります (このプロパティはCancelProcessInstanceCommand に適用されません)。
場合による
process-definition-id
これは、process-definition-name プロパティが使用されていない場合、NewProcessInstanceCommandsStartProcessInstanceCommands には必須プロパティです。このプロパティの値は、新規インスタンスを作成したいと考えているデプロイ済みのプロセス定義を参照する必要があります (このプロパティは CancelProcessInstanceCommand に適用されません)。
場合による
actor
このプロパティを使い JBPM actor 識別子を指定します (NewProcessInstanceCommandStartProcessInstanceCommand にのみ適用します)。
いいえ
key
このプロパティを使い JBPM キーを指定します。このキーは、プロセスインスタンス上にある文字列ベースのビジネスキープロパティです。ビジネスキーが提供されている場合、ビジネスキーとプロセス定義の組み合わせは一意でなければなりません。キーの値は、MVEL 式を保持することができ、EsbMessage から希望の値を抽出します。例えば、メッセージボディにbusinessKey と呼ばれるパラメーターを置きたい場合、body.businessKey を使います (このプロパティは NewProcessInstanceCommandStartProcessInstanceCommands にのみ適用します)。
いいえ
transition-name
これは StartProcessInstanceCommand のみに適用します。現在のノードからの遷移が複数ある場合にのみ使います。このプロパティが指定されていない場合は、このノードからのデフォルトの遷移が取られます。 デフォルトの遷移は JBPM processdefinition.xml のノードに定義された遷移一覧にある一番最初のものです。
いいえ
esbToBpmVars
これは New-StartProcessInstanceCommand の任意のプロパティです。これは、ESB メッセージから抽出し特定のプロセスインスタンスに対し JBPM コンテキストに設定する必要のある変数一覧を定義します。この一覧はマッピング要素で構成されており、それぞれ以下の属性を含みます。
  • esb
    これは必須属性です。ここに MVEL 式を置き、ESB メッセージの中から値を抽出するのに利用します。
  • bpm
    これは任意属性で、JBPM 側で利用する名前が含まれています (省略されている場合、エンタープライズサービスバスの名前を利用します)。
  • default
    これは任意の属性で、ESB の MVEL 式により ESB メッセージ内に設定されている値を発見できない場合に利用するデフォルト値を保持することができます。
  • bpmToEsbVars
    これは上記の esbToBpmVars と構造的には同じです。GetProcessInstanceVariablesCommand とあわせて利用し JBPM process instance variables (root token 変数) を ESB メッセージにマッピングします。
  • reply-to-originator
    これは New- と StartProcessInstanceCommands の任意のプロパティです。 Specify a value of true を指定すると、プロセスインスタンスがそのインスタンス内に呼び出し中のメッセージエンドポイント参照の ReplyTo/FaultTo 値を保存します。これらの値を後続の EsbNotifier/EsbActionHandler 呼び出しで利用しメッセージを ReplyTo/FaultTo アドレスに配信することができます。
いいえ
EsbMessage のボディに変数が設定されました。

表7.4 ボディの設定プロパティ

プロパティ 説明 必須
jbpmProcessInstId
GetProcessInstanceVariablesCommand と CancelProcessInstanceCommand コマンドに適用する必須の ESB メッセージボディパラメーター。この値を EsbMessage ボディに名前付きのパラメーターとして設定するかはユーザー次第です。
はい

7.5.1. ESB-to-JBPM 例外処理

ESB が呼び出された場合、JbpmException が JBPM Command API からスローされる可能性があります。この例外は action pipeline に渡されます。このパイプラインでエラーをロギングし、メッセージを DeadLetterService に転送後、エラーを faultTo エンドポイント参照に送信します (faultTo が設定されていると仮定)。

7.6. JBPM-to-ESB 統合

JBPM-to-JBossESB の通信により、サービスオーケストレーションに JBPM を利用できるようになります。
JBPM アクションハンドラークラス2つ (EsbActionHandlerEsbNotifier) を利用しこの統合を実現します。EsbActionHandler は request-reply タイプアクションでメッセージをサービスに送信しレスポンスを待ちます。反対に、EsbNotifier はレスポンスを待ちません。

注記

エンタープライズサービスバスとのやり取りは非同期的であるため、サービス実行中にプロセスインスタンスをブロックしません。

警告

JBPM と JBoss ESB サービスを渡す変数を表現するクラスが JBPM プロセス、対象の ESB サービス、ESB JBPM コールバックサービスで見える状態であることが重要です。このような理由から、Red Hat はこれらのクラスをサーバーのlib ディレクトリにデプロイするように推奨しています。
EsbNotifier アクションは EsbActionHandlerのサブセットを実装するため、まずこのアクションについて学習します。

7.6.1. ESB Notifier Action

EsbNotifier アクションは、出力遷移に紐付けする必要があります。これは、バックグラウンドで ESB サービスへのリクエストを実行している間に JBPM が継続して処理ができるようにするためです。EsbNotifierJBPM processdefinition.xml ファイルの 出力遷移 (outgoing transition) に紐付けする必要があります。
<node name="ShipIt">
  <transition name="ProcessingComplete" to="end">
    <action name="ShipItAction" 
      class="org.jboss.soa.esb.services.jbpm.actionhandlers.EsbNotifier">
      <esbCategoryName>BPM_Orchestration4</esbCategoryName>
      <esbServiceName>ShippingService</esbServiceName>                           
      <bpmToEsbVars>
        <mapping bpm="entireCustomerAsObject" esb="customer" />
        <mapping bpm="entireOrderAsObject" esb="orderHeader" />
        <mapping bpm="entireOrderAsXML" esb="entireOrderAsXML" />
      </bpmToEsbVars>
    </action>
  </transition>
</node>
以下の属性を指定することができます。
  • 名前
    これは必須です。アクションのユーザー固有名。
  • クラス
    必須。org.jboss.soa.esb.services.jbpm.actionhandlers.EsbNotifier に設定する必要があります。
以下のサブ要素を指定することも可能です。
  • esbCategoryName
    これは ESB サービスのカテゴリ名で、reply-to-originator 機能を利用しない場合は必須です。
  • esbServiceName
    これは ESB サービス名で、reply-to-originator 機能を利用しない場合は必須です。
  • replyToOriginator
    これを使い、作成時にプロセスインスタンスに保存されていた reply あるいは fault 送信元アドレスを指定します。
  • globalProcessScope
    この要素は任意の Boolean 値パラメーターです。これを使い、bpmToEsbVars 変数の検索を行うデフォルト範囲を設定します。globalProcessScopetrueに設定されている場合、トークン階層 内の変数を検索します (process-instance の範囲) 。反対に、falseに設定されている場合、トークンの範囲内の変数をリトリーブします。トークン自体が指定名の変数を持たない場合、トークン階層を使いその変数を検索します。この要素が省略されている場合はglobalProcessScope がデフォルトで falseに設定されます。
  • bpmToEsbVars
    この要素は任意です。サブ要素のリストで、これらを使い JBPM コンテキスト変数を ESB メッセージの場所にマッピングします。これらのマッピングサブ要素に以下の属性を持たせることができます。
    • bpm - これは必須属性です。JBPM コンテキストの変数名です。この名前は MVEL 型式にすることもできるため、大きめのオブジェクトから指定のフィールドを抽出することができます。MVEL root を JBPM “ContextInstance”に設定する場合、以下のようなマッピングを利用できます。
      <mapping bpm="token.name" esb="TokenName" />
      <mapping bpm="node.name" esb="NodeName" />      	
      <mapping bpm="node.id" esb="esbNodeId" />      	
      <mapping bpm="node.leavingTransitions[0].name" esb="transName" />
      <mapping bpm="processInstance.id" esb="piId" /> 
      <mapping bpm="processInstance.version" esb="piVersion" />
      JBPM コンテキスト変数は直接参照することも可能です。
    • esb
      この属性は任意です。エンタープライズバスメッセージの変数名です。MVEL 型式も可能です (つまり、上記の例の属性値 TokenNamebody.TokenName と同等です。BODY_CONTENT と呼ばれる特別値はボディを直接指定します)。デフォルトでは、変数がESB メッセージのボディに名前付きのパラメーターとして設定されます。esb 属性を省略するには、bpm 属性の値と置き換えてください。
    • process-scope
      この属性は任意です。これパラメーターでこの中にはマッピング用に globalProcessScope 設定をオーバーライドする際に利用する Boolean 値を含めることが可能です。

重要

変数マッピング設定で作業する場合は、debug レベルのロギングを常に有効にしてください。

7.6.2. ESB のアクションハンドラー

ノードが入った場合にアクションを呼び出したい場合は、EsbActionHandler をノードに紐付けします。EsbActionHandler が実行すると、遷移の合図を待つノードを退出します (他の実行中スレッドからも入れますが、通常は JBossESB callback サービスが送信します)。以下に設定方法を示しています。
<action name="create_new_process_instance" 
  class="org.jboss.soa.esb.services.jbpm.actions.BpmProcessor">

  <property name="command" value="StartProcessInstanceCommand" />
  <property name="process-definition-name" value="processDefinition2"/>
  <property name="actor" value="FrankSinatra"/>                                                 
  
  <property name="esbToBpmVars">
  <!-- esb-name maps to getBody().get("eVar1") -->
    <mapping esb="eVar1" bpm="counter" default="45" />
    <mapping esb="BODY_CONTENT" bpm="theBody" />
  </property>             

</action>
EsbActionHandlerEsbNotifier の設定にも依存します。拡張には以下のサブ要素が含まれています。

表7.5 サブ要素

プロパティ 説明 必須
esbToBpmVars
これはBpmProcessor 設定の esbToBpmVars プロパティと同じです。サブ要素は、ESB メッセージから抽出し、特定のプロセスインスタンスに対しビジネスプロセスマネージャーに設定する必要のある変数一覧を定義します。これを指定せず、変数が設定されている場合は globalProcessScope 値はデフォルトで true に設定されます。
このリストには、マッピング要素が含まれており、これらの要素には以下の属性を含めることが可能です。
  • esb
    これは必須属性で、MVEL 式を含むことができます。これを使い、値を抽出し別の場所から ESB メッセージに置くことができます。
  • bpm
    これは任意の属性で、JBPM で利用する名前を含みます。これが提示されていない場合は esb の名前を代わりに利用します。
  • default
    これは任意の属性で、esb の MVEL 式により Enterprise Service Bus メッセージ内に設定されている値を発見できない場合に利用するデフォルト値を保持することができます。
  • process-scope
    これは Boolean 値で構成される任意のパラメーターです。これを使いこのマッピングの globalProcessScope の設定をオーバーライドします。
いいえ
exceptionTransition
これは、サーバー処理中に例外が発生した場合に使用する遷移の名前です。この要素では、現在のノードに複数の出力遷移があり、そのうちの1つが例外処理を行う必要があります。
いいえ
希望であればタイムアウト値 (任意) を指定することができます。指定方法は、JBPM ネーティブのタイマーをノードに追加してください。この例では、このノードに入って10秒以内にシグナルを受け取らない場合、time-out と呼ばれる遷移がトリガーされるような設定になっています。
<timer name='timeout' duedate='10 seconds' transition='time-out'/>

7.6.3. JBPM-to-ESB 例外処理

例外は以下の2つの状況で発生します。
  1. メッセージを Enterprise Service Busに送信できない場合、ServiceInvokerMessageDeliveryException をスローします。これはユーザーがサービス名のスペルを間違えた場合などに発生します。この種類の例外は、EsbNotifierEsbActionHandler の両方からスローされます。ExceptionHandler (TB-JBPM-USER ) を JBPM ノードに追加しこのような状況に対応することもできます (詳細は http://docs.jboss.com/jbpm/v3/userguide/processmodelling.html を参照してください)。
  2. 2つ目の例外は、リクエストを正常に受け取りはするものの、次の処理中に問題が発生した場合に発生します。呼び出しがEsbActionHandler から出された場合のみ、例外はJBoss Business Process Managerに報告されます。これは、呼び出しがEsbNotifier から行われた場合、JBPM 処理はすでに進められており、問題をプロセスインスタンスに報告してもあまりに意味がないためです。
標準の JBPM 機能で設定できるエラー処理を例示するシナリオをいくつか以下に示しています。

7.6.4. シナリオ1:タイムアウト

EsbActionHandler アクションを利用し、ノードがコールバックを待っている場合、待機時間に制限を設けると便利です。制限時間を設定するにはノードにタイマーを追加します (以下のプロセス定義スニペットで Service1 が設定されているように行います)。このタイマーは一定期間設定でき、今回の場合は10秒に設定されています。
<node name="Service1">

  <action class=
    "org.jboss.soa.esb.services.jbpm.actionhandlers.EsbActionHandler">
    <esbCategoryName>MockCategory</esbCategoryName>
      <esbServiceName>MockService</esbServiceName>
  </action>
  
  <timer name='timeout' duedate='10 seconds' 
    transition='time-out-transition'/>
  <transition name="ok" to="Service2"></transition>
  <transition name="time-out-transition" to="ExceptionHandling"/>

</node>
Service1 には2つの出力遷移があります。1つ目は ok で、2つ目は time-out-transition と呼ばれるものです。
通常の処理条件では、コールバックはデフォルトの遷移 (ここでは ok、一番に設定されているため) にシグナルを送ります。しかし、サービス処理に10秒以上かかった場合、タイマーが実行されます。このタイマーの transition 属性は time-out-transition にされており、タイムアウトするとこの遷移が取られることになります。
図を参照していただくと、この処理が ExceptionHandling ノードで終わっていることがわかります。ここから、代わりの作業を行うことができます。

7.7. シナリオ2:例外遷移

exceptionTransition を定義し、サービス処理中に発生する例外を処理することができます。こうすることで、faultTo エンドポイント参照をメッセージに設定し、エンタープライズサービスバスがこのノードにコールバックします。このコールバックにより exceptionTransition にシグナルを送ります。
Service2 には2つの出力遷移があります。正常に行われている場合は ok 遷移をとり、名前が示すように処理中にサービスが例外を送出した場合にexception 遷移を取ります。
<node name="Service2">
  <action class=
  "org.jboss.soa.esb.services.jbpm.actionhandlers.EsbActionHandler">
     <esbCategoryName>MockCategory</esbCategoryName>
     <esbServiceName>MockService</esbServiceName>
     <exceptionTransition>exception</exceptionTransition>
   </action>
   <transition name="ok" to="Service3"></transition>
   <transition name="exception" to="ExceptionHandling"/>
</node>
Service2 定義の前に、アクションの exceptionTransitionexception と設定されています。このシナリオでは、この処理自体が ExceptionHandling ノードに到達するように設定されています。

7.8. シナリオ3:例外の決定

最後のシナリオを理解するには、Service3 とその次の exceptionDecision ノードの設定を学習してください。Service3 は通常どおりに処理し、ノードからの遷移は予想どおりに行われます。
しかし、サービス実行中に errorCode が設定され、exceptionDecision ノードが同じ名前の変数が呼び出されていないか確認します。
<node name="Service3">
  <action class=
  "org.jboss.soa.esb.services.jbpm.actionhandlers.EsbActionHandler">
     <esbCategoryName>MockCategory</esbCategoryName>
     <esbServiceName>MockService</esbServiceName>
     <esbToBpmVars>
        <mapping esb="SomeExceptionCode" bpm="errorCode"/>
     </esbToBpmVars>
  </action>
  <transition name="ok" to="exceptionDecision"></transition>
</node>
   
<decision name="exceptionDecision">
   <transition name="ok" to="end"></transition>
   <transition name="exceptionCondition" to="ExceptionHandling">
      <condition>#{ errorCode!=void }</condition>
   </transition>
</decision>
esbToBpmVars マッピング要素は、メッセージのボディから SomeExceptionCode と呼ばれる errorCode を抽出し、 JBPM コンテキスト に設定します (これは SomeExceptionCode が設定されているとの前提で行われます)。
次のノードで、名前付きの exceptionDecision ですが、通常処理の場合はok の遷移が取られますが、errorCode と呼ばれる変数が JBPM コンテキストにない場合は exceptionCondition 遷移が取られます。
システムをこの方法で設定するには、JBPM の決定ノード機能を使う必要があります。これにより、条件内に複数の遷移をネストすることができます。
<condition>#{ errorCode!=void }</condition>

注記

条件遷移の詳細については、JBPM リファレンスガイドを参照してください。