第14章 JBPM プロセス定義言語

JBPM プロセス定義言語 (JPDL) は、xml スキーマとすべてのプロセス定義に関係するファイルをプロセスアーカイブにパッケージするためのメカニズムを指定します。

14.1. プロセスアーカイブ

プロセスアーカイブは zip ファイルです。プロセスアーカイブの中心的なファイルはprocessdefinition.xml となっています。 このファイルに含まれる主な情報は、プロセスグラフです (アクションやタスクの情報も含まれています)。 processdefinition.xml には、 アクションとタスクについての情報も含まれています。また、プロセスアーカイブにはタスクが必要とするクラスやユーザーインターフェース (UI) フォームなど、他のプロセス関連ファイルを格納することもできます。

14.1.1. プロセスアーカイブのデプロイ

process archiveは、以下の3つの方法でデプロイ可能です。
  • Process Designer Tool
  • ant タスク
  • プログラム
Process Designer Toolでプロセスアーカイブをデプロイするには、以下の手順に従います (このプロセスはstarter's kitで対応しています)。
  1. プロセスアーカイブフォルダーを右クリックし、 Deploy process archive オプションを選択します。
    starter's kit サーバーには JBPM アプリケーションが含まれており、このアプリケーションにはProcessUploadServlet と呼ばれるプロセスアーカイブをアップロードするサーブレットが存在します。このサーブレットはプロセスアーカイブをアップロードし、それをデフォルトの JBPM インスタンスにデプロイできます。
ant タスクでプロセスをデプロイを行うには、以下のコードを使います。
<target name="deploy-process">
  <taskdef name="deployproc" classname="org.jbpm.ant.DeployProcessTask">
    <classpath location="jbpm-jpdl.jar" />
  </taskdef> 
  <deployproc process="build/myprocess.par" />
</target>
一度により多くのプロセスアーカイブをデプロイするには、ネストされた fileset 属性を使用します。このプロセス属性自体は任意です。ant タスクの他の属性は以下の通りです。

表14.1 Ant 属性

属性 説明 必要性
process
プロセスアーカイブへのパス
ネスト化されたリソースコレクション要素を利用していなければ YES
jbpmcfg
デフォルト値は、 jbpm.cfg.xml です。 JBPM 設定ファイルは、 データベースおよびマッピングファイルの JDBC 接続プロパティを含む Hibernate 設定ファイルの場所を指定できます (デフォルト値は hibernate.cfg.xml)。
No、jbpm.cfg.xml がデフォルト
failonerror
false の場合、警告メッセージをログに残しますが、プロセス定義がデプロイに失敗してもビルドは停止されません。True に設定されている場合、プロセス定義の1つのデプロイメントに失敗するとデプロイメントタスクが即座にエラーで失敗します。
No。True がデフォルト
プロセスアーカイブは、org.jbpm.jpdl.par.ProcessArchiveDeployer クラスの parseXXX の1つを使って、プログラムでデプロイできます。

14.1.2. プロセスバージョニング

プロセスインスタンスは常に起動されたプロセス定義に対して実行します。ただし、JBPM では同じ名前の複数のプロセス定義をデータベースで共存させることができます。したがって通常、プロセスインスタンスは、処理時点で最新の有効なバージョンで開始して、その全生存期間は同じプロセス定義で実行し続けます。より新しいバージョンがデプロイされると、古いプロセスインスタンスが古いバージョンのプロセス定義で実行され続けているのと並行して、新しく作成されたインスタンスは最新のバージョンで開始されます。
このプロセスに Java クラスへの参照が含まれている場合、以下の 2 種類の方法のいずれかで JBPM ランタイム環境にて使えるようにできます。
  • これらのクラスが JBPM クラスローダーで参照可能にすること
    参照できるようにするには、プロセス定義のすべてがクラスファイルを参照するように jbpm-[version].jar の隣にある .JAR ファイルに委譲クラスを置きます。また、 Java クラスはプロセスアーカイブにも含めることができます。プロセスアーカイブに委譲クラスを含めると (jbpm クラスローダーからは可視できません)、JBPM はプロセス定義内でこれらのクラスをバージョン管理します。

    注記

    プロセスのクラスローディングに関する詳細は、「委譲」を参照してください。
プロセスアーカイブがデプロイされると、JBPMデータベースにプロセス定義を作成します。プロセス定義はプロセス定義名を基本にバージョニングされます。名前がついたプロセスアーカイブがデプロイされると、デプロイヤーはバージョン番号を割り当てます。 この番号を割り当てるには、デプロイヤーは同名のプロセス定義の最も高いバージョン番号をルックアップして 1 を加えます (名前のないプロセス定義は、バージョン番号は、いつも -1 です)。

14.1.3. デプロイ済プロセス定義の変更

警告

デプロイ後にプロセス定義を変更するのは危険です。Red Hatはこのプロセスを推奨していません。プロセスインスタンスを新しい定義に移行してください。
このプロセスを実施する前に以下の項目を考慮してください。
  • org.jbpm.db.GraphSessionloadProcessDefinition メソッド、findProcessDefinition メソッドでロードされるか、関係付けによりロードされるプロセス定義を更新する際の制限はありません。にもかかわらず、setStartState(null) などの呼び出しでプロセスが非常に簡単に混乱してしまいます。
  • プロセス定義を変更すべきではないため、同梱の Hibernate 設定が定義クラスやコレクションの nonstrict-read-write キャッシュ戦略を指定します。この定義は、コミットされていない更新に関しても他のトランザクションで見えるようにできます。

14.1.4. プロセスインスタンスの移行

また、実行を新しいプロセス定義に変換してプロセス定義を変更する方法もあります。ビジネスプロセスの寿命は長いため、この操作は影響が大きいこと考慮してください。

注記

これは実験的な機能です。
プロセス定義データ、プロセスインスタンス(ランタイムデータ)と、ロギングデータの間に明確な違いがあります。この違いにより、JBPMデータベースで別のプロセス定義を (例えば、同じプロセスの新しいバージョンのデプロイによって) 作成し、ランタイムの情報は新しいプロセス定義に変換します (ここでは、旧プロセスのトークンが新しいバージョンで削除されたノードを参照している場合、変換が行われます)。そのため、データベースには新しいデータだけが追加されます。しかし、ひとつのプロセス実行は2つのプロセスインスタンスオブジェクトに広がります。ツールの開発や統計計算を行う場合、問題が生じる可能性があります。
プロセスインスタンスを新バージョンに移行するには、以下のように ChangeProcessInstanceVersionCommand を実行してください。
new ChangeProcessInstanceVersionCommand()
  .processName("commute")
  .nodeNameMappingAdd("drive to destination", "ride bike to destination")
  .execute(jbpmContext);