2009年10月24日土曜日

jBPM4 の永続化

jBPM 4 の永続化を軽く調べてみたので、以下レポート。

■ やり方

start→first→second→end というプロセスを始動してデバッガでステップ実行しながら、データベースの中身をのぞいてみる事にする。

■ テストアプリ作成

こんな風にテストアプリを作った。

  1. まず maven-archetype-quickstart を使ってMaven Projectを作成。
  2. 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
  3. 新規ソースフォルダ 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>
    
  4. 同フォルダに、ファイル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>
    
  5. 同フォルダに、ファイル 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>
    
  6. 同フォルダに、ファイル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
  7. 適当にクラスを作って以下のように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 件のコメント:

コメントを投稿