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)
0 件のコメント:
コメントを投稿