ラベル BPM の投稿を表示しています。 すべての投稿を表示
ラベル BPM の投稿を表示しています。 すべての投稿を表示

2009年11月11日水曜日

jBPM 4.1/workflowpattern/Discriminator

jBPM では、Discriminator パターンが直接サポートされていないので、ちょっと試作してみた。 Discriminator は Join の一種で、パラレルに分岐した実行経路のうちで、最初に 合流点に到達したものをすぐに後ろに通して、後から来たものは無視するワークフローパターンで、一言で言うと「早い者勝ち」といった感じ。 これを org.jbpm.jpdl.internal.activity.JoinActivity を参考にして、<custom> アクティビティで実装してみる。
  ┌→ activityA →→┐
  │         ↓
○→┼→ activityB → discriminator→activityD→ activityE
  │         ↑
  └→ activityC →→┘
上ののようなフローを定義して activityA を 実行すると、フローの先端が discriminator を通過して activityD に到達する。これが、ただの <join> だと、activityB,C が実行されるまで activityD には行かない。 続いてactivityB を実行すると、discriminatorに届いたところで経路が終わる(エラーにはならない)。ここで、discriminator を使わず、単に activityDに activityA,B,Cをつないでいるだけだと、activityD 上で AからのものとBからのものとで、実行経路が重複する事になる。 以下のようなコードでやってみた。 ※試作なので Session.lock() とか、プロセス定義の正当性チェックは、ここでは省略した。
package test.trial;

import static org.jbpm.api.Execution.STATE_ACTIVE_ROOT;
import java.util.List;
import java.util.Map;
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.api.activity.ExternalActivityBehaviour;
import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.Transition;

public class Discriminator implements ExternalActivityBehaviour {
   private static final long serialVersionUID = 1L;
   private static final String IS_SUCCEEDING = "__IS_SUCCEEDING__";

   @Override
   public void signal(ActivityExecution execution, String signalName,
         Map<String, ?> parameters) throws Exception {
      assert false;
   }

   @Override
   public void execute(ActivityExecution e) throws Exception {
      assert e instanceof ExecutionImpl; 
      execute((ExecutionImpl)e);
   }

   private void execute(ExecutionImpl exec) throws Exception {
      if (Boolean.TRUE.equals(exec.getVariable(IS_SUCCEEDING))) {
         exec.end();
         return;
      }
      exec.waitForSignal();

      ExecutionImpl root = exec.getParent();
      Activity activity = exec.getActivity();

      markSucceedingExecution(root, activity);

      root.setState(STATE_ACTIVE_ROOT);
      exec.setActivity(activity, root);

      Transition transition = activity.getDefaultOutgoingTransition();
      root.take(transition);
   }

   private void markSucceedingExecution(
         ExecutionImpl root, Activity activity) {
      for (ExecutionImpl concurrent : root.getExecutions()) {
         if (concurrent.getActivity() == activity) continue;
         concurrent.setVariable(IS_SUCCEEDING, true);
      }
   }
}
開始直後、activityA 実行直後、activityB 実行直後、activityD 実行直後の各段階で、それぞれのアクティビティ上の Execution の様子を調べてみたが、想定している部分についてはほぼ期待通り。(JUnit4 と mysql コンソールを使って、<task> と <state> で同じ事を試行。) ただし、上記コードだけだと、プロセス全体の終了(<end>到達)後にも activityC が未終了のまま残ってしまうらしいので、何か工夫が必要かも。 まとめると、本番で使うには以下の追加作業が必要になるか
  • 排他制御
  • プロセス定義のチェック
  • 取り残されたアクティビティをどうするかの決めと実装
これを応用したら、N-out-of-M Join (Partial Join)パターンとか、BPMNの Complex Gatewayなんかも、jBPM で 実装できそうな気がする。

2009年11月9日月曜日

JSF2.0/jBPM4.1/Maven2/WTP/Galileo

JSF2.0 と JBoss jBPM の併用。

Eclipse 3.5 上 で、WTP と m2eclipse を使ってやってみる。試しに、jBPM のプロセス定義をJSF 2.0の表で表示してみる。

■ 使用プロダクト

  • Eclipse 3.5 Galileo
  • Maven 2.2.1
  • WTP 3.1.1
  • MySQL 5.0.45
  • JSF 2.0.1
  • jBPM 4.1

■ プロジェクトの作成

  • 名前:jsf-jbpm2 で Dynamic Web Projectを作成。
  • プロジェクトのコンテキストメニューから [Maven]->[Enable Dependency Management]を実行
  • pom.xml の dependencies に以下を追記
    <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.10</version>
    </dependency>
    <dependency>
       <groupId>org.jbpm.jbpm4</groupId>
       <artifactId>jbpm-jboss4</artifactId>
       <version>4.1</version>
       <exclusions>
          <exclusion>
             <groupId>juel</groupId>
             <artifactId>juel</artifactId>
          </exclusion>
       </exclusions>
    </dependency>
    <dependency>
       <groupId>javax.faces</groupId>
       <artifactId>jsf-api</artifactId>
       <version>2.0.1-FCS</version>
    </dependency>
    <dependency>
       <groupId>javax.faces</groupId>
       <artifactId>jsf-impl</artifactId>
       <version>2.0.1-FCS</version>
    </dependency>
  • もし、なんかの jar が 無いとか言われたら repositories に、例えば以下の URL とかを追加するといいかもしれない。ダメかもしれない。 http://repository.jboss.com/maven2/
  • プロジェクトの Properties の[Java EE Module Dependencies] で、Maven Dependencies にチェックを入れる

■ JSF 2.0 の確認

  • Servers ビューで jsf-jbpm2 プロジェクトを追加する
  • WebContent 直下に以下の test.xhtml を置く
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:h="http://java.sun.com/jsf/html">
    <h:body>
       <h:outputLabel for="text1">
          <h:outputText id="text1" value="Hello, World!" />
       </h:outputLabel>
    </h:body>
    </html>
    
  • Servers ビューから Tomcat v6.0 を起動する
  • 適当なブラウザで、http://localhost:8080/jsf-jbpm2/test.faces を見てみる
  • ”Hello, World!”が表示されて、ソースにも怪しいところが無ければ成功。
■ jBPMの確認

※ 以下、すでにプロセス定義がいくつか登録されている前提

  • ソースフォルダ resources を新規作成する
  • resources 下で、以下のファイルを作成する
    • 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 (MySQL サービスが立ち上がっている前提。データベースは適当でOK。)
      <?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">verify</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 を適当に書く
      log4j.rootLogger=DEBUG, 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
      log4j.logger.org.jbpm=DEBUG
      log4j.logger.org.hibernate=INFO
      
  • ソースフォルダ src を新規作成する
  • 以下のクラスを src 下に作成する
    package mypackage;
    
    import 略
    
    @ManagedBean(name="definitionList")
    public class ProcessDefinitions {
       public List<ProcessDefinition> getItems() {
          ProcessEngine engine = Configuration.getProcessEngine();
          RepositoryService rs = engine.get(RepositoryService.class);
    
          return rs.createProcessDefinitionQuery().list();
       }
    }
  • resources 下に以下のようにmessages.properties を作成する
    idLabel=ID
    keyLabel=KEY
    nameLabel=NAME
    versionLabel=VERSION
    
  • WebContent 下に、以下のようにprocessDefinitions.xhtmlを作成する。
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
       <title>rules</title>
       <style>
       .list-background{border-collapse:collapse;border:1px solid grey;}
       .list-header{background-color:Plum;border:1px solid grey;width:96px;}
       .col-center{border-right:1px solid grey;}
       .row-odd{background-color:moccasin;}
       .row-even{background-color:mistyRose;}
       </style>
    </h:head>
    <h:body>
       <f:loadBundle basename="messages" var="msg" />
       <h:dataTable id="processDefinitionList"
          columnClasses="col-center,col-center,col-center"
          headerClass="list-header" rowClasses="row-odd,row-even"
          styleClass="list-background" value="#{definitionList.items}" 
          var="definition"
          cellpadding="0"
          cellspacing="0">
          <h:column>
             <f:facet name="header">#{msg.idLabel}</f:facet>
             #{definition.id}
          </h:column>
          <h:column>
             <f:facet name="header">#{msg.keyLabel}</f:facet>
             #{definition.key}
          </h:column>
          <h:column>
             <f:facet name="header">#{msg.nameLabel}</f:facet>
             #{definition.name}
          </h:column>
          <h:column>
             <f:facet name="header">#{msg.versionLabel}</f:facet>
             #{definition.version}
          </h:column>
       </h:dataTable>
    </h:body>
    </html>
    

・以下のように内容が表示されれば、JSF と jBPM の両方がちゃんと使えてる事になる。

2009年11月7日土曜日

workflow patterns 2

ワークフローパターンのサイトに載っているパターンと各プロダクトの対応表から、jBPM と BPMN の部分を抜き出してまとめた。今、jBPM は 4.xで、BPMN は1.2だから、両方ともちょっと古いけど、今後、ワークフロー(BPMの意味で)関連の製品を開発する事になったとき、自社・自チームの製品がどの程度までのパターンをサポートしていて、他の仕様・製品と比べて充分なのか、あるいは物足りないのか判断する資料にはなるはず。
番号パターン名jBPM
3.1.4
BPMN
1.0
Basic Control Flow Patterns
1.Sequence
2.Parallel Split
3.Synchronization
4.Exclusive Choice
5.Simple Merge
Advanced Branching and Synchronization Patterns
6.Multi-Choice×
7.Structured Synchronizing Merge×
8.Multi-Merge
9.Structured Discriminator×
28.Blocking Discriminator×
29.Cancelling Discriminator×
30.Structured Partial Join×
31.Blocking Partial Join×
32.Cancelling Partial Join×
33.Generalised AND-Join
37.Local Synchronizing Merge××
38.General Synchronizing Merge××
41.Thread Merge
42.Thread Split
Multiple Instance Patterns
12.MI without Synchronization
13.MI with a Priori Design-Time Knowledge×
14.MI with a Priori Run-Time Knowledge×
15.MI without a Priori Run-Time Knowledge××
34.Static Partial Join for MI×
35.Cancelling Partial Join for MI×
36.Dynamic Partial Join for MI××
State-based Patterns
16.Deferred Choice
17.Interleaved Parallel Routing××
18.Milestone××
39.Critical Section××
40.Interleaved Routing×
Cancellation and Force Completion Patterns
19.Cancel Task
20.Cancel Case×
25.Cancel Region
26.Cancel Multiple Instance Activity×
27.Complete Multiple Instance Activity××
Iteration Patterns
10.Arbitrary Cycles
21.Structured Loop×
22.Recursion××
Termination Patterns
11.Implicit Termination
43.Explicit Termination×
Trigger Patterns
23.Transient Trigger×
24.Persistent Trigger×

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)

2009年8月13日木曜日

Business Rule の調査を始めてみる

OCEB で参考資料として指定されている Business Rule の資料はネットで無料で見られる資料がなく、高そうな洋書ばかり。ちょっと面倒くさい。

ちなみに、こんなのが記載されている。
いちいち、これら全部を取り寄せても費用対効果が芳しくないので、極力ネットで調べることにする。もう Wikipedia でも何でも良い。

早速 Wikipedia の Business Rule を見ると、「Business Rules Group」 という団体が出している資料へのリンクがある。どういう団体かと思ってメンバーを見てみると、上述の 3冊の参考文献のうち 2冊の著者の Ron Ross と言う名前がある。とすると Business Rules Group が出している Business Rule 関連の論文は、OCEB 試験の資料として役立ちそうな気配がしてくる。

関係ないが、メンバーの中に David Hay という名前もある。いわずと知れた「Data Model Patterns: Conventions of Thought」の著者だが、ちょっと意外なところで意外な名前を見た気がする。まあでも Business Rule と Data Model は、意味論と統語論のような表裏一体のもと考えられないでもなく、理論家がこの両面からのアプローチでモデルをさらに十全したくなるなるのもなんとなく分かる。

さらに調べてみると、今は OMG の仕様になっている SBVR も BMMも、もともとはこのBusiness Rules Group の成果物だったらしい。やはり OMG と親和性の高い団体なのだろう。

Business Rule を調べる上で、以下の資料をとりあえずの足がかりとすることにした。
Business Rule@wikipedia
Business Rules Approach@wikipedia
Defining Business Rules ~ What Are They Really?
The Business Rules Manifesto

あと試験範囲には含まれていないが SBVR もチェックしておこう。どうせ Technical Intermediate では指定されているし。

2009年7月25日土曜日

ワークフローパターン 1

BPMN 1.1 仕様の10.2節から、ワークフローパターンに関連する記述が始まる。
ただし、ここで使用されているパターン名は、2003年辺りの古いパターンカタログに基づいていて、最新版のカタログとは少し違いがある。違いについて調べておいたので、以下にまとめておく。

10.2.1 Normal Flow
  • #1:Sequence :変わりなし

10.2.1.1 Forking Flow
  • #2:Parallel Split :変わりなし。
    (メモ) BPMN では、"uncontrolled flow"、"forking gateway"、"parallel box"を使った、三つのバリエーションを紹介。

10.2.1.2 Joining Flow
  • #3:Synchronization :変わりなし
    (メモ) BPMN では、Parallel Gatewayと"parallel box"を使った、二つのバリエーションを紹介。

10.2.1.3 Splitting Flow
  • #4:Exclusive Choice :変わりなし
  • #6:Multiple-Choice → #6:Multi Choice
    (メモ) BPMN では、アクティビティから直接条件付フローを出すのと、Inclusive Gatewayを使うのと、二つのパターンを紹介。

10.2.1.4 Merging Flow
  • #5 Simple Merge :変わりなし
    (メモ) BPMN では、"uncontrolled flow"と"Merging Gateway"を使う二つのパターンを紹介。
  • #7 Multiple Merge → #8 Multi-Merge
    (メモ) WCPサイトのFlashを見ると、凄く分かりやすい。
  • #8 Discriminator → #9 Structured Discriminator
    (メモ) 今のカタログには単なる"Discriminator"はなくて、"Structured Discriminator"、"Blocking Discriminator"、"Cancelling Discriminator"の三つが載っている。"1-out-of-M join"という別名が紹介されている"Structured Discriminator"が、もとのDiscriminatorに近いのだと思う。
    ちなみに カタログをみるとBPMN1.0での対応は不完全とされている。BPMN 1.1との違いを再確認する必要があるかも知れない。
  • #9 Synchronizing Join → #7:Structured Synchronizing Merge
    (メモ) カタログに別名として"Synchronizing Join"と記述があるから、この対応だろう。
  • #8 N out of M Join → #30 Structured Partial Join
    (メモ) カタログから、"N out of M Join"というパターン名が消えている。現在のパターンでは、多分これが相当する。結構、印象に残るパターン名だったんだが・・・

10.2.1.7 Sequence Flow Looping
  • #10 Arbitrary Cycles → #16 Arbitrary Cycle
    (メモ) パターン番号と名詞の単複が違うだけだろう。

2009年6月16日火曜日

BPM 関連記事 1

◆ IBMの協力で新サービス開発
6週間でSOA導入の費用対効果を分析、ユーフィット


SOAを導入したら、費用対効果がどうなるかを調べてくれるというサービスらしい。IBM WebSphere Business Modeler を使うらしいが、IBM のSOA資格の試験でも、このツールに関する問題がいくつか出ていたような気がする。

ユーフィットという会社は初耳だが、名古屋に本社があるTIS の子会社らしい。会社のサイトを見ると、SOA やBPMにも割りと力を入れているような雰囲気。 やはりSOA の基盤には WebSphere ESB なんかを使ってたりするのだろうか。

SOA対応システムコンサルティング」のページで「企業におけるシステム最適化レベル」という図があるが、こういうのは SIMM のような既知の標準モデルを用いた方が良いと思う。

◆ アプリケーション構築、Workflowの利用法
David Chapell が書いた Workflow に関する記事の紹介。技術的には.NET ベース。一枚板のアプリケーション、リクエスト/レスポンス型のアプリケーションと対比して、ワークフローベースのアプリケーションの利点を述べている。

David Chapell は「エンタープライズサービスバス」の著者。僕も含めて、ESB に興味がある人は結構読んでいると思う。内容もさることながら、初めて読んだとき、この本で用いられているグレゴールグラムというサービスの表記法が面白くて、元になった「Enterprise Integration Patterns」という本も買ってしまった。こちらの方は、分厚くて一気に読むのは難しいけど、必要に応じてカタログとして使えるタイプの本。