第4章 永続性

本章は、JBoss Business Process Manager永続性機能について詳細に説明していますのでご参照ください。
多くの場合、JBPM は複数のトランザクションにわたるプロセスを実行するために使用されます。永続性機能の主な目的は、待機状態が発生した時にプロセス実行を保存することです。 プロセス実行を状態マシンとして考えると分かりやすいはずです。1 つのトランザクション中で、プロセス実行状態のマシンを別の状態に移動させることが目的です。
プロセス定義は、XML、Java オブジェクト、JBPM データベースレコードの 3 つの異なる形式で表現することができます (ランタイムデータとログ情報は Java オブジェクトか JBPM データベースレコードで表現することができます)。

注記

プロセス定義とプロセスアーカイブの XML 表記についての詳細は、 14章JBPM プロセス定義言語 を参照してください。

注記

データベースにプロセスアーカイブをデプロイする方法の詳細については、 「プロセスアーカイブのデプロイ」 を参照してください。

4.1. 永続性アプリケーションプログラミングインターフェース

4.1.1. 設定フレームワークとの関係

永続性 API は設定フレームワークと統合されます (3章設定 参照)。 統合するには、JbpmContext にある convenience persistence メソッドの一部を公開し、JBPM context block が永続 API 操作を呼び出せるようにします。
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
  // Invoke persistence operations here
} finally {
  jbpmContext.close();
}

4.1.2. JbpmContext の便利なメソッド

最も頻繁に実行される永続操作は次の 3 つになります。
  1. プロセスのデプロイ
  2. 新規プロセスの実行開始
  3. プロセス実行の継続
プロセスデプロイメントは通常 Graphical Process Designerdeployprocessant タスクによって直接実行されます。Java から直接実行するには、次のコードを使用します。
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
  ProcessDefinition processDefinition = ...;
  jbpmContext.deployProcessDefinition(processDefinition);
} finally {
  jbpmContext.close();
}
インスタンスとなるプロセス定義を指定して新しいプロセス実行を作成します。最も一般的な方法は、プロセス名を参照する方法です。JBPM はデーターベースにあるプロセスの最新バージョンを検索します。デモコードは次の通りです。
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
	String processName = ...;
	ProcessInstance processInstance = 
		jbpmContext.newProcessInstance(processName);
} finally {
	jbpmContext.close();
}
プロセス実行を継続するには、プロセスインスタンス、トークン、taskInstance のいずれかをデータベースより取得し、JBPM POJO (Plain Old Java Object) 上でメソッドを呼び出します。その後、processInstance への更新をデータベースに保存します。
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
	long processInstanceId = ...;
	ProcessInstance processInstance = 
		jbpmContext.loadProcessInstance(processInstanceId);
		processInstance.signal();
		jbpmContext.save(processInstance);
} finally {
	jbpmContext.close();
}

注記

JbpmContext クラスで ForUpdate メソッドが使用される場合、jbpmContext.save メソッドを手動で呼び出す必要はありません。これは、jbpmContext クラスが閉じられると保存プロセスが自動的に実行されるからです。例えば、taskInstance が終了したことを JBPM に伝えたいとします。これにより実行が継続されるため、taskInstance に関連する processInstance を保存しなければなりません。loadTaskInstanceForUpdate メソッドを使用する方法が最も便利です。
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
	long taskInstanceId = ...;
	TaskInstance taskInstance = 
		jbpmContext.loadTaskInstanceForUpdate(taskInstanceId);
	taskInstance.end();
	} 
finally {
		jbpmContext.close();
}

重要

JbpmConfigurationServiceFactories のセットを維持します。ServiceFactoriesjbpm.cfg.xml ファイルを使い設定され、必要な時にインスタンス化されます。
DbPersistenceServiceFactory は最初に必要となった時のみインスタンス化されます。 その後、 ServiceFactoryJbpmConfiguration で維持されます。
DbPersistenceServiceFactoryHibernateServiceFactory を管理しますが、 最初に要求があった時のみインスタンス化されます。

注記

jbpmConfiguration.createJbpmContext() クラスが呼び出されると、JbpmContext のみが作成されます。この時点では永続性に関連する初期化はこれ以上発生しません。JbpmContext は、最初に要求があった時にインスタンス化される DbPersistenceService を管理します。DbPersistenceService クラスは、最初に必要になった時のみインスタンス化される Hibernate を管理します (永続性を必要とする最初の操作が呼び出された時のみ Hibernate セッションが開きます)。
永続性に関連するクラス

図4.1 永続性に関連するクラス