jBPM 4 の永続化を軽く調べてみたので、以下レポート。
■ やり方
start→first→second→end というプロセスを始動してデバッガでステップ実行しながら、データベースの中身をのぞいてみる事にする。
■ テストアプリ作成
こんな風にテストアプリを作った。
- まず maven-archetype-quickstart を使ってMaven Projectを作成。
- pom.xml の dependencies を以下のようにする
<dependencies>
<dependency>
<groupId>org.jbpm.jbpm4</groupId>
<artifactId>jbpm-jboss4</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
</dependencies>
リポジトリURLはhttp://repository.jboss.com/maven2 - 新規ソースフォルダ src/main/resource を作成し、ファイル test.jpdl.xml を置く。これがプロセス定義で、以下のような内容。
<?xml version="1.0" encoding="UTF-8"?>
<process name="test_sequence" xmlns="http://jbpm.org/4.0/jpdl">
<start>
<transition to="first" />
</start>
<state name="first">
<transition to="second" />
</state>
<state name="second">
<transition to="end" />
</state>
<end name="end"/>
</process>
- 同フォルダに、ファイルjbpm.cfg.xml を置く。
<?xml version="1.0" encoding="UTF-8"?>
<jbpm-configuration>
<import resource="jbpm.default.cfg.xml" />
<import resource="jbpm.jpdl.cfg.xml" />
<import resource="jbpm.tx.hibernate.cfg.xml" />
<import resource="jbpm.identity.cfg.xml" />
</jbpm-configuration>
- 同フォルダに、ファイル jbpm.hibernate.cfg.xml ファイルを置く。内容は以下のような感じで適当に。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/jbpm</property>
<property name="hibernate.connection.username"></property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.format_sql">true</property>
<mapping resource="jbpm.repository.hbm.xml" />
<mapping resource="jbpm.execution.hbm.xml" />
<mapping resource="jbpm.history.hbm.xml" />
<mapping resource="jbpm.task.hbm.xml" />
<mapping resource="jbpm.identity.hbm.xml" />
</session-factory>
</hibernate-configuration>
- 同フォルダに、ファイルlog4j.properties ファイルを置く。内容は適当。
# Set root logger level to DEBUG and its only appender to CONSOLE.
log4j.rootLogger=DEBUG, CONSOLE
# CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %C{1} : %m%n
# LIMIT CATEGORIES
log4j.logger.org.jbpm=DEBUG
log4j.logger.org.hibernate=INFO - 適当にクラスを作って以下のようにmain() を書く。
package net.xad.jbpm.trial2_db;
import org.jbpm.api.Configuration;
import org.jbpm.api.Execution;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
public class Test {
public static void main(String[] args) {
ProcessEngine engine = Configuration.getProcessEngine();
RepositoryService repositoryService = engine.get(RepositoryService.class);
ExecutionService executionService = engine.getExecutionService();
repositoryService.createDeployment()
.addResourceFromClasspath("test.jpdl.xml").deploy();
/*1*/ ProcessInstance instance = executionService
.startProcessInstanceByKey("test_sequence");
/*2*/ Execution first = instance.findActiveExecutionIn("first");
instance = executionService.signalExecutionById(first.getId());
/*3*/ Execution second = instance.findActiveExecutionIn("second");
instance = executionService.signalExecutionById(second.getId());
}
}
■ 実行してみる
main() の 1~3 の行に、ブレークポイントを設定してデバッグ実行。
(1)で停止した時点
test.jpdl.xml に記述されたプロセス定義がデータベースに登録された状態。
mysql> select * from jbpm4_deployment;
+-------+-------+------------+--------+
| DBID_ | NAME_ | TIMESTAMP_ | STATE_ |
+-------+-------+------------+--------+
| 1 | NULL | 0 | active |
+-------+-------+------------+--------+
1 row in set (0.00 sec)
mysql> select * from jbpm4_deployprop;
+-------+-------------+---------------+-----------+-----------------+----------+
| DBID_ | DEPLOYMENT_ | OBJNAME_ | KEY_ | STRINGVAL_ | LONGVAL_ |
+-------+-------------+---------------+-----------+-----------------+----------+
| 1 | 1 | test_sequence | pdkey | test_sequence | NULL |
| 2 | 1 | test_sequence | pdid | test_sequence-1 | NULL |
| 3 | 1 | test_sequence | pdversion | NULL | 1 |
+-------+-------------+---------------+-----------+-----------------+----------+
3 rows in set (0.00 sec)
ルールとその属性が DBに登録されているのがわかる。省略するが、jbpm4_lob をみると プロセス定義がXMLのまま登録されているのがわかる。
ここから先で見ていくテーブル、jbpm4_hist_procinst と jbpm4_hist_actinst はまだ空。
ちなみにデータベースが空の状態で実行しても、hibernate が勝手にテーブルを作ってくれる。
(2)で停止した時点
プロセスを開始すると startノードから勝手に最初の state である"first"に進み、そこでシグナルを待つ。
mysql> select START_, END_, STATE_ from jbpm4_hist_procinst;
+---------------------+------+--------+
| START_ | END_ | STATE_ |
+---------------------+------+--------+
| 2009-10-24 21:53:52 | NULL | active |
+---------------------+------+--------+
1 row in set (0.00 sec)
mysql> select ACTIVITY_NAME_, START_, END_ from jbpm4_hist_actinst;
+----------------+---------------------+------+
| ACTIVITY_NAME_ | START_ | END_ |
+----------------+---------------------+------+
| first | 2009-10-24 21:53:52 | NULL |
+----------------+---------------------+------+
1 row in set (0.00 sec)
(3)で停止した時点
first からsecond に進んで、jbpm4_hist_actinst が以下のように変化する。jbpm4_hist_procinst は無変化。
mysql> select ACTIVITY_NAME_, START_, END_ from jbpm4_hist_actinst;
+----------------+---------------------+---------------------+
| ACTIVITY_NAME_ | START_ | END_ |
+----------------+---------------------+---------------------+
| first | 2009-10-24 21:53:52 | 2009-10-24 21:55:19 |
| second | 2009-10-24 21:55:19 | NULL |
+----------------+---------------------+---------------------+
2 rows in set (0.00 sec)
(3) から継続した後
second から end に進んで、プロセス終了。テーブルは以下のように更新される。
mysql> select START_, END_, STATE_ from jbpm4_hist_procinst;
+---------------------+---------------------+--------+
| START_ | END_ | STATE_ |
+---------------------+---------------------+--------+
| 2009-10-24 21:53:52 | 2009-10-24 21:55:41 | ended |
+---------------------+---------------------+--------+
1 row in set (0.00 sec)
mysql> select ACTIVITY_NAME_, START_, END_ from jbpm4_hist_actinst;
+----------------+---------------------+---------------------+
| ACTIVITY_NAME_ | START_ | END_ |
+----------------+---------------------+---------------------+
| first | 2009-10-24 21:53:52 | 2009-10-24 21:55:19 |
| second | 2009-10-24 21:55:19 | 2009-10-24 21:55:41 |
+----------------+---------------------+---------------------+
2 rows in set (0.00 sec)