67.4. プロセスエンジンでの永続性の設定
永続性を設定せずにプロセスエンジンを使用する場合は、ランタイムデータをデータベースに保存しません。インメモリーデータベースはデフォルトで利用できません。パフォーマンス上の理由で必要な場合や永続性を独自に管理する場合に、このモードを使用できます。
プロセスエンジンで JPA 永続性を使用するには、これを設定する必要があります。
設定には、通常、必要な依存関係の追加、データソースの設定、および永続性が設定されたプロセスエンジンクラスの作成が必要になります。
67.4.1. persistence.xml ファイルの設定
JPA 永続性を使用するには、persistence.xml 永続性設定をクラスパスに追加して、Hibernate および H2 データベース (または任意の他のデータベース) を使用するように JPA を設定する必要があります。このファイルをプロジェクトの META-INF ディレクトリーに配置します。
persistence.xml サンプルファイル
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence
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"
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">
<persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/jbpm-ds</jta-data-source>
<mapping-file>META-INF/JBPMorm.xml</mapping-file>
<class>org.drools.persistence.info.SessionInfo</class>
<class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
<class>org.drools.persistence.info.WorkItemInfo</class>
<class>org.jbpm.persistence.correlation.CorrelationKeyInfo</class>
<class>org.jbpm.persistence.correlation.CorrelationPropertyInfo</class>
<class>org.jbpm.runtime.manager.impl.jpa.ContextMappingInfo</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<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.connection.release_mode" value="after_transaction"/>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/>
</properties>
</persistence-unit>
</persistence>
この例では jdbc/jbpm-ds データソースを参照します。データソースの設定方法については、「プロセスエンジンの永続性のデータソースの設定」を参照してください。
67.4.2. プロセスエンジンの永続性のデータソースの設定
プロセスエンジンで JPA 永続性を設定するには、データベースバックエンドを表すデータソースを指定する必要があります。
Red Hat JBoss EAP などのアプリケーションサーバーでアプリケーションを実行する場合、たとえば、データソース設定ファイルを deploy ディレクトリーに追加することで、アプリケーションサーバーを使用してデータソースを設定できます。データソースの作成方法は、アプリケーションサーバーのドキュメントを参照してください。
アプリケーションを Red Hat JBoss EAP にデプロイする場合は、deploy ディレクトリーに設定ファイルを作成してデータソースを作成できます。
Red Hat JBoss EAP のデータソース設定ファイルの例
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>jdbc/jbpm-ds</jndi-name>
<connection-url>jdbc:h2:tcp://localhost/~/test</connection-url>
<driver-class>org.h2.jdbcx.JdbcDataSource</driver-class>
<user-name>sa</user-name>
<password></password>
</local-tx-datasource>
</datasources>
アプリケーションがプレーンな Java 環境で実行される場合は、Red Hat Process Automation Manager が提供する kie-test-util モジュールの DataSourceFactory クラスを使用すると、Narayana および Tomcat DBCP を使用できます。以下のコードフラグメントを参照してください。この例では、Narayana および Tomcat DBCP と H2 インメモリーデータベースを使用します。
H2 インメモリーデータベースデータソースの設定コード例
Properties driverProperties = new Properties();
driverProperties.put("user", "sa");
driverProperties.put("password", "sa");
driverProperties.put("url", "jdbc:h2:mem:jbpm-db;MVCC=true");
driverProperties.put("driverClassName", "org.h2.Driver");
driverProperties.put("className", "org.h2.jdbcx.JdbcDataSource");
PoolingDataSourceWrapper pdsw = DataSourceFactory.setupPoolingDataSource("jdbc/jbpm-ds", driverProperties);
67.4.3. 永続性の依存関係
永続性には、特定の JAR アーティファクトの依存関係が必要です。
jbpm-persistence-jpa.jar ファイルが常に必要になります。このファイルには、必要に応じてランタイム状態を保存するコードが含まれます。
使用している永続ソリューションおよびデータベースによっては、追加の依存関係が必要になる場合があります。デフォルト設定の組み合わせには、以下のコンポーネントが含まれます。
- Hibernate を JPA 永続プロバイダーとする
- H2 インメモリーデータベース
- JTA ベースのトランザクション管理用の Narayana
- 接続プール機能用の Tomcat DBCP
この設定には、以下の追加の依存関係が必要です。
-
jbpm-persistence-jpa(org.jbpm) -
drools-persistence-jpa(org.drools) -
persistence-api(javax.persistence) -
hibernate-entitymanager(org.hibernate) -
hibernate-annotations(org.hibernate) -
hibernate-commons-annotations(org.hibernate) -
hibernate-core(org.hibernate) -
commons-collections(commons-collections) -
dom4j(org.dom4j) -
jta(javax.transaction) -
narayana-jta(org.jboss.narayana.jta) -
tomcat-dbcp(org.apache.tomcat) -
jboss-transaction-api_1.2_spec(org.jboss.spec.javax.transaction) -
javassist(javassist) -
slf4j-api(org.slf4j) -
slf4j-jdk14(org.slf4j) -
simple-jndi(simple-jndi) -
h2(com.h2database) -
jbpm-test(org.jbpm) はテスト専用で、実稼働アプリケーションにこのアーティファクトを含めないでください。
67.4.4. 永続性のある KIE セッションの作成
コードで KIE セッションを直接作成した場合は、JPAKnowledgeService クラスを使用して KIE セッションを作成できます。この方法では、基礎となる設定への完全アクセスが可能です。
手順
KIE ベース、KIE セ ッション設定 (必要な場合)、および環境に基づいて、
JPAKnowledgeServiceクラスを使用して KIE セッションを作成します。環境には、永続性に使用する Entity Manager Factory への参照が含まれている必要があります。永続性のある KIE セッションの作成
// create the entity manager factory and register it in the environment EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" ); Environment env = KnowledgeBaseFactory.newEnvironment(); env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf ); // create a new KIE session that uses JPA to store the runtime state StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env ); int sessionId = ksession.getId(); // invoke methods on your method here ksession.startProcess( "MyProcess" ); ksession.dispose();特定のセッション ID に基づいてデータベースからセッションを再作成するには、
JPAKnowledgeService.loadStatefulKnowledgeSession()メソッドを使用します。永続データベースからの KIE セッションの再作成
// re-create the session from database using the sessionId ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env );
67.4.5. ランタイムマネージャーの永続性
コードで RuntimeManager クラスを使用する場合は、RuntimeEnvironmentBuilder クラスを使用して永続性の環境を設定します。デフォルトでは、ランタイムマネージャーは org.jbpm.persistence.jpa 永続ユニットを検索します。
以下の例は、空のコンテキストで KieSession を作成します。
ランタイムマネージャーを使用した空のコンテキストでの KIE セッションの作成
RuntimeEnvironmentBuilder builder = RuntimeEnvironmentBuilder.Factory.get()
.newDefaultBuilder()
.knowledgeBase(kbase);
RuntimeManager manager = RuntimeManagerFactory.Factory.get()
.newSingletonRuntimeManager(builder.get(), "com.sample:example:1.0");
RuntimeEngine engine = manager.getRuntimeEngine(EmptyContext.get());
KieSession ksession = engine.getKieSession();
上の例では、kbase パラメーターとして KIE ベースが必要です。クラスパスで kmodule.xml KJAR 記述子を使用して、KIE ベースを設定できます。
KJAR 記述子 kmodule.xml からの KIE ベースの構築
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kbase = kContainer.getKieBase("kbase");
kmodule.xml 記述子ファイルには、スキャンしてプロセスエンジンのワークフローを検索およびデプロイするリソースパッケージの属性を含めることができます。
kmodule.xml 記述子ファイルのサンプル
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="kbase" packages="com.sample"/> </kmodule>
永続性を制御するには、RuntimeEnvironmentBuilder::entityManagerFactory メソッドを使用できます。
ランタイムマネージャーでの永続性の設定の制御
EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa");
RuntimeEnvironment runtimeEnv = RuntimeEnvironmentBuilder.Factory
.get()
.newDefaultBuilder()
.entityManagerFactory(emf)
.knowledgeBase(kbase)
.get();
StatefulKnowledgeSession ksession = (StatefulKnowledgeSession) RuntimeManagerFactory.Factory.get()
.newSingletonRuntimeManager(runtimeEnv)
.getRuntimeEngine(EmptyContext.get())
.getKieSession();
この例では、KIE セッション ksession を作成したら、ksession でメソッドを呼び出すことができます (例: StartProcess())。プロセスエンジンは、設定されたデータソースのランタイム状態を永続化します。
プロセスインスタンス ID を使用して永続ストレージからプロセスインスタンスを復元できます。ランタイムマネージャーが必要なセッションを自動的に再作成します。
プロセスインスタンス ID を使用した永続データベースからの KIE セッションの再作成
RuntimeEngine runtime = manager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId)); KieSession session = runtime.getKieSession();