第20章 永続性
バイナリの永続性、もしくはマーシャリングは、プロセスインスタンスのステータスをバイナリのデータセットに変換することです。バイナリの永続性とは、情報を永続的に保存、取得する際に使用するメカニズムです。同じメカニズムがセッションステータスや作業アイテムのステータスにも適用されています。
プロセスインスタンスの永続性を有効にすると、以下のようになります。
- Red Hat Process Automation Manager はプロセスインスタンス情報をバイナリデータに変換します。パフォーマンスの理由から、Java の直列化ではなくカスタムの直列化が使用されます。
- バイナリデータはプロセスインスタンスに関する他のメタデータと併せて保存されます。このメタデータには、プロセスインスタンス ID、プロセス ID、プロセスの開始日が含まれます。
セッションは、タイマージョブのステータスなどの他の形式を保存することも可能です。また、セッションはビジネスルールの評価に必要なデータも保存することができます。このセッションのステータスは、セッション ID やメタデータの一部とともにバイナリデータセットとして別途保存されています。セッションステータスは、指定の ID でセッションをリロードすることで復元できます。セッション ID は、ksession.getId()
を使用して取得します。
永続性が設定されていれば、Red Hat Process Automation Manager は以下を維持します。
- Session state: セッション ID、最終変更日、ビジネスルールによる評価に必要なセッションデータ、タイマージョブのステータス。
- Process instance state: プロセスインスタンス ID、プロセス ID、最終変更日、最終読み取りアクセス日、プロセスインスタンスの開始日、ランタイムデータ (実行されているノード、変数値、他のプロセスインスタンスデータを含む実行ステータス)、およびイベントタイプ。
- Work item runtime state: ワークアイテム ID、作成日、名前、プロセスインスタンス ID、およびワークアイテムステータス。
永続化したデータを基に、障害発生時にはすべての実行中のプロセスインスタンスの実行ステータスを復元したり、メモリーから実行中のインスタンスを一時的に削除し、それらを後で復元することができます。
20.1. セーフポイントの設定
永続化を有効にするには、jbpm-persistence
JAR ファイルをアプリケーションのクラスパスに追加し、プロセスエンジンが永続化を使用するように設定します。プロセスエンジンはセーフポイントに到達すると、自動的にランタイムステータスをストレージに保存します。
セーフポイントとは、プロセスインスタンスが一時停止するポイントです。プロセスエンジンでプロセスインスタンスがセーフポイントに到達すると、プロセスエンジンはプロセスインスタンスの変更をプロセスランタイムデータのスナップショットとして保存します。ただし、プロセスインスタンスが完了すると、永続化されたプロセスインスタンスランタイムデータのスナップショットは自動的に削除されます。
障害が発生し、ストレージからプロセスエンジンのランタイムを復元する必要がある場合は、プロセスインスタンスは自動的に復元され、それらの実行が再開されるので、手動でプロセスインスタンスをリロードしたり、開始したりする必要はありません。
ランタイムの永続データはプロセスエンジン内部のものとみなされます。永続ランタイムデータにアクセスしたり、直接変更しないでください。予期しない結果がもたらされる可能性があります。
現在の実行ステータスについての詳細は、履歴ログを確認してください。本当に必要な場合にのみ、ランタイムデータのデータベースにクエリーしてください。
20.2. セッション永続化エンティティ
セッションは、SessionInfo
エンティティとして維持されます。これらはランタイム KIE セッションのステータスを維持し、以下のデータを保存します。
表20.1 SessionInfo
フィールド | 説明 | Null 許容型 |
---|---|---|
|
プライマリキー |
Null 不可 |
|
エンティティがデータベースに最後に保存された時間 | |
|
セッションのステータス |
Null 不可 |
|
セッションの開始時間 | |
|
ロック値を含むバージョンフィールド |
20.3. プロセスインスタンス永続化エンティティ
プロセスインスタンスは、ProcessInstanceInfo
エンティティとして維持されます。これはランタイムのプロセスインスタンスのステータスを維持し、以下のデータを保存します。
表20.2 ProcessInstanceInfo
フィールド | 説明 | Null 許容型 |
---|---|---|
|
プライマリキー |
Null 不可 |
|
エンティティがデータベースに最後に保存された時間 | |
|
エンティティがデータベースから最後に取得された時間 | |
|
プロセス ID | |
|
バイナリデータセット形式のプロセスインスタンスのステータス |
Null 不可 |
|
プロセスの開始時間 | |
|
プロセスインスタンスのステータスを示す整数 |
Null 不可 |
|
ロック値を含むバージョンフィールド |
ProcessInstanceInfo
には 1:N の関係が EventTypes
エンティティとあります。
EventTypes
エンティティには以下のデータが含まれます。
表20.3 EventTypes
フィールド | 説明 | Null 許容型 |
---|---|---|
|
|
Null 不可 |
|
プロセスで終了したイベント |
20.4. ワークアイテム永続エンティティ
ワークアイテムは workiteminfo
エンティティとして維持され、ランタイムのワークアイテムインスタンスのステータスを維持し、以下のデータを保存します。
表20.4 WorkItemInfo
フィールド | 説明 | Null 許容型 |
---|---|---|
|
プライマリキー |
Null 不可 |
|
ワークアイテムの名前 | |
|
プロセスの (プライマリキー) ID。このフィールドには外部キーの制約はありません。 |
Null 不可 |
|
ワークアイテムのステータス |
Null 不可 |
|
ロック値を含むバージョンフィールド | |
|
バイナリデータセットとしてのワークアイテムのステータス |
Null 不可 |
20.5. 相関キーエンティティ
CorrelationKeyInfo
エンティティには、プロセスインスタンスに割り当てられた相関キーについての情報が含まれます。以下のテーブルはオプションになります。相関機能が必要な場合にのみ、使用してください。
表20.5 CorrelationKeyInfo
フィールド | 説明 | Null 許容型 |
---|---|---|
|
プライマリキー |
Null 不可 |
|
割り当てられた相関キーの名前 | |
|
相関キーに割り当てられたプロセスインスタンスの ID |
Null 不可 |
|
ロック値を含むバージョンフィールド |
CorrelationPropertyInfo
エンティティには、プロセスインスタンスに割り当てられた相関キーの相関プロパティーについての情報が含まれます。
表20.6 CorrelationPropertyInfo
フィールド | 説明 | Null 許容型 |
---|---|---|
|
プライマリキー |
Null 不可 |
|
プロパティー名 | |
|
プロパティーの値 |
Null 不可 |
|
ロック値を含むバージョンフィールド | |
|
相関キーにマッピングされた外部キー |
Null 不可 |
20.6. コンテキストマッピングエンティティ
ContextMappingInfo
エンティティには、KieSession
にマッピングされたコンテキスト情報についての情報が含まれます。これは RuntimeManager
の内部の部分となり、RuntimeManager
を使用しない場合はオプションとなります。
表20.7 ContextMappingInfo
フィールド | 説明 | Null 許容型 |
---|---|---|
|
プライマリキー |
Null 不可 |
|
コンテキスト識別子 |
Null 不可 |
|
|
Null 不可 |
|
ロック値を含むバージョンフィールド | |
|
マッピングが関連付けられているデプロイメントユニットの識別子 |
20.7. Pessimistic ロックのサポート
プロセスの永続性に関するデフォルトのロックメカニズムは、optimistic です。同一プロセスインスタンスにマルチスレッドの同時実行が行われると、このロック戦略はパフォーマンスに悪影響を与えます。
これについては、プロセスベースでユーザーがロックをランタイムで設定できるように変更可能で、pessimistic (この変更はプロセスレベルだけでなく、KIE Session レベルやランタイムマネジャーレベルでも可能です) にします。
プロセスが pessimistic ロックを使用するようにするには、ランタイム環境で以下の設定を使用します。
import org.kie.api.runtime.Environment; import org.kie.api.runtime.EnvironmentName; import org.kie.api.runtime.manager.RuntimeManager; import org.kie.api.runtime.manager.RuntimeManagerFactory; ... env.set(EnvironmentName.USE_PESSIMISTIC_LOCKING, true); 1 RuntimeManager manager = RuntimeManagerFactory.Factory.get().newPerRequestRuntimeManager(environment); 2
20.8. Red Hat Process Automation Manager の個別のデータベーススキーマにおけるプロセス変数の永続化
Red Hat Process Automation Manager でプロセス変数を作成して、定義したプロセス内で使用する場合に、Red Hat Process Automation Manager はこれらのプロセス変数を、デフォルトのデータベーススキーマにバイナリーデータとして保存します。別のデータベーススキーマでプロセス変数を永続化して、プロセスデータの管理と実装に柔軟性をもたせることができます。
たとえば、別のデータベーススキーマで、プロセス変数を永続化すると、以下のタスクを行うのに役立ちます。
- 人間が解読可能な形式でのプロセス変数を管理する
- Red Hat Process Automation Manager 外のサービスに対して変数を使用可能にする
- プロセス変数データを損失せずに Red Hat Process Automation Manager のデフォルトのデータベーステーブルのログを消去する
以下の手順は、プロセス変数にのみ適用され、ケース変数には適用されません。
前提条件
- 変数の実装先の Red Hat Process Automation Manager でプロセスを定義しておくこと。
- Red Hat Process Automation Manager 外部のデータベーススキーマで変数を永続化する場合には、データソースと、使用するデータベーススキーマを別に作成しておくこと。データソース作成の詳細は、『Business Central 設定とプロパティーの構成』を参照してください。
手順
プロセス変数として使用するデータオブジェクトファイルで、以下の要素を追加して変数の永続性を設定します。
変数を永続化するように設定した Person.java オブジェクトの例
@javax.persistence.Entity 1 @javax.persistence.Table(name = "Person") 2 public class Person extends org.drools.persistence.jpa.marshaller.VariableEntity 3 implements java.io.Serializable { 4 static final long serialVersionUID = 1L; @javax.persistence.GeneratedValue(strategy = javax.persistence.GenerationType.AUTO, generator = "PERSON_ID_GENERATOR") @javax.persistence.Id 5 @javax.persistence.SequenceGenerator(name = "PERSON_ID_GENERATOR", sequenceName = "PERSON_ID_SEQ") private java.lang.Long id; private java.lang.String name; private java.lang.Integer age; public Person() { } public java.lang.Long getId() { return this.id; } public void setId(java.lang.Long id) { this.id = id; } public java.lang.String getName() { return this.name; } public void setName(java.lang.String name) { this.name = name; } public java.lang.Integer getAge() { return this.age; } public void setAge(java.lang.Integer age) { this.age = age; } public Person(java.lang.Long id, java.lang.String name, java.lang.Integer age) { this.id = id; this.name = name; this.age = age; } }
Business Central を使用して、データオブジェクトを永続化するには、プロジェクトのデータオブジェクトファイルに移動し、ウィンドウの右上隅の Persistence アイコンをクリックして、永続性の動作を設定します。
図20.1 Business Central での永続性設定
プロジェクトの
pom.xml
ファイルで、永続性のサポートを提供するために、以下の依存関係を追加します。この依存関係には、データオブジェクトで設定したVariableEntity
クラスが含まれます。永続性のプロジェクトの依存関係
<dependency> <groupId>org.drools</groupId> <artifactId>drools-persistence-jpa</artifactId> <version>${rhpam.version}</version> <scope>provided</scope> </dependency>
プロジェクトの
~/META-INF/kie-deployment-descriptor.xml
ファイルで、JPA マーシャリングストラテジーと、マーシャラーで使用する永続ユニットを設定します。オブジェクトをエンティティーとして定義するには、JPA マーシャリングストラテジーと永続ユニットが必要です。kie-deployment-descriptor.xml ファイルで設定する JPA マーシャラーと永続ユニット
<marshalling-strategy> <resolver>mvel</resolver> <identifier>new org.drools.persistence.jpa.marshaller.JPAPlaceholderResolverStrategy("myPersistenceUnit", classLoader)</identifier> <parameters/> </marshalling-strategy>
プロジェクトの
~/META-INF
ディレクトリーで、persistence.xml
ファイルを作成し、プロセス変数を永続化するデータソースを指定します。データソース設定を含む persistence.xml ファイル
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"> <persistence-unit name="myPersistenceUnit" transaction-type="JTA"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> 1 <class>org.space.example.Person</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> <property name="hibernate.max_fetch_depth" value="3"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.id.new_generator_mappings" value="false"/> <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/> </properties> </persistence-unit> </persistence>
- 1
- データソースを設定して、プロセス変数を永続化します。
Business Central を使用してマーシャリングストラテジー、永続ユニット、データソースを設定するには、プロジェクトの Settings → Deployments → Marshalling Strategies に移動し、プロジェクトの Settings → Persistence に移動します。
図20.2 Business Central での JPA マーシャラー設定
図20.3 Business Central での永続ユニットとデータソース設定