第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 許容型

id

プライマリキー

Null 不可

lastModificationDate

エンティティがデータベースに最後に保存された時間

 

rulesByteArray

セッションのステータス

Null 不可

startDate

セッションの開始時間

 

OPTLOCK

ロック値を含むバージョンフィールド

 

20.3. プロセスインスタンス永続化エンティティ

プロセスインスタンスは、ProcessInstanceInfo エンティティとして維持されます。これはランタイムのプロセスインスタンスのステータスを維持し、以下のデータを保存します。

表20.2 ProcessInstanceInfo

フィールド説明Null 許容型

instanceId

プライマリキー

Null 不可

lastModificationDate

エンティティがデータベースに最後に保存された時間

 

lastReadDate

エンティティがデータベースから最後に取得された時間

 

processId

プロセス ID

 

processInstanceByteArray

バイナリデータセット形式のプロセスインスタンスのステータス

Null 不可

startDate

プロセスの開始時間

 

state

プロセスインスタンスのステータスを示す整数

Null 不可

OPTLOCK

ロック値を含むバージョンフィールド

 

ProcessInstanceInfo には 1:N の関係が EventTypes エンティティとあります。

EventTypes エンティティには以下のデータが含まれます。

表20.3 EventTypes

フィールド説明Null 許容型

instanceId

ProcessInstanceInfo プライマリキーおよびこのコラムの外部キー制約への参照

Null 不可

element

プロセスで終了したイベント

 

20.4. ワークアイテム永続エンティティ

ワークアイテムは workiteminfo エンティティとして維持され、ランタイムのワークアイテムインスタンスのステータスを維持し、以下のデータを保存します。

表20.4 WorkItemInfo

フィールド説明Null 許容型

workItemId

プライマリキー

Null 不可

name

ワークアイテムの名前

 

processInstanceId

プロセスの (プライマリキー) ID。このフィールドには外部キーの制約はありません。

Null 不可

state

ワークアイテムのステータス

Null 不可

OPTLOCK

ロック値を含むバージョンフィールド

 

workitembytearay

バイナリデータセットとしてのワークアイテムのステータス

Null 不可

20.5. 相関キーエンティティ

CorrelationKeyInfo エンティティには、プロセスインスタンスに割り当てられた相関キーについての情報が含まれます。以下のテーブルはオプションになります。相関機能が必要な場合にのみ、使用してください。

表20.5 CorrelationKeyInfo

フィールド説明Null 許容型

keyId

プライマリキー

Null 不可

name

割り当てられた相関キーの名前

 

processInstanceId

相関キーに割り当てられたプロセスインスタンスの ID

Null 不可

OPTLOCK

ロック値を含むバージョンフィールド

 

CorrelationPropertyInfo エンティティには、プロセスインスタンスに割り当てられた相関キーの相関プロパティーについての情報が含まれます。

表20.6 CorrelationPropertyInfo

フィールド説明Null 許容型

propertyId

プライマリキー

Null 不可

name

プロパティー名

 

value

プロパティーの値

Null 不可

OPTLOCK

ロック値を含むバージョンフィールド

 

correlationKey_keyId

相関キーにマッピングされた外部キー

Null 不可

20.6. コンテキストマッピングエンティティ

ContextMappingInfo エンティティには、KieSession にマッピングされたコンテキスト情報についての情報が含まれます。これは RuntimeManager の内部の部分となり、RuntimeManager を使用しない場合はオプションとなります。

表20.7 ContextMappingInfo

フィールド説明Null 許容型

mappingId

プライマリキー

Null 不可

CONTEXT_ID

コンテキスト識別子

Null 不可

KSESSION_ID

KieSession 識別子

Null 不可

OPTLOCK

ロック値を含むバージョンフィールド

 

OWNER_ID

マッピングが関連付けられているデプロイメントユニットの識別子

 

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
1
envorg.kie.api.runtime.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 設定とプロパティーの構成』を参照してください。

手順

  1. プロセス変数として使用するデータオブジェクトファイルで、以下の要素を追加して変数の永続性を設定します。

    変数を永続化するように設定した 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;
    	}
    
    }

    1
    データオブジェクトを永続エンティティーとして設定します。
    2
    データオブジェクトに使用するデータベーステーブル名を定義します。
    3
    このデータオブジェクトと関連のあるプロセスインスタンスの関係を管理する MappedVariable マッピングテーブルを別に作成します。関係の管理が必要ない場合は、VariableEntity クラスを継承する必要はありません。この継承がない場合には、データオブジェクトは永続化されますが、追加のデータは含まれません。
    4
    並列化可能なオブジェクトリストとしてデータオブジェクトを設定します。
    5
    オブジェクトの永続 ID を設定します。

    Business Central を使用して、データオブジェクトを永続化するには、プロジェクトのデータオブジェクトファイルに移動し、ウィンドウの右上隅の Persistence アイコンをクリックして、永続性の動作を設定します。

    図20.1 Business Central での永続性設定

    persistence in central
  2. プロジェクトの pom.xml ファイルで、永続性のサポートを提供するために、以下の依存関係を追加します。この依存関係には、データオブジェクトで設定した VariableEntity クラスが含まれます。

    永続性のプロジェクトの依存関係

    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-persistence-jpa</artifactId>
      <version>${rhpam.version}</version>
      <scope>provided</scope>
    </dependency>

  3. プロジェクトの ~/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>

  4. プロジェクトの ~/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 を使用してマーシャリングストラテジー、永続ユニット、データソースを設定するには、プロジェクトの SettingsDeploymentsMarshalling Strategies に移動し、プロジェクトの SettingsPersistence に移動します。

    図20.2 Business Central での JPA マーシャラー設定

    jpa marhsalling strategy

    図20.3 Business Central での永続ユニットとデータソース設定

    persistence unit