JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component
by user
Comments
Transcript
JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component
JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイ ド ビジネスルールの開発者向け エディッション 5.2.0 Red Hat Inc. JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド ビジネスルールの開発者向け エディッション 5.2.0 Red Hat Inc. 編集者 David Le Sage (製品版) Red Hat Engineering Co ntent Services 法律上の通知 Copyright © 2011 Red Hat. T his document is licensed by Red Hat under the Creative Commons Attribution-ShareAlike 3.0 Unported License. If you distribute this document, or a modified version of it, you must provide attribution to Red Hat, Inc. and provide a link to the original. If the document is modified, all Red Hat trademarks must be removed. Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law. Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, MetaMatrix, Fedora, the Infinity Logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries. Linux ® is the registered trademark of Linus T orvalds in the United States and other countries. Java ® is a registered trademark of Oracle and/or its affiliates. XFS ® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries. MySQL ® is a registered trademark of MySQL AB in the United States, the European Union and other countries. Node.js ® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project. T he OpenStack ® Word Mark and OpenStack Logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community. All other trademarks are the property of their respective owners. 概要 JBoss Enterprise BRMS Platformの Rule Flow Component を使用しビジネスルールの開発やサービスオー ケストレーションのタスクを行う方法については、本ガイドを参照してください。 目次 目次 .序文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . . . . . . 1. 本書の表記規則 4 1.1. 書体の表記規則 4 1.2. 引用文の表記規則 5 1.3. 注記および警告 6 2. サポート、およびフィードバックのお願い 6 2.1. サポートが必要ですか? 6 2.2. フィードバックをお願いします 7 . . .1章 第 . . . .はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8. . . . . . . . . . . . .2章 第 . . . .初めて . . . . . . .Rule . . . . .Flow . . . . .を利用する場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9. . . . . . . . . . 2.1. 最初のプロセスの作成 9 2.2. 最初のプロセスの実行 11 . . .3章 第 . . . ルールフロー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 ............ 3.1. ルールフロープロセスの作成 14 3.1.1. グラフィックの Rule Flow Editor を利用 14 3.1.2. XMLでプロセス定義 15 3.1.3. プロセスAPIを使ったプロセス定義 15 3.1.3.1. 例1 16 3.1.3.2. 例2 17 3.1.3.3. 例3 17 3.2. 利用中のアプリケーションでプロセスを利用 18 3.3. 利用可能なノード型 19 3.3.1. Start Event 20 3.3.2. End Event 20 3.3.3. Rule T ask (あるいは RuleFlowGroup) 21 3.3.4. Diverging Gateway (あるいは Split) 21 3.3.5. Converging Gateway (あるいは Join) 22 3.3.6. State 22 3.3.7. Reusable Sub-Process (あるいは SubFlow) 23 3.3.8. Action (あるいは Script T ask) 24 3.3.9. T imer Event 24 3.3.10. Error Event (あるいは Fault) 24 3.3.11. (Message) Event 25 3.3.12. Sub-Process (あるいは Composite) 25 3.3.13. Multiple Instance (あるいは ForEach) 26 3.4. データ 26 3.5. 制約 27 3.6. アクション 28 3.7. イベント 28 3.8. 例外 29 3.9. タイマー 30 3.10. ルールフローのアップデート 31 3.10.1. ルールフローインスタンスの移行 31 3.11. ルールをルールフローグループに割り当て 32 3.12. ルールフローの例 33 . . .4.章 第 . . .API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36 ........... 4.1. ナレッジベース 36 4.2. セッション 36 4.3. イベント 36 1 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド . . .5章 第 . . . .JBoss . . . . . . Rules . . . . . . .IDE . . . .機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38 ........... 5.1. JBoss Rules ランタイム 38 5.1.1. JBoss Rulesランタイムの定義 38 5.1.2. JBoss Rulesプロジェクトにランタイムを選択 39 5.2. プロセススキン 39 . . .6章 第 . . . .ビジネスアクティビティの監視 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. .1. . . . . . . . . . 6.1. レポーティング 41 6.2. 直接介入 41 . . .7章 第 . . . .Business . . . . . . . . . .Process . . . . . . . . Model . . . . . . . and . . . . .Notation . . . . . . . . .(BPMN . . . . . . . 2.0) .....................................4 . .3. . . . . . . . . . 7.1. 現在の制限 49 . . .8章 第 . . . .コンソール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 ............ 8.1. Process Management Console の実行 54 8.1.1. ルールフローインスタンスの管理 54 8.1.1.1. ルールフロー定義の確認 54 8.1.1.2. 新しいルールフローインスタンスの開始 54 8.1.1.3. ルールフローインスタンスの管理 54 8.1.1.4. ルールフローインスタンスのステータスの確認 55 8.1.1.5. ルールフローインスタンス変数の確認 55 8.1.2. レポーティング 55 . . .2011 © . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 ............ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 改訂履歴 ............ .索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 ............ シンボル 57 2 目次 3 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 序文 1. 本 書 の 表 記 規 則 本ガイドでは、一部の単語や語句を強調して、特定の情報に対する読者の注意を促すために、以下のよう な表記規則を採用しています。 本ガイドの PDF および紙書籍版では、Liberation フォントセットの書体を使用しています。また、 Liberation フォントセットがご使用のシステムにインストールされている場合には、HT ML 版もこの書体 で表示されます。インストールされていない場合には、別の対応する書体で表示されます。なお、Red Hat Enterprise Linux 5 以降のバージョンでは、Liberation フォントセットがデフォルトでインストールさ れる点に注意してください。 1.1. 書体の表記規則 本ガイドでは、特定の単語や語句に対する注意を促すために、4 つの書体表記規則を採用しています。こ れらの表記規則および適用される状況は、以下のとおりです。 太字の等幅フォント シェルコマンド、ファイル名、パスなど、システムへの入力を強調するために使用します。また、キー名 やキーの組み合わせを強調するのにも使用します。以下が例となります。 作業ディレクトリ内の m y_next_bestselling_novel というファイルの内容を表示する には、シェルプロンプトで cat m y_next_bestselling_novel というコマンドを入力し て Enter キーを押し、そのコマンドを実行します。 上記の例には、ファイル名、シェルコマンド、キー名が含まれており、すべて太字の等幅フォントで表示 されていますが、文脈で区別することができます。 キーの組み合わせは、プラス記号 (+) で各キーがつながれているので、個別のキーと区別することができ ます。以下が例となります。 Enter を押してコマンドを実行します。 Ctrl+Alt+F2 を押して仮想ターミナルに切り替えます。 第 1 の例では、押すべき特定のキー名が強調されています。第 2 の例では、3 つのキーを同時に押す、 キーの組み合わせが強調されています。 ソースコードを記載する場合、その段落で言及されるクラス名、メソッド、関数、変数名、戻り値は上記 のように 太字の等幅フォント で表示されます。以下が例となります。 ファイル関連のクラスには、filesystem (ファイルシステム)、file (ファイル)、dir (ディレクトリ) などがあります。各クラスにそれぞれ独自のパーミッションセットが関連付 けられています。 太字の可変幅フォント この書体は、アプリケーション名、ダイアログボックスのテキスト、ラベル付きボタン、チェックボック ス/ラジオボタンのラベル、メニュータイトル、サブメニュータイトルなど、システムで表示される単語や 語句であることを示します。以下が例となります。 メインメニューバーから システム → 設定 → マウス の順で選択し、マウスの設定 を起動 します。全般 タブで 左利き のラジオボタンを選択して 閉じる をクリックし、マウスの主 4 序文 ボタンを左から右へ切り替えます (左利きのユーザーが使用するのに適切な設定に変更しま す)。 gedit ファイルに特殊文字を入力するには、メインのメニューバーから アプリケーション → アクセサリ → 文字マップ の順に選択します。次に 文字マップ のメニューバーから 検 索 → 検索 … の順に選択して 検索 フィールドに文字名を入力し、次を検索 をクリックしま す。検索対象の文字が 文字テーブル に強調表示されます。その文字をダブルクリックして コピーする文字列 のフィールドに表示されたら、コピー ボタンをクリックします。この後 に編集中のドキュメントに戻り、gedit のメニューバーから 編集 → 貼り付け の順で選択し ます。 上記のテキストには、アプリケーション名、システム全体のメニュー名と項目、アプリケーション固有の メニュー名、GUI インターフェースで使用されているボタンおよびテキストが含まれており、これらはす べて、太字の可変幅フォントで表示されていますが、文脈で区別することができます。 太字斜体の等幅フォント または 太字斜体の可変幅フォント 太字の等幅フォントおよび太字の可変幅フォントに斜体を使用した場合には、いずれも置き換え可能な可 変テキストであることを意味します。斜体は、記載されている通りには入力しないテキスト、あるいは状 況によって変化するテキストを示します。以下が例となります。 ssh を使用してリモートマシンに接続するには、シェルプロンプトで ssh username@ domain.name と入力します。リモートマシンが exam ple.com で、そのマシン 上のユーザー名が john である場合には、ssh john@ exam ple.com と入力してください。 m ount -o rem ount file-system のコマンドは、指定したファイルシステムを再マウン トします。たとえば、/hom e ファイルシステムを再マウントするコマンドは m ount -o rem ount /hom e となります。 現在インストール済みのパッケージのバージョンを確認するには、rpm -q package のコマ ンドを使用します。その結果、次のような出力が返されます: package-version-release ユーザー名、ドメイン名、ファイルシステム、パッケージ、バージョン、およびリリースが太字のイタ リック体で表示されている点に注意してください。これらの語句はプレースホルダーで、コマンドを発行 する際に入力するテキストまたはシステムによって表示されるテキストのいずれかです。 斜体は、著作物のタイトルを表すという標準的な用途の他に、重要な用語の初出時にも使用されます。以 下が例となります。 Publican は DocBook の出版システムです。 1.2. 引用文の表記規則 端末の出力とソースコードは、周囲のテキストとは視覚的に区切られて表示されます。 端末に送信される出力は、ローマン体の等幅フォント を使用して以下のように表示されます。 books books_tests Desktop Desktop1 documentation downloads drafts images mss notes photos scripts stuff svgs svn ソースコードの表示にも ローマン体の等幅フォント が使用されますが、以下のような構文強調表示が追 加されます。 5 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド package org.jboss.book.jca.ex1; import javax.naming.InitialContext; public class ExClient { public static void main(String args[]) throws Exception { InitialContext iniCtx = new InitialContext(); Object ref = iniCtx.lookup("EchoBean"); EchoHome home = (EchoHome) ref; Echo echo = home.create(); System.out.println("Created Echo"); System.out.println("Echo.echo('Hello') = " + echo.echo("Hello")); } } 1.3. 注記および警告 本ガイドでは、見落としがちな情報に注意を促すために、次にあげる 3 つの視覚的スタイルを使用してい ます。 注記 注記には、対象のタスクに関するヒント、ショートカット、その他のアプローチなどを記載してい ます。注記を無視しても、悪影響はありませんが、作業を効率的に行うためのコツを見逃してしま う可能性があります。 重要 重要の欄には、現行セッションのみに適用される設定の変更や、更新を適用するのに再起動が必要 なサービスなど、見落としがちな情報を記載しています。「重要」と記載された事項を無視して も、データ損失などには至りませんが、作業が思ったようにスムーズに進まなくなる可能性があり ます。 警告 警告は、無視しないでください。警告を無視すると、データ損失が発生する可能性が非常に高くな ります。 2. サ ポ ー ト 、 お よ び フ ィ ー ド バ ッ ク の お 願 い 2.1. サポートが必要ですか? 本書に説明してある手順で問題があれば、Red Hat カスタマーポータル(http://access.redhat.com)をご覧 ください。カスタマーポータルでは以下を行うことができます。 6 序文 Red Hat 製品に関する技術的なサポートの記載をナレッジベースで検索、閲覧することができます。 サポートケースを Red Hat グローバルサポートサービス(GSS)に提出することができます。 他の製品文書を参照することができます。 また、Red Hat は Red Hat のソフトウェアやテクノロジーに関するディスカッションの場として多くの メーリングリストを設置しています。公開されているメーリングリストについて はhttps://www.redhat.com/mailman/listinfoで一覧を参照してください。メーリングリストをサブスクライ ブする、またはメーリングリストのアーカイブを参照する場合はそのメーリングリスト名をクリックしま す。 2.2. フィードバックをお願いします 誤植、本ガイドの改善案がある場合、ご意見お待ちしております。製品JBoss Enterprise BRMS Platform 、コンポーネントdoc-BRMS_Rule_Flow_Com ponent_GuideとしBugzilla から報告してく ださい。以下のリンクhttp://bugzilla.redhat.com/から、あらかじめ記入が施されている本製品のバグレ ポートへ移動できます。 Bugzilla のDescription フィールドにある以下のテンプレートに記載してください。できるだけ具体的 に問題を説明していただけると、迅速に問題解決へ向けた取り組みが行いやすくなります。 文書URL: 項、項のタイトル: 問題の説明: 改善案: 追加情報: 問題報告の功績が認められるよう、名前を記載するのを忘れないようにしてください 。 7 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 第 1章 はじめに JBoss Enterprise BRMS PlatformのRule Flow モジュールとは、ワークフロープロセスエンジンのこ とです。 Rule Flow は、各ステップを実行する順序を表します。従来はフローチャートを使って描写します。例え ば、以下の図はまず課題1および2を同時に実行しなければならないといったプロセスを示しています。 これらの課題が完了すると課題3を実行する必要があります。 以下の項で、JBoss Enterprise BRMS Platform Rule Flow Engineを利用するにあたり把握していく必 要がある事項について完全に網羅しています。 8 第2章 初めて Rule Flow を利用する場合 第 2章 初めて Rule Flow を利用する場合 初めてRuleflow プロセスを作成し実行する方法については本項を参照してください。 2.1. 最 初 の プ ロ セ ス の 作 成 JBoss Business Developer Studio (JBDS) を使い、プロセスの定義、実行開始に必要なファイルで構 成される実行可能なプロジェクトを作成します。 wizard を進み基本プロジェクト構造、クラスパス、サンプルプロセスや実行コードを生成し (IDE ツー ルバーのJBoss Rules action ボタン (JBoss Rulse のタイトル)を左クリックし新規 JBoss Rules プ ロジェクトを作成します)、New JBoss Rules Projectを選択します。 注記 JBoss Rulesアクションボタンでは、JBoss Rulesのパースペクティブでのみ表示します。(開いて いない場合は) IDEウィンドウの右上端にあるOpen Perspective ボタンをクリックしJBoss Rulesのパースペクティブを開き、Other... を選択してからJBoss Rules パースペクティブを選び ます。 あるいは、JBoss Rulesディレクトリ内でFileからNew、Project...を選びJBoss Rules Projectを選択します。 プロジェクト名をつけ、Nextをクリックします。 以下のダイアログボックスで、デフォルトで利用予定のプロジェクトに追加したい要素を選択できます。 新規プロセスを作成するため、最初のボックス2つのチェックを外し、最後の2つを選択します。こうする ことで、サンプルプロセスや Java クラスを生成し、このプロセスを実行します。 JBoss Rules run-timeを設定していない場合は、今すぐ設定してください。JBoss Rulesランタイム は、Java Archive ファイル (JAR) の集合で、これらのファイルは JBoss Rulesプロジェクト JAR の中に ある特定のリリース 1 つを示します。 ランタイムを作成するには、ご希望のリリースにIDEを参照させるか、あるいはJBoss Rules IDE プラグ インに含まれているJARからご利用中のファイルシステム上で新規ランタイムを作成します(このプラグイ ンに含まれているJBoss Rulesバージョンを使うため、今回は後者の新規ランタイムの作成を行います)。 注記 これは一度行うだけで結構です。JBoss Rulesプロジェクトを次回作成する場合は、(利用しないよ うに指定しない限り)デフォルトのランタイムを自動的に利用します。 JBoss Rulesランタイムをすでに設定している場合をのぞき、Next ボタンをクリックします。 ダイアログボックスが表示され、デフォルトのJBoss Rulesランタイムが定義されておらず、先にワーク スペース設定を行う必要があるとの指示が出ます。Configure Workspace Settings... リンクをク リックすることで設定を行います。 表示されたダイアログボックスで、JBoss Rulesランタイムのワークスペース設定を表示します (これを初 めて行う場合、インストール済みのJBoss Rulesランタイム一覧は空の状態となります)。 ご利用中のファイルシステムに新規ランタイムを作成するには、Add...ボタンをクリックします。 9 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 表示されたダイアログボックスを使い新規ランタイムに (JBoss Rules 5.2 runtime などの) 名前をつけ、 利用中のファイルシステム上にあるJBoss Rulesランタイムへのパスを入力します。 Create a new JBoss Rules 5 runtim e... ボタンをクリックし、このランタイムを保存するディ レクトリを選択します。 OK ボタンをクリックすると、選択したパスがダイアログボックスに表示されます。 OK ボタンをクリックします。すると、JBoss Rulesランタイム全一覧に新しく作成したランタイムが表示 されます。 このランタイムを選択し、新たにデフォルトにしたいランタイムの横のチェックボックスをチェック し、OKをクリックします。 ランタイムを正しく設定した後、FinishボタンをクリックしProject Creation Wizard を閉じま す。 最終結果は、以下の通りになります。 1. ruleflow.rf: これはプロセス定義ファイルです。この場合、Start ノード (エントリポイント)、 Action ノード (「Hello World」と出力)、End ノード (プロセスの最後) など、非常に単純なプロセ スが含まれます。 2. RuleFlowT est.java: このプロセスを実行するJavaクラスです。 3. 必要なライブラリ。JBoss Rulesライブラリの形式で、自動的にプロジェクトのクラスパスに追加 されます。 ruleflow.rf ファイルをダブルクリックします。このプロセスは Rule Flow Editor で表示されます (Rule Flow Editor にはプロセス定義のグラフィック表示が含まれ、それぞれつながりあうノードで構成さ れています)。この Editor は全体的な管理フローを表示し、各要素の詳細も一番下のProperties View から参照 (および編集) 可能です。 左側の Editor ウィンドウにはpaletteが表示されています。これを使い新規ノードのドラッグアンドド ロップを行います。また、右側に概要ビューをが表示されます。 10 第2章 初めて Rule Flow を利用する場合 注記 この Editor を利用するほうが簡単だと感じる方がほとんどだと思いますが、希望であれば基盤XML を直接編集することもできます。サンプルプロセスのXMLを以下に示しています (図解情報はシン プル化のため省略しています)。 プロセス要素には、プロセスの名前やIDなどのパラメーターが含まれており、 header (変数、グ ローバル、インポートなどの情報を定義可能)、nodes、connectionsといった主に3つのサブセク ションで構成されています。 <?xml version="1.0" encoding="UTF-8"?> <process xmlns="http://drools.org/drools-5.0/process" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://drools.org/drools-5.0/process droolsprocesses-5.0.xsd" type="RuleFlow" name="ruleflow" id="com.sample.ruleflow" package-name="com.sample" > <header> </header> <nodes> <start id="1" name="Start" x="16" y="16" /> <actionNode id="2" name="Hello" x="128" y="16" > <action type="expression" dialect="mvel">System.out.println("Hello World");</action> </actionNode> <end id="3" name="End" x="240" y="16" /> </nodes> <connections> <connection from="1" to="2" /> <connection from="2" to="3" /> </connections> </process> 2.2. 最 初 の プ ロ セ ス の 実 行 プロセスを実行するにはRuleFlowT est.java を右クリックし、Run As... を選択しJava Applicationを選びます。 このプロセスの実行時、以下の出力が Console ウィンドウに表示されます。 Hello World RuleFlowT est クラスのコードを見てください。 11 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド package com.sample; import import import import import import import import org.drools.KnowledgeBase; org.drools.builder.KnowledgeBuilder; org.drools.builder.KnowledgeBuilderFactory; org.drools.builder.ResourceType; org.drools.io.ResourceFactory; org.drools.logger.KnowledgeRuntimeLogger; org.drools.logger.KnowledgeRuntimeLoggerFactory; org.drools.runtime.StatefulKnowledgeSession; /** * This is a sample file to launch a process. */ public class ProcessTest { public static final void main(String[] args) { try { // load up the knowledge base KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test"); // start a new process instance ksession.startProcess("com.sample.ruleflow"); logger.close(); } catch (Throwable t) { t.printStackTrace(); } } private static KnowledgeBase readKnowledgeBase() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("ruleflow.rf"), ResourceType.DRF); return kbuilder.newKnowledgeBase(); } } ご覧のように、実行プロセスは複数のステップで成り立っています。 1. まず、ナレッジベースが作成されます。ナレッジベースには、ご利用中のアプリケーションに必要 な全ナレッジ (単語、プロセス、ルールなど) が含まれています。このナレッジベースは通常一度作 成され複数回再利用されます。この場合、ナレッジベースにはサンプルプロセスのみが含まれてい ます。 2. 次にエンジンとのやりとりを行うセッションが生成されます。 次に ロガー がこのセッションに追加されます。このロガーが全実行イベントを記録し何が起こって いるか、より簡単に視覚化できるようにします。 3. 最後に、このセッション上でstartProcess(String processId) メソッドを呼び出しこのプ ロセスの新規インスタンスを開始します。これを行うと、プロセスインスタンスは実行を開始し、 Start ノード、Action ノード、End ノードの順に実行されます。実行が終わるとこのプロセスインタ ンスは終了します。 ロガーがこのセッションに追加されたため、監査ログにて何が起こったか確認できます。 ウィンドウの右下にあるAudit View タブ (Console タブの隣) を選択します。 12 第2章 初めて Rule Flow を利用する場合 Open Log ボタン (右から1つ目) をクリックし、(project ディレクトリにて)新規作成されたtest.log ファイルに移動します。 注記 このproject ディレクトリの場所が分からない場合は、右クリックをすると場所が Resource セ クションに記載されているので分かります。 ツリービューが表示されます。ここでランタイムに発生したイベントが表示されます。別のイベントが直 接の原因で行われたイベントについては、そのイベントの子として表示されます。 このログにて、プロセスが開始しプロセスインスタンスが完了した後に、Start ノード、Action ノード、 End ノードの順番でトリガーされたことが表示されます。 ここで、試しに例を編集することで、独自のプロセスを設計開始してみてください。プロセスを検証する には、Check the rule-flow m odelボタンをクリックします (これは、プロセス編集中に表示され る、プロセス上部にある緑色のチェックボックスアクションです)。保存時に自動でプロセスの検証が実施 されます。Error Viewでデバッグ情報を参照できます。 13 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 第 3章 ルールフロー 図 3.1 ルールフロー ルールフローは、実施すべきステップの順番を描写するフローチャートのことで、相互にリンクするノー ド の集まりで形成されています。各ノードは全プロセスの中のステップ1つを表しており、つながりは ノード間の遷移方法を指定します。多くの定義済みノードタイプが提供されています。ご利用中のでルー ルフローを定義、利用する方法については、本項の残りをしてください。 3.1. ル ー ル フ ロ ー プ ロ セ ス の 作 成 以下の3つの方法のいずれかでルールフローを作成 1. 汎用的な Rule Flow Editorを使う (JBDSの JBoss Rules プラグインの一部) 2. JBoss Rulesプロセス用にXMLスキーマで定義されたように、XMLプロセス形式に従いXMLファイル を記述 3. Process APIを使いプロセスを直接作成 3.1.1. グラフィックの Rule Flow Editor を利用 Rule Flow Edior は様々なノードをキャンバスにドラッグアンドドロップすることでプロセスを作成できる グラフィックツールです。さらに、これらのノードのプロパティを編集することもできます。 JBoss RulesプロジェクトをJBDSで設定すると、プロセスの追加を開始することができます。プロジェク ト内にてCtrl+Nのショートカットを使うか、あるいはルールフローを設置したいディレクトリを右クリッ クしNewからOther...を選択することでNew ウィザードを起動します。 JBoss Rules のセクションを選択しRule Flow fileを選ぶと、新規の.rfファイルが作成されま す。 ここでRule Flow Editor が表示されます。 JBoss Rules Perspectiveに切り替えると、ルールに最適になるように、ユーザーインターフェース を微調整します。 次に、(JBDS ウィンドウの下部に) Properties Viewが表示されています。プロパティビューを参照で きない場合、Window メニューからShow View、Other...をクリックします。 次に、General ディレクトリ下のProperties Viewを選択します。 Rule Flow Editor は、palette、canvas、 Outline Viewで構成されています。新規要素canvasに追 加するには、希望の場所をクリックすることで、作成し追加したい要素を選択します。例えば、GUI のCom ponents はネットにあるRuleFlowGroup アイコンをクリックし、ルールフローグループをいく つか記述します。 ルールフローにある要素をクリックするとプロパティを設定可能です。(ノードの様々なタイプで接続可能 である限り) Com ponents パレットのConnection Creationを使うことで複数のノードを接続可能で 14 第3章 ルールフロー す。 指定したいビジネスロジックに至るまで、ノードや関連をご利用中のプロセスに追加し続けてください。 最後にアプリケーションで利用する前に (IDE メニューバーの緑のCheck アイコンをクリックすることで) 抜けている情報のプロセスを確認します。 3.1.2. XMLでプロセス定義 基盤のXMLを手作業で記述しプロセスを指定することもできます。これらのXMLプロセスの構文はスキー マで定義します。例えば、以下に、部分的なXMLで Start ノード、「Hello World」と出力する Action ノー ド、End ノードから構成される単純なプロセスを示しています。 <?xml version="1.0" encoding="UTF-8"?> <process xmlns="http://drools.org/drools-5.0/process" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes5.0.xsd" type="RuleFlow" name="ruleflow" id="com.sample.ruleflow" packagename="com.sample" > <header> </header> <nodes> <start id="1" name="Start" x="16" y="16" /> <actionNode id="2" name="Hello" x="128" y="16" > <action type="expression" dialect="mvel" >System.out.println("Hello World");</action> </actionNode> <end id="3" name="End" x="240" y="16" /> </nodes> <connections> <connection from="1" to="2" /> <connection from="2" to="3" /> </connections> </process> プロセスXMLファイルには<process> 要素を1つしか含めることができません。この要素にはプロセス 関連のパラメーター (型名、ID、パッケージ名) が含まれており、<header> (ここで変数、グローバル、 インポート、スイムレーンなどのプロセスレベルの情報が定義される)、<nodes> セクション (ここでプ ロセス内の各ノードを定義する)、<connections> (ここにプロセス内の全ノードの間の関連の含める) の 3つのサブセクションで構成されています。 nodes セクションでは、各ノードに固有の要素が存在します。これらを使い、そのノード型に対する様々 なパラメーターやサブ要素を定義します。 3.1.3. プロセス APIを使ったプロセス定義 警告 Red HatはAPIの直接利用は推奨していません。常に Graphical Editor あるいはハンドコーディング したXMLを使うようにしてください。トピックを完全に網羅するためこのセクションが含まれてい ます。 15 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド プロセスAPIを使いルールフローを直接定義することができます。最も重要なプロセス要素 はorg.drools.workflow.core と org.drools.workflow.core.nodeパッケージにて定義され ています。 fluent API があると、ファクトリを使い解読可能な形式でプロセスを構築できるようになります。最終 的に構築したプロセスを手動で検証することができます。 3.1.3.1. 例1 ルールセットノードのみを含む基本プロセスについてシンプルな例を以下に示しています。 RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.drools.HelloWorldRuleSet"); factory // Header .name("HelloWorldRuleSet") .version("1.0") .packageName("org.drools") // Nodes .startNode(1).name("Start").done() .ruleSetNode(2) .name("RuleSet") .ruleFlowGroup("someGroup").done() .endNode(3).name("End").done() // Connections .connection(1, 2) .connection(2, 3); RuleFlowProcess process = factory.validate().getProcess(); 上記の注記より、RuleFlowProcessFactory クラスから静的なcreateProcess() メソッドを呼び 出すことで開始します。このメソッドで特定のIDを持つ新規プロセスを作成します。 典型的なプロセスは3つの部分から構成されています。 header の部分には、プロセス、インポート、変数などのグローバル要素が含まれています。 node セクションは、プロセスを構成する様々なノードがすべて含まれています。 最後のConnections セクションにて各ノードをつなげフローチャートを作成します。 上記の例で、header にはプロセス名やバージョン、パッケージ名が含まれています。その次に、現在の プロセスに各種ノードの追加を開始できます。自動補完を使っている場合、希望どおりの対応ノード型を 作成できるよう様々なメソッドが利用できることが分かるでしょう。 この例でプロセスにノードを追加するには、startNode()、 ruleSetNode()、endNode() メソッド を呼び出します。 これらのメソッドは特定のNodeFactoryを返し、プロパティを設定できるようになります。 特定のノードの設定が完了すると、done() メソッドを呼び出し、現在のRuleFlowProcessFactory を返しますが、必要であればさらにノードを追加することができます。 全ノードの追加を終えると、connection メソッドを呼び出すことでノードの関連付けを行います。 最後にvalidate() メソッドを呼び出し今までの作業を確認します。これにより作成し たRuleFlowProcessオブジェクトもリトリーブします。 16 第3章 ルールフロー 3.1.3.2. 例2 この例は、Split と Join ノードの使用方法を示しています。 RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.drools.HelloWorldJoinSplit"); factory // Header .name("HelloWorldJoinSplit") .version("1.0") .packageName("org.drools") // Nodes .startNode(1).name("Start").done() .splitNode(2).name("Split").type(Split.TYPE_AND).done() .actionNode(3).name("Action 1") .action("mvel", "System.out.println(\"Inside Action 1\")").done() .actionNode(4).name("Action 2") .action("mvel", "System.out.println(\"Inside Action 2\")").done() .joinNode(5).type(Join.TYPE_AND).done() .endNode(6).name("End").done() // Connections .connection(1, 2) .connection(2, 3) .connection(2, 4) .connection(3, 5) .connection(4, 5) .connection(5, 6); RuleFlowProcess process = factory.validate().getProcess(); 上記されているように、Split ノードには複数の送信接続、Join ノードには複数の受信接続を持たせること ができます。 3.1.3.3. 例3 これは他よりも複雑な例で、ForEachノードとネスト化アクションノードの用途について説明していま す。 17 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.drools.HelloWorldForeach"); factory // Header .name("HelloWorldForeach") .version("1.0") .packageName("org.drools") // Nodes .startNode(1).name("Start").done() .forEachNode(2) // Properties .linkIncomingConnections(3) .linkOutgoingConnections(4) .collectionExpression("persons") .variable("child", new ObjectDataType("org.drools.Person")) // Nodes .actionNode(3) .action("mvel", "System.out.println(\"inside action1\")").done() .actionNode(4) .action("mvel", "System.out.println(\"inside action2\")").done() // Connections .connection(3, 4) .done() .endNode(5).name("End").done() // Connections .connection(1, 2) .connection(2, 5); RuleFlowProcess process = factory.validate().getProcess(); 呼び出されたlinkIncom ingConnections() と linkOutgoingConnections() メソッドが ForEachノードと内部のアクションノードをどのようにリンクするか注目してください。これらのメソッ ドを使い、ForEach の複合ノード内での起点、終点ノードを指定します。 3.2. 利 用 中 の ア プ リ ケ ー シ ョ ン で プ ロ セ ス を 利 用 アプリケーションからプロセスを実行できるように行う必要のある作業2つあります。 まず、プロセス定義を含むナレッジベースを作成する必要があります。 2つ目に、プロセスエンジンとやりとりを行うセッションを作成しプロセスを開始する必要があります。 1. ナレッジベースの作成: 有効なプロセスが出来上がると、ナレッジベースにそのプロセスを追加可能 です。このプロセスは、ナレッジベースにルールを追加したものとほぼ同じで、追加するナレッジ タイプが変わっただけです。 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource("MyProcess.rf"), ResourceType.DRF ); すべてのナレッジをビルダーに追加した後 (プロセスを1つ以上、さらにルールも追加可能)、新し いナレッジベースを作成します。 KnowledgeBase kbase = kbuilder.newKnowledgeBase(); 18 第3章 ルールフロー 警告 これにより、(正しくプロセスを解析できないため) ナレッジベースにエラーが含まれている と例外がスローされます 。 2. プロセスの開始: プロセスを実行するよう明示的に記述した場合のみ実行されます。これは、ナレッ ジベースに多くのプロセスを定義可能で、エンジン側でどのプロセスをいつ起動するか把握する手 段がまったくないためです。特定のプロセスを有効化するには、startProcess メソッドを呼び 出します。 StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.startProcess("com.sample.MyProcess"); startProcess メソッドのパラメーターは開始予定のプロセスIDを示します。このプロセスIDは、 プロセスのプロパティとして指定する必要があります。これは、background canvasをクリック すると、Properties View に表示されます。 重要 プロセスでルールも実行する必要がある場合、ksession.fireAllRules() メソッドも呼 び出す必要があります。 注記 追加のパラメーターを指定し、入力データをプロセスに渡すことができます。これを行うに は、startProcess(String processId, Map param eters) メソッドを使います。 このメソッドは、別のパラメーターセットを name-value ペアとして取り、新規作成された プロセスインタンスへトップレベル変数としてコピーします。 注記 ルール帰結部からあるいはプロセスアクションからプロセスを開始するには、定義済み のkcontext パラメーターを使います。 kcontext.getKnowledgeRuntime().startProcess("com.sample.MyProcess"); 3.3. 利 用 可 能 な ノ ー ド 型 ルールプロセスは、相互関連されたノード型を描写するフローチャートです。プロセス自体は以下のプロ パティを提示しています。 ID: これはプロセスの一意IDです。 Name: これはプロセスの一意表示名です。 Version: これはプロセスのバージョン番号です。 Package: これはプロセスが格納されるパッケージ (あるいは名前空間)です。 19 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド Variables: プロセス実行中にデータを格納する変数を定義できます。 Exception Handlers: これを使いプロセス中に問題が発生した場合に何が起こすか指定します。 Connection Layouts: これらの使いキャンバス上でつながりがどのようになっているか指定します。 Manual は常に起点から終点までの直線としてつながりを描写します (オプションとして途中に中間 地点を利用することも可)。 Shortest path もよく似ていますが、線がノードを越さないように起点と終点の間に障害がある場 合は回避を試みます。 Manhattan オプションは、水平、垂直線のみを使いつながりを描写します。 ルールフローの作成時に、以下のノード型を利用できます。 「Start Event」 「End Event」 「Rule T ask (あるいは RuleFlowGroup)」 「Diverging Gateway (あるいは Split)」 「Converging Gateway (あるいは Join)」 「State」 「Reusable Sub-Process (あるいは SubFlow)」 「Action (あるいは Script T ask)」 「T imer Event」 「Error Event (あるいは Fault)」 「(Message) Event」 「Sub-Process (あるいは Composite)」 「Multiple Instance (あるいは ForEach)」 3.3.1. Start Event これがルールフローの起点となります (ルールフローの起点ノードは1つのみとし、受信接続は持てず送 信接続のみとなります)。ルールフロープロセスが開始されると、このノードから実行が開始されこの ノードにリンクしている最初のノードへ移動し、その次のノードへと自動的に継続していきます。 この Start Event ノードは以下のプロパティを処理します。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 Triggers: 有効化したときに自動的にプロセスを開始するトリガーを指定します。指定のルールあるい は制約が満たされた場合、プロセスを自動起動する制約トリガーと、指定のイベントにシグナルが出 された場合プロセスを自動的に開始するイベントトリガーの例となっています。 注記 まだ、Graphical Editorでこれらのトリガーを指定することができません。トリガーを追加する 代わりにXMLファイルを編集します。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.2. End Event これは、ルールフローの終点です。ルールフローは最低でも1つの終点ノードを持つ必要があります。 End Node には受信接続のみで、送信接続をもたせることはできません。 20 第3章 ルールフロー このノードは以下のプロパティを処理します。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 Terminate: End node はプロセス全体 (デフォルトの動作) あるいはパス1つを終了することができま す。プロセスを終了すると、このルールフローにある有効なノードはすべて (並行したパス上にあるも のも) はすべて取り消されます。 無限の End node は現在のパスを終了させますが、他の並行パスは持続します。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.3. Rule Task (あるいは RuleFlowGroup) このノードを使い評価したいルールセットを表します。RuleFlowGroup ノードは受信接続1つと送信接続 1つを持つものとします。 ルールを特定のルールフローグループの一部とするには、ruleflow-group ヘッダー属性を使います。 RuleFlowGroup ノードに到達すると、該当の ruleflow-groupの一部となっている全ルールの実行を開 始します。そのグループに有効なルールが存在しなくなると、次のノードで自動的に実行が継続されま す。 つまり、他のルールがファクトを変更した場合でも、Agenda に (現在有効なルールフローグループに所属 する) 新しいアクティベーションを追加することができます。 注記 ルールフローは、有効なルールが含まれないルールフローグループに到達すると、即座に次のノー ドを処理します。ルールフローグループがすでに有効な場合、有効な状態が保持され、有効なルー ルがすべて実行されたときのみ実行が継続されます。 これには、以下のプロパティが含まれます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 RuleFlowGroup: このノードのルールセットを表すルールフローグループの名前です。 Timers: このノードにリンクするタイマーです。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.4. Diverging Gateway (あるいは Split) これを使いルールフローにブランチを作成します。Split ノードには、受信接続を1つと、2つ以上の送信 接続を含める必要があります。 Split ノードには2種類あります。 AND は、制御フローが送信接続すべてにおいて同時に継続されるという意味です。 XOR は、送信接続1つのみを選択するという意味です。各送信接続にリンクされた制約を評価し、決 定が下されます。ルールの左側と同じ構文を使い、制約を指定します。T rue と評価されたもので優先 順位の数値が最も低い制約が選択されます。 21 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 警告 送信接続の1つ以上が実行時に true と評価されるようにします (1つも存在しない場合はルー ルフローが例外をスローします)。例えば、他の接続が1つも選択されない場合どうするか指定 するには、常に true (デフォルト) となっている接続で優先順位の高い番号を利用することがで きます。 OR は、条件がtrue と評価された送信接続すべてが選択されます。条件は XOR の Split に似ています が、優先順位が考慮されない点が違います。 警告 送信接続の1つ以上が実行時に true と評価されるようにします (1つも存在しない場合はルー ルフローが例外をスローします)。例えば、他の接続が1つも選択されない場合どうするか指定 するには、常に true (デフォルト) となっている接続で優先順位の高い番号を利用することがで きます。 このノードには、以下のプロパティが含まれます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 Type: これはノード型です (AND、XOR、あるいはOR) Constraints: 各送信接続 ((X)OR split の場合)にリンクしている制約のことです。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.5. Converging Gateway (あるいは Join) これを使い複数のブランチを同期します。 Join ノードは2つ以上の受信接続と1つの送信接続を持つ必要 があります。Split には4種類存在します。 ANDは、全ブランチが完了するまで待機し継続されるという意味です。 XOR は、受信ブランチの1つが完了すると次に継続されるということです (受信接続1つ以上によりト リガーされた場合、トリガー毎に次のノードを有効にします)。 Discrim inatorは、受信ブランチの1つが完了された場合に次のノードへと継続されるということ です。全接続が完了するまで、完了と同時に他の受信ブランチが登録されます。この時点で、ノード がリセットされ、受信ブランチの1つが再度完了した際にトリガーできるようにします。 n-of-m は、m 受信ブランチの n が完了した場合に、次のノードへ継続されるということです。変数 n は、固定値にハードコード化するか、待機する必要のある受信ブランチ数を含むプロセス変数を参 照することができます。 このノードには、以下のプロパティが含まれます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 Type: これはノード型です (AND、XOR、あるいはOR) n: 待機する必要のある受信接続数のことです (n-of-m joinの場合)。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.6. State 22 第3章 ルールフロー このノードは待機状態を表します。このステータスには、受信接続が1つ、そして1つ以上の送信接続が 必要です。 送信接続ごとに、ルール制約を指定し継続前のプロセス待機時間を定義することができます。例えば、注 文入力アプリケーションの制約により、指定の順番でエラーがなくなるまでプロセスを待機させるように 指定するかもしれせん。 制約の指定にはルールの左側で利用するものと同じ構文を使います。 このノードに到達すると、エンジンは関連の制約をチェックします。制約の1つが直接trueと評価された 場合、フローはすぐに継続されます。そうでない場合は、作業メモリからファクトが挿入、更新、削除さ れるなど、後に制約の1つに当てはまった場合フローが継続されます。 注記 ksession.signalEvent("signal", "nam e") を使い、手動でステータスをシグナル送信 し、次のステータスに進むこともできます。nam e の部分は、選択すべき接続に対する制約名ある いは、移動したいノード名を入れてください。 ステータスには、以下のプロパティが含まれます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 Constraints: これらを使いプロセスがこのステータスから離れ、送信接続ごとに継続できる時点を定義 します。 Timers: このノードにリンクするタイマーです。 On-entry and on-exit actions: これらはそれぞれ、このノードに入った時点、あるいは退出した時点に 実行するアクションです。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.7. Reusable Sub-Process (あるいは SubFlow) これは、別のプロセスを親プロセス内から呼び出すことで、Sub-process ノードには受信接続1つ、およ び送信接続1つを含める必要があります。 SubFlow ノードに到達すると、エンジンは指定IDを使いプロセスを開始します。 このノードには、以下のプロパティが含まれます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 ProcessId: これは実行予定のプロセス ID です。 Wait for completion: このプロパティを trueに設定すると、SubFlow ノードは別のものから実行を停 止(完了あるいは中断)させられた場合のみ継続されます。そうでない場合は、サブプロセスを開始 した後すぐに継続されます。 Independent: このプロパティを trueに設定すると、サブプロセスは独立プロセスとして開始しま す。つまり、終点ノードに到達した場合も SubFlow プロセスは中断しません。また、到達しない場合 はプロセスの終了 (あるいは中断) 時に有効なサブプロセスがキャンセルされます。 On-entry and on-exit actions: これらはそれぞれ、このノードに入った時点、あるいは退出した時点に 実行するアクションです。 Parameter in/out mapping:変数にin- および out-mappings を使うことで sub-flow ノードも定義可能で 23 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド す。プロセス開始時にこのプロセスの変数値をパラメーターとして利用します。サブプロセスが完了 すると、サブプロセスにある変数値がこのプロセスの変数にコピーされます。 注記 Wait for completion が trueに設定された場合のみ、out mapping を利用可能です。 Timers: このノードにリンクするタイマーです。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.8. Action (あるいは Script Task) このノードは、このルールフローで実行すべきアクションを表します。Action ノードは受信接続1つと送 信接続1つ持つ必要があります。関連アクションは、実行すべきこと、アクションのコーディングに利用 する方言 (Java あるいは MVEL)、実際のアクションコードを指定します。 このコードにより、KnowledgeHelper オブジェクトを参照するdroolsと呼ばれる Global で定義済み の変数 (例えば、これを利用しdrools.getWorkingMem ory()を呼び出すことで作業メモリをリトリー ブ可能)および、ProcessContextを参照するkcontext 変数 (例えば、後者のオブジェクトを使い現在 の ProcessInstance あるいは NodeInstanceへアクセスし、変数を取得・設定可能) へアクセスでき ます。 ルールフローが Action ノードに到達すると、アクションを実行し次のノードへと継続していきます。 Action ノードは以下のプロパティを持ちます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 Action: このノードに紐付いたアクションです。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.9. Timer Event このノードは一定期間経過後、1回以上トリガーすることができるタイマーを指します。T imer ノードに は受信接続1つと送信接続1つ持たせる必要があります。 T imer delay はタイマーが初めてトリガーを行う前に待機する時間 (ミリ秒) を指定します。T imer Period は連続したトリガー2つの間隔を指定します。期間 0 は、タイマーがトリガーされるのは1回のみである という意味です。ルールフローがT imer ノードに到達すると、紐付けられたタイマーが開始します。 (例えばプロセスの完了や中断などで) T imerノードが取り消された場合、タイマーがキャンセルされま す。 T imer ノードには以下のプロパティが含まれています。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 Timer delay: これは最初にトリガーする前にノードが待機すべき時間 (ミリ秒)です。 Timer period: これは連続するトリガー2つの間隔 (ミリ秒)です。この期間が 0の場合、タイマーがト リガーされるのは1回のみでなければなりません。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.10. Error Event (あるいは Fault) 24 第3章 ルールフロー Fault ノードを使いプロセス内の例外条件を示します。このノードには送信接続はなく受信接続を1つ持 たせるものとします。 ルールフローが fault ノードに到達すると、指定の名前で障害が発生します。このプロセスは、この種の 障害を処理可能で適切な例外ハンドラーを検索します。障害ハンドラーが見つからない場合、プロセスイ ンスタンスは中断されます。 Fault ノードには以下のプロパティが含まれます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 FaultName: これは障害名です。この名前を使いこの種の障害処理が可能で適切な例外ハンドラーを検 索します。 FaultVariable: これは、この障害に紐付いたデータを含む編集名です。このデータも (あれば) 例外ハン ドラーに渡されます。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.11. (Message) Event この Event ノードを使い、プロセス実行中の外部あるいは内部のイベントに対応します。Event ノードに は受信接続なしで送信接続1つを持たせる必要があります。予定されるイベント型を指定します。この型 のイベントが検出されると必ず、この Event ノードに関連したノードがトリガーされます。 これには、以下のプロパティが含まれます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 EventType: これは、予定されるイベントの型となります。 VariableName: このイベントに紐付けられたデータ(あれば) を含む変数名です。 Scope: このノードを使い内部イベントのみ (つまり、processInstance.signalEvent(String type, Object data)を使い、このプロセスインスタンスに直接シグナルを送るイベント)をリッス ン可能です。 workingMem ory.signalEvent(String type, Object event)を使い、外部のイベントとし て定義することができます。この場合、プロセスエンジンに直接シグナルを送る外部イベントもリッ スンします。 MetaData: これはこのノードに関連するメタデータとなります。 3.3.12. Sub-Process (あるいは Composite) Composite ノードは、ノードコンテナーとして機能するように、他のノードを含めることができるノード のことです。これにより、このような Composite ノード内にあるフローの一部だけでなく、このコンテ ナー内にある全ノードへアクセス可能な別の変数や例外ハンドラーの定義も組み込むことができます。 Composite ノードには受信接続が1つ、送信接続が1つ含まれる必要があります。このノードには以下の プロパティが含まれます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 StartNodeId: これはトリガーすべきノードコンテナーノードの ID です。 EndNodeId: フローの終点を示すノードコンテナーノードのIDです。このノードが完了すると、 Composite ノードも完了し、送信接続に移動します。このComposite ノード内の他のノードはすべ て、取り消されます。 Variables: 別のデータストレージ変数を追加可能です。 25 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド Exception Handlers:これを使い、障害発生時の動作を指定します。 3.3.13. Multiple Instance (あるいは ForEach) ForEach ノードは特別な複合ノードで、コレクション内の要素ごとに1回ずつ実行でき、つまりノード内 に含まれているフローを複数回実行することができます。ForEach ノードには、受信接続を1つ、送信接 続を1つ持たせる必要があります。 ForEach ノードは、各コレクションに埋め込まれたフローが完了するまで待機し、次に継続します。 このノードには、以下のプロパティが含まれます。 ID: これはノードの ID で (ノードコンテナーの中で一意のものとなります)。 Name: これはノードの表示名です。 StartNodeId: これはトリガーすべきノードコンテナーノードの ID です。 EndNodeId: フローの終点を示すノードコンテナーノードのIDです。このノードが完了すると、 Composite ノードも完了し、送信接続に移動します。このComposite ノード内の他のノードはすべ て、取り消されます。 CollectionExpression: これは、繰り返し利用可能な要素のコレクションを示す変数名です。コレク ション変数を java.util.Collection に設定します。 VariableName: これはコレクションからの現在の要素が含まれている変数の名前です。これにより、 選択した要素へアクセスする複合ノード内のサブノードを利用できるようになります。 3.4. デ ー タ ルールフローは特にプロセスの制御フローを作成できるよう設計されていますが、データ面のフローも計 画する必要があります。プロセス実行中、データはリトリーブ、格納、伝搬、利用されます。 プロセス実行時にランタイムのデータを格納するには、変数を使います。変数は名前とデータ型で定義さ れます。これは、Boolean、int、String などのように非常に基本的なものや、オブジェクトのサブクラス などといったものの場合があります。 変数の範囲内で変数を定義します。トップレベルの範囲はプロセス自体で、その下にあるサブ範囲は複合 ノード経由で定義可能です。サブ範囲で定義された変数はその範囲内にあるノードからしかアクセスでき ません。 変数にアクセスすると、このプロセスは適切な変数範囲を検索します。 変数範囲をネスト化することが可能です。ノードは常に親コンテナー内の変数を検索します。変数が見つ からない場合、プロセスインスタンスに到達するまで、その変数範囲の親コンテナーを次々に検索してい きます。また、その変数が見つからない場合、プロセスの実行は継続され、読み取りのアクセスは null を、書き込みのアクセスはエラーメッセージを生成します。 変数を以下の方法で利用することができます。 パラメーターをstartProcess の呼び出しにマッピングすることで、プロセス開始時にプロセスレベ ルの変数を設定することができます。これらのパラメーターは、そのプロセス範囲の変数として設定 されます。 アクションは変数に直接アクセスできます。パラメーター名として変数名を利用することでアクセス 可能です。 // call method on the process variable "person" person.setAge(10); 26 第3章 ルールフロー knowledge context を使い変数値を変更できます。 kcontext.setVariable(variableName, value); 作業項目のパラメーターの1つに変数をマッピングすることで、WorkItem と SubFlow ノードがこの パラメーター値を「変数の範囲外」に渡すことができるようになります。 #{expression} を使って パラメーターマッピングあるいは、String パラメーターに挿入することで、これが可能になります。 また、結果のマッピングを使い、WorkItemの出力を変数にコピーすることも可能です。 その他のノードもデータにアクセス可能です。例えば、Event ノードは変数内でイベントと紐付けられ たデータを格納することができ、例外ハンドラーは特定の変数からエラーのデータを読み込むことが できます。詳細情報については、様々なノード型のプロパティを確認してください。 最後に、全プロセスとルールはglobalsにアクセス可能です。これらは、グローバルに定義された変数で、 ナレッジセッションのルール評価やデータに関しては、不変であるとみなされます。 ナレッジコンテキストのアクションを使い、ナレッジセッションにアクセス可能です。 kcontext.getKnowledgeRuntime().insert( new Person(...) ); 3.5. 制 約 ルールフロー内にある多数の場所で制約を利用することができます。たとえば、Split ノードで OR や XOR の判定や State ノードの制約として、制約を使用することができます。Rules Flow Engine は以下の2種 類の制約に対応しています。 Code 制約 は Boolean 表現で、到達直後に直接評価されます。この制約は Java および MVEL の2種 の方言で記述可能で、プロセスで定義されているグローバル変数および変数へ直接アクセスすること ができます。 Java での記述例を以下に示しました。person がこのプロセスの変数となっています。 return person.getAge() > 20; これは同じ制約を MVEL で記述したものです。 return person.age > 20; Rule 制約 は、JBoss Rules の通常の条件と同じです。JBoss Rules ルール言語の構文を使い、非常 に複雑になり得る制約を表現します。これらのルールは (他のルールと同様) 作業メモリ内のデータを 参照します。また、直接グローバル変数を参照することも可能です。 ここでは、有効なルール制約の例を示しています。 Person( age > 20 ) これは、20歳以上の人を作業メモリから検索します。 ルール制約は、ルールフロー内で定義された変数に直接アクセスできません。ただし、作業メモリにプロ セスインスタンスを追加し、ルール制約でそのプロセスインタンスとマッチさせることで、ルール制約内 の現在のプロセスインスタンスを参照することは可能です。 Red Hat は、WorkflowProcessInstance タイプの processInstance 変数が現在のプロセスインスタンスの みとマッチし、作業メモリ内の他のプロセスインスタンスとマッチしないように、特別なロジックを追加 しました。しかし、ご自身の責任のもと、セッションへプロセスインスタンスを追加、更新し、Java コー ド、on-entry、on-exit、明示的なプロセスアクションなどで利用してください。 27 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 以下のルール制約の例では、プロセス変数 name に格納された値と同じ名前の人を検索します。 processInstance : WorkflowProcessInstance() Person( name == ( processInstance.getVariable("name") ) ) # add more constraints here ... 3.6. ア ク シ ョ ン アクションを以下の方法で利用することができます。 Action ノード内 ノードの入り口あるいは出口 (ノード数分) 例外ハンドラーの動作の指定 アクションは、プロセスに対し定義されたグローバル変数やその変数、および定義済みのcontext 変数 へアクセスします。最後の変数は、org.drools.runtim e.process.ProcessContext 型で以下の タスクに利用することができます。 現在のノードインスタンスを取得。このノードインスタンスを名前や型といった情報についてクエリ 可能です。以下のようにキャンセルも可能です。 NodeInstance node = context.getNodeInstance(); String name = node.getNodeName(); 現在のプロセスインスタンスを取得。プロセスインスタンスを名前や procesId といった情報について クエリ可能です。内部のイベントを使い、中断やシグナルの送信が可能です。 WorkflowProcessInstance proc = context.getProcessInstance(); proc.signalEvent( type, eventObject ); 変数の値を取得あるいは設定。 プロセスの開始、外部イベントのシグナル送信、データの挿入などを行うため、ナレッジランタイム へアクセス。 Java アクションは有効な Java コードでなければなりません。 MVEL アクションはこのビジネススクリプト言語を使い、アクションを表現することができます。MVEL は、有効な Java コードを受け入れ、ネスト化されたパラメーター (person.getNam e() の代わりに person.nam e など) へのアクセスに対応し、その他様々な利点があります。そのため、MVEL 表現は通 常ビジネスユーザーにとってより便利なものとなっています。例えば、ルールフローのrequester 変数の 人名を出力するアクションは、以下のようになります。 // Java dialect System.out.println( person.getName() ); // MVEL dialect System.out.println( person.name ); 28 第3章 ルールフロー 図 3.2 イベントを使った単純なプロセス プロセスを実行すると、Rule Flow Engine は関連タスクがすべてプロセスプランに従い確実に実行される ようにします。これは、作業アイテムの実行をリクエストし、結果を待つことで行います。しかし、 Engine が直接リクエストしなかったイベントにルールフローを対応させることはできません。明示的に ルールフローでこれらのイベントを表現すると、プロセスをどのように対応させるか指定することができ ます。 各イベントには関連付けられた型があります。また、関連付けられたデータを持つ場合もあります。自身 のイベント型や関連データを定義することができます。 ルールフローがイベントに対応する方法を指定する際、Event ノードを使います。Event ノードは、その ノードに関係するイベント型を指定する必要があります。また、イベントに関連付けられたデータを取得 するように、変数名を定義することも可能です。これは、プロセス内の後続ノードがイベントデータをへ アクセスし、このデータに基づき適切なアクションを取ります。 実行されているプロセスインスタンスへイベントのシグナルを送信する方法は以下のとおりです。 内部イベント経由:以下のようなコードを使い、内部イベントが発生したルールフローのシグナル内 でアクションを実行 context.getProcessInstance().signalEvent(type, eventData); 外部イベント経由:以下のようなコードを使い、外部イベントのプロセスインスタンスを通知 processInstance.signalEvent(type, eventData); イベント相関を使って外部イベント経由:プロセスインスタンスに直接通知する代わりに、Rule Flow Engine が、イベント相関を使うことで、イベントに関連しているプロセスインスタンスがどれかを自 動的に判断できるようになります。これは、イベント型に基づいており、このコードを使ってプロセ スインスタンスを作成します。このプロセスインスタンスには、指定のイベント発生時に通知される 外部イベントについてリッスンする Event ノードが含まれます。 workingMemory.signalEvent(type, eventData); イベントを使いルールフローを開始することも可能です。Start ノードが特定の型に関するイベントトリ ガーを定義すると、新しいルールフローインスタンスが起動します。 3.8. 例 外 29 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 図 3.3 例外ハンドラーを使ったプロセス例 例外の条件がルールフローの実行中に発生した場合、問題として取り上げられます。その後ルールフロー は、この種の問題を処理できる適切な例外ハンドラーを検索します。 イベントですが、問題ごとに関連の型が存在します。また、関連付けられたデータを持つ場合もありま す。独自の型やデータの両方を定義可能です。 Fault ノードが Fault 変数を指定すると、指定の変数値がその問題と紐付けられます。 問題が作成されると、プロセスはマッチする例外ハンドラーを検索します。 ルールフローおよび Composite ノードは両方、例外ハンドラーを定義することができます。 例外ハンドラーをネスト化することができます。ノードは常に、親コンテナー内で、該当の例外ハンド ラーを探し出します。何も検出されなかった場合、プロセスインスタンス自体に到達するまで、各親コン テナーを検索していきます。例外ハンドラーが何も見つからなかった場合、プロセスインスタンスは中断 され、プロセス内の全ノードが取り消されることになります。 例外ハンドラーを使い Fault 変数を指定することも可能です。この場合、その問題に関連するデータは、 この変数にコピーされます。こうすることで、このルールフローにある後続の Action ノードが問題のある データにアクセスし、そのデータをベースに適切なアクションを取ることができます。 例外ハンドラーは、特定の問題にどのように対応するか指示をする必要があります。多くの場合、例外ハ ンドラーで必要とされる動作は1つのアクションとして表現することはできません。そのため、Red Hat は、以下のコードを使うことで、特定のイベント型 (この場合 "Fault") のシグナル送信を行う例外ハンド ラーを使うよう推奨しています。 context.getProcessInstance().signalEvent("FaultType", context.getVariable("FaultVariable"); 3.9. タ イ マ ー タイマーを使いトリガーを行うまでの時間遅延を設定します。タイマーを使うことで、管理期間を指定す る、一定期間が経った後に特定のロジックをトリガーする、定期的な間隔でアクションを繰り返すことが できます。 タイマーノードを設定することで、delay (遅延) とperiod (期間) の切り口を持たせることができます。遅 延は、ノードのアクティベーション後、初めてタイマーをトリガーするまでどのくらい (ミリ秒) 待機する 30 第3章 ルールフロー のか指定します。期間では後続のトリガーがアクティベートされるまでの期間を定義します。この期間を 0に設定すると、タイマーは1回のみ実行されます。 タイマーサービスは、タイマーが正確なタイミングでトリガーされるようにします。タイマーの取り消し も可能です。タイマーを取り消すとタイマーがトリガーされなくなります。 以下の方法でタイマーを利用することができます。 T imer ノードをルールフローに追加できます。ノードがアクティベートされると、タイマーがスター トし、そのトリガー (1回あるいは繰り返し) が T imer ノードの後続処理をアクティベートします。つ まり、期間を設定している場合は、タイマーの送信接続が複数回トリガーされます。T imer ノードを 取り消すと、関連するタイマーも取り消され、その後は何もトリガーされなくなります。 WorkItem、SubFlow など、イベントベースのノードとタイマーを関連付けることができます。ノード に関連付けられたタイマーは、ノードが有効になる度にアクティベートされます。そして、タイマー がトリガーされると、関連のアクションが実行されるようになっています。例えば、タスクの実行時 間が長すぎる場合に定期的な通知を送信する際、や管理期間が過ぎた場合に問題のシグナルを送信す る際に利用します。 タイマーの親ノードが終了すると、タイマーが自動的にキャンセルされます。 3.10. ル ー ル フ ロ ー の ア ッ プ デ ー ト 時間の経過とともに要件が変化し、あるいは改善などを行なっていくと、ビジネスプロセスも進化してい く可能性が高くなります。実際にルールフローを更新してこれを反映させることはできませんが、新しい バージョンをデプロイすることは可能です。古くなったプロセスは、既存のプロセスインスタンスが旧版 の定義を必要とする可能性もあるため、そのまま存在し続けます。このように、新規プロセスには別の ID を割り当てる必要がありますが、同じ名やバージョンのパラメーターを使うことができます。 ルールフローがアップデートされるたびに、すでに実行中のプロセスインスタンスに何が起こるか決定す る必要があります。オプションは以下のとおりです。 Proceed: インスタンスの開始時に決定した定義を使い、実行中のプロセスインスタンスを通常通り続 行します。つまり、すでに実行中のインスタンスは、ルールフローがアップデートされていないかの ように継続されます。新規インスタンスを開始して初めて、アップデートしたバージョンが利用され ます。 Abort (その後、Restart): 実行中のインスタンスを中断します。必要であれば、新しいバージョンの ルールフローを使うため、再起動します。 Transfer: プロセスインスタンスを新しいプロセス定義に移行します。つまり、アップデートされた ルールフローのロジックに基づいて実行継続されます。 デフォルトでは、Rule Flow Engine は「proceed」のアプローチを使います。 3.10.1. ルールフローインスタンスの移行 ルールフローインスタンスには、後で実行を継続させる際に必要となってくる、ランタイムの情報がすべ て含まれています。これには、このプロセスインスタンス (変数内に格納) に関連付けられたデータすべ て、現在のプロセスステータスの図が含まれています。アクティブなノードごとに、ノードインスタンス はこれを表します。 また、ノードインスタンスには、特定のノード実行に紐付けられたその他のステータスも含まれていま す。ノードインスタンスには様々な型があり、各ノード型に1つずつとなっています。 ルールフローインスタンスには、ランタイムの状態のみが含まれます。間接的に (ID参照を使い) 実行時に 従う必要のあるロジックを示す、特定のルールフローと関連づいています。その結果、実行中のプロセス インスタンスをルールフローの新しいバージョンにアップデートするには、関連づいたプロセス ID を 31 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド アップデートするだけで結構です。 しかし、ルールフローインスタンスのステータスを移行する必要がある点を考慮にいれていません。プロ セスが継承され、既存の待機ステータスがすべて保持されている場合、ランタイムのステータスを変更す る必要がないため比較的簡単です。しかし、それ以外の場合は、洗練されたマッピングが必要となりま す。例えば、既存の待機ステータスを削除、あるいは複数の待機ステータスに分割する場合、既存のルー ルフローインスタンスをアップデートすることができません。同様に、新規のプロセス変数が導入される と、プロセスの残りの部分で利用する前に正しく変数を初期化する必要がある可能性があります。 これに対応するには、 WorkflowProcessInstanceUpgrader を使い、ルールフローのプロセスイ ンスタンスを新しいものにアップグレードしてください。また、このツールを使うにはプロセスインスタ ンスと新規プロセスの ID を提示する必要があります。デフォルトでは、Rules Flow Engine は同じ ID を 使って古いノードインスタンスを新しいインスタンスに自動でマッピングしますが、古い (一意の) node ID. を新規のノード ID にマッピングすることも可能です。(この一意のノード ID は node ID.で、このIDの 前に親ノード ID が来ますが、それぞれコロンで区切ります)。これらの ID は composite が利用された場 合一意にノードを特定することができます (node ID. はノードコンテナー内でのみ一意であるためです)。 以下に例を示します。 // create the session and start the process "com.sample.ruleflow" KnowledgeBuilder kbuilder = ... StatefulKnowledgeSession ksession = ... ProcessInstance processInstance = ksession.startProcess("com.sample.ruleflow"); // add a new version of the process "com.sample.ruleflow2" kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(..., ResourceType.DRF); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); // migrate process instance to new version Map<String, Long> mapping = new HashMap<String, Long>(); // top level node 2 is mapped to a new node with ID 3 mapping.put("2", 3L); // node 2, which is part of composite node 5, is mapped to a new node with ID 4 mapping.put("5.2", 4L); WorkflowProcessInstanceUpgrader.upgradeProcessInstance( ksession, processInstance.getId(), "com.sample.ruleflow2", mapping); このようなマッピングでもまだ十分でない場合、特定の状況に合わせ独自のカスタムマッパーを生成する ことができます。方法は以下のとおりです。 まず、プロセスインスタンスの接続を切断します。 次に、ステータスを適宜変更します。 最後に、プロセスインスタンスを再接続します。 3.11. ル ー ル を ル ー ル フ ロ ー グ ル ー プ に 割 り 当 て 大規模なルールセットを処理する場合、ルールの評価順を管理するのは複雑になってきます。ルールフ ローにより、ルールセットが評価される順番を指定することができます。フローチャートを使うことで指 定ができます。このチャートを使いどのルールセットがどの順番で、また、並行して評価され、ルール セットが評価されるべき条件を指定します。この機能や例についてはこの章を参照してください。 ルールフローは条件分岐、並列処理、同期処理の処理を行うことができます。 32 第3章 ルールフロー ルールフローを使い、ルールの評価順を記述するには、以下の手順に従ってください。 まず、ruleflow-group のルール属性を使い、ルールを分類します (GUI では options)。 次に、フローチャートとなる、ルールフローのグラフを作成します。このグラフは、ruleflow-group が評 価されるべき順番を図解します。以下に例を示しました。 rule 'YourRule' ruleflow-group 'group1' when ... then ... end このルールは、group1と呼ばれる ruleflow-group に所属します。 プロセスによりトリガーされる ruleflow-group の一部として実行中のルールは、ルール結果のルールフ ローコンテキストにもアクセス可能です。このコンテキストを使い、ruleflow-group をトリガーするルー ルフローやノードインスタンスへアクセスすることができます。また、変数の設定や取得も行うことがで きます。 drools.getContext(ProcessContext.class).getProcessInstance() 3.12. ル ー ル フ ロ ー の 例 図 3.4 単純なルールフロー Check Order グループのルールは Process Order グループのルールより先に実行する必要がある と、上記のルールフローにて指定しています。salience を使うことでよく似た結果を得ることもできます が、維持が難しくルール(あるいは Agenda グループ) 内で時間の関係が黙示化されます。反対に、ruleflow を使うと、ルール構造の上部層にて処理の順番が明示的になるため、複雑なビジネスプロセスもより 簡単に管理することができるようになります。 実際には、rule-flow を使うとグループの進む順番を設定するだけでは終わりません。Split やJoin ノード を使い分岐のモデル化を行い、Start からruleflow-groups へ、そして Split、さらには他のグループへ接続 を使いフローを定義します。グラフィックエディターを使い上記をすべて行います。 33 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 図 3.5 複雑なルールフロー 上記のルールフローは、保険請求の最終決定といった、より複雑なビジネスプロセスを表しています。 まず、請求データの検証ルールが処理されます。このようなルールでデータの整合性チェックを行い、完 全性、整合性を確認します。 次に、Split ノードでその請求の値をもとに条件付きの決定を下します。この処理は自動決算グループへと 移動するか、別の Split ノードへ移動しこの案件で死亡者がいないか確認します。 もしいる場合、通常の 死亡者案件固有のルールが有効になり、他の処理が続きます。 条件が少なくてもそれに基づき、たくさんのコントロールフローが可能になります。 注記 ルールは、制御フロー定義を別々に保存することで、すべて1つのパッケージ内に収めることも可 能です。 Split ノードを編集するには、以下のプロセスに従います。 最初にノードをクリックします。 表示されたproperties panel から、AND、OR、あるいは XOR のタイプを選択します。OR を選択し た場合、分岐後に考えられる出力のいずれでも行えます。つまり、違ったパスを2つ以上並行して進行処 理できるのです。XOR を選択した場合は、パスは1つのみとなります。 OR あるいは XOR を選択すると、Constraints の行の右側に四角いボタンが表示されます。 このボタンをクリックし、Constraint Editor を開きます。これは、constraints (ルールの条件部分の 34 第3章 ルールフロー ようなもの) を追加する際に使うテキストエディターです。 注記 これらの制約は、作業メモリのファクト部分で作用します。上記の例では、250以下の値の請求を チェックします。この条件が T rue の場合、関連のパスを進んでいきます。 どのパスをたどるか決定する条件を設定します。 35 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 第 4章 API ルールフロー定義を含むナレッジベースの作成とセッションの作成という2つのタスクを行うにはAPIを利 用します。 4.1. ナ レ ッ ジ ベ ー ス ナレッジベースのAPIにより、利用予定のルールフローで必要とされるナレッジをすべて含むナレッジ ベースを1つ作成することができます。セッション間でこのナレッジベースを再利用することができま す。 ナレッジベースにはルールフロー定義がすべて (とルール例などその他のナレッジタイプ) が含まれていま す。 以下のコードは、ナレッジビルダーを使いリソース (この例ではクラスパスからのもの) を追加すること で、プロセス定義を1つのみ含んだナレッジベースの作成方法を示しています。 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("MyProcess.rf"), ResourceType.DRF); KnowledgeBase kbase = kbuilder.newKnowledgeBase(); 注記 ナレッジベースのAPIは、同じナレッジベースに対してプロセスやルールなど様々なリソースをほ ぼ同じ方法で追加することができます。こうすることで、Rule Flow Engine の利用方法を知ってい るユーザーであれば、JBoss Rules Fusion をすぐに利用し、さらにはこれらの様々なナレッジタ イプを統合していただくことができます。 4.2. セ ッ シ ョ ン 次に Engine とやりとりを行うためにセッションを作成する必要があります。以下のコードはこれを行う 方法、(IDを使った) プロセスの開始方法を示しています。 StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ProcessInstance processInstance = ksession.startProcess("com.sample.MyProcess"); ProcessRuntim e インターフェースはセッションメソッドすべてを定義します。 ProcessInstance startProcess(String processId); ProcessInstance startProcess(String processId, Map<String, Object> parameters); void signalEvent(String type, Object event); void signalEvent(String type, Object event, long processInstanceId); Collection<ProcessInstance> getProcessInstances(); ProcessInstance getProcessInstance(long id); void abortProcessInstance(long id); WorkItemManager getWorkItemManager(); 4.3. イ ベ ン ト ステートフル および ステートレスナレッジセッション により、リスナーを登録、解除できるメソッドを 36 第4章 API 提供します。ProcessEventListener オブジェクトを使い (プロセスの開始、終了やノードへの出入り など) プロセス関連のイベントをリッスンします。以下にこれに対する様々なメソッドについて表示して います。 public interface ProcessEventListener { void void void void void void void void beforeProcessStarted( ProcessStartedEvent event ); afterProcessStarted( ProcessStartedEvent event ); beforeProcessCompleted( ProcessCompletedEvent event ); afterProcessCompleted( ProcessCompletedEvent event ); beforeNodeTriggered( ProcessNodeTriggeredEvent event ); afterNodeTriggered( ProcessNodeTriggeredEvent event ); beforeNodeLeft( ProcessNodeLeftEvent event ); afterNodeLeft( ProcessNodeLeftEvent event ); } これらのプロセスリスナーが提示する情報に基づき、監査ログを作成することができます。Red Hatは以 下のアイテムを同梱しています。 1. Console logger: これは全イベントをコンソールに出力します。 2. File logger: これはXMLファイルにイベントをすべて出力します。このログファイルは、IDEで利用 され実行時に発生したイベントをツリー表示で生成します。 3. T hreaded file logger: ファイルロガーは、ロガーの終了時あるいはロガーにあるイベント数が所定 のしきい値に到達した場合のみ、イベントをディスクに書き込むため、ランタイム時のデバッグプ ロセス時に利用できません。T hreaded file loggerは、一定の間隔をおいてイベントをファイルに書 き込み、ロガーがリアルタイムで進捗を視覚的に確認できるようにするため、デバッグに有用で す。 KnowledgeRuntim eLoggerFactory を使いロガーをセッションに追加します。 KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger( ksession, "test" ); // add invocations to the process engine here, // e.g. ksession.startProcess(processId); ... logger.close(); 注記 コンソールロガーを作成すると、引数としてロガーに対するナレッジセッションを渡します。 提供すべきファイルロガーには作成予定のログファイル名も必要となります。 threaded file logger にはイベントの保存後の間隔 (ミリ秒単位の)が必要です。 JBDSでAudit Viewからログファイルを開くことができます。ツリー形式のイベントを表示できます (before と after イベントの間で発生したイベントがそのイベントの子として表示されます)。 37 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 第 5章 JBoss Rules IDE 機能 JBDS のJBoss Rules プラグインにより、ビジネス開発者にとって興味深い機能をさらに追加できます。 これらについては本項を参照してください。 5.1. JBoss Rules ラ ン タ イ ム JBoss Rules run-time はJAR ファイルの集合で、JBoss RulesプロジェクトのJARの特定リリース1つを 指します。ランタイムを作成するには、IDEが希望のリリースを参照するようにしなければなりません。 注記 プラグインとして同梱されている最新のJBoss Rulesプロジェクト JARをベースに、新しいラン タイムを作成できます。 注記 デフォルトのJBoss Rules ランタイムを利用中のワークスペース向けに指定する必要があります が、個別のプロジェクトがデフォルトをオーバーライドし最も最適なランタイムが選択されます。 5.1.1. JBoss Rulesランタイムの定義 以下の説明に従い、1つあるいは複数のJBoss Rules ランタイムを定義します。 Window メニューに移動します。 Preferences メニューアイテムを選択します。 設定をすべて含んだPreferences ダイアログボックスが表示されます。 ダイアログボックスの左側のJBoss Rules カテゴリーでInstalled JBoss Rules run-tim esを選 択します。すると、右側のパネルが更新され現在定義されているランタイムをすべて表示します。 新規のランタイムを定義するには、add ボタンをクリックしてください。ダイアログボックスが表示され ます。 ランタイム名とご利用中のファイルシステムの場所までのパスを入力します。 通常、オプションが2つあります。 1. 単に、JBoss Rulesプラグインに含まれているデフォルトの JAR ファイルを使いたい場合 はCreate a new JBoss Rules 5 run-tim e... ボタンをクリックするだけです。 ファイルブラウザーが表示され、ランタイムを作成したいディレクトリを選択するよう促されま す。このプラグインにより必要な依存関係はすべて自動でこのディレクトリにコピーされます。 2. JBoss Rules プロジェクトの特定のリリースを使いたい場合、必要とされるライブラリや依存関係 をすべて含んだファイルシステム上でディレクトリを作成する必要があります。上記の説明のよう に新規JBoss Rules ランタイムを作成する代わりに、ランタイムに名前をつけ、たった今作成した ディレクトリ (ここには必須JARがすべて含まれている) を選択します。 OK ボタンをクリックした後、新たに作成したランタイムが他のものと同じように右側のパネルに表示さ れます。 38 第5章 JBoss Rules ID E 機能 新規作成したランタイムの前にあるチェックボックスをクリックしデフォルトに設定します。(プロジェク ト固有のものを選択しない限り) 今後のJBoss Rulesプロジェクトすべてにおいてランタイムとして利用 されるようになります。 注記 JBoss Rulesランタイムは必要な数だけ追加することができます。 重要 デフォルトのランタイムを変更した場合、IDEを再起動する必要があります。これは、ご自身のプ ロジェクトすべてがこのランタイムを利用するようにするためです。クラスパスは自動更新しま す。 5.1.2. JBoss Rulesプロジェクトにランタイムを選択 (bNew JBoss Rules Project ウィザードを使うか、あるいは Convert to JBoss Rules Project コマンドを使い既存の Java プロジェクトを JBoss Rules プロジェクトに変換することで) JBoss Rules プロジェクトを作成するたびに、プラグインは、必要とされる全 JAR を使用中のプロジェ クトのクラスパスへ自動的に追加します。 作成時に別のランタイムを利用するよう指定しない限りデフォルトのランタイムを使います。ただし、ラ ンタイムはいつでも変更可能です。これを行うには以下の手順に従います。 プロジェクトのpropertiesを開き、 JBoss Rules categoryを選択します。 Enable project specific settings チェックボックスにチェックをつけます。 ドロップダウンリストから希望のランタイムを選択します。 注記 Configure workspace settings... リンクをクリックすると、設定画面に現在インストール されているJBoss Rulesランタイムを表示します。この画面から新しいランタイムを追加すること ができます。 注記 Enable project specific settings チェックボックスの選択を外すと、デフォルトのラ ンタイムが使用されます。 5.2. プ ロ セ ス ス キ ン プロセススキンを使いルールフローノードの外観を管理します。 39 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 注記 ご自身のSkinProviderを実装することで、様々なノード型の外観を変更することも可能です。 BPMN は企業の開発者が業務プロセスをモデル化する際によく利用されている言語です。Red Hatは BPMNスキンを作成し、Rule Flow コンセプトを該当のBPMN表示にマッピングしました。 JBoss Rules Preferencesのダイアログボックスからプロセススキンを変更できます。 エディターを再度開くと、このルールフローが再表示され、新しいBPMNスキンが表示されています。 40 第6章 ビジネスアクティビティの監視 第 6章 ビジネスアクティビティの監視 ルールフローのパフォーマンスをこまめに監視することで異常を検出し対応することができます。Red Hatはリアルタイム分析ツールを提供しており、このツールにより問題が発生すると直接介入、ときには 自動介入が可能となります。 プロセスのエンジン生成イベントをもとにレポートを作成することができます。 6.1. レ ポ ー テ ィ ン グ 履歴ロガーをプロセスエンジンに追加した場合、データベース内の該当イベントをすべて記録します。そ して、この情報を使い、利用中のルールフローのパフォーマンスを分析することができます。JBDS のBusiness Intelligence Reporting Tool (BIRT ) を使い、主要業績指標 (KPI) を元にしたレポートを作成し ます。カスタムレポートを作成するには、所定のデータセット (これには全ルールフロー履歴情報が含ま れているため) とその他追加したいデータソース利用します。 BIRT により、レポートにチャートを含めるよう定義、出力をプレビュー、さらに Web ページとしてエク スポートできるようになります。 シンプルなレポートは、1時間毎のリクエスト数、これらのリクエストの平均完了時間などで構成されま す。この情報を使い、リクエスト数の予期せぬ低下、上昇や、平均処理時間の上昇などをチェックできま す。 6.2. 直 接 介 入 問題を発見した場合ほとんどが、手動介入する必要があります。しかし、状況によっては自動対応を定義 できます。 Rule Flow Engine を監視するには、(プロセスインスタンスの開始や終了、あるいは特定ノードのトリ ガーなど) 関連プロセスイベントを転送するためのリスナーをイベント処理担当のセッションに追加して ください。これは、プロセスを実行したものと同じセッションあるいは個別のものが考えられます。 すると、複合イベント処理 (CEP) ルールを使い、これらのイベントを処理する方法を指定することができ ます。例えば、ローレベルのイベントにある特定のパターンに基づき、よりハイレベルのビジネスイベン トを生成するルールを記述する場合があるかもしれません。これらのルールも特定の状況への対応方法を 指定することができます。 以下はルールの例で、特定の注文ルールーフローに対する過去1時間の起動プロセスイベントをすべて累 積しています。Fusion CEP Engineのスライディングウィンドウ機能を使ってこれを行います。この ルールは、過去1時間でプロセスインスタンスが1000以上開始された場合エラーメッセージが出力さ れます (サーバーのオーバーロードの可能性を検出することが目的)。 注記 実世界では、単にエラーメッセージを生成するのではなく、e-メールやその他の形式の通知を担当 者に送信する方がよいでしょう。 41 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド declare ProcessStartedEvent @role( event ) end dialect "mvel" rule "Number of process instances above threshold" when Number( nbProcesses : intValue > 1000 ) from accumulate( e: ProcessStartedEvent( processInstance.processId == "com.sample.order.OrderProcess" ) over window:size(1h), count(e) ) then System.err.println( "WARNING: Number of order processes in the last hour above 1000: " + nbProcesses ); end これらのルールを使いルールフローの動作をランタイムに自動的に変換することができます。つまり、特 定の状況が検出されるたびに、ルールフローを変更する別のルールをナレッジベースに追加できるので す。 例えば、大量のユーザーリクエストが特定の時間帯に検出されるたびに、別の検証をプロセスに追加し何 らかのフロー制御を強化することで受信リクエストの頻度を減らすことができます。 別のロギングルールを問題検出の帰結としてデプロイすることも可能です。そのような状況が通常状態に 戻るとすぐに、これらのルールは削除されます。 42 第7章 Business Process Model and Notation (BPMN 2.0) 第 7章 Business Process Model and Notation (BPMN 2.0) Business Process Model and Notation (BPMN) 2.0仕様が Rule Flow Engine でのモデル化を図るため Red Hatにより採用されました。BPMN 2.0 は図で業務プロセスの表現方法に関する基準を定義するだけでな く、定義した要素やルールフロー定義の格納 (および共有) の方法を記述する XML形式に実行セマンティ クスを含めます。 Rule Flow Engine を使うと、カスタムのRuleFlow 形式を使ってプロセスを実行できるように、BPMN 2.0 XML 形式を使い定義したプロセスを実行することができます。つまり、同じAPI、エンジン、紺ポーネン トを使い、ご自身のBPMN 2.0 プロセスを実行、管理することができます。 Red Hatは BPMN 2.0 仕様で定義されている全ノード型や属性を実装するに至っていませんが、非常に多 くのサブセットに対応しており、このサブセットには一般的なノード型がすべて含まれています。ここ で、BPMN 2.0 XML 形式を使いすでに実行可能な要素を多数リストアップしています。 フローオブジェクト イベント イベントの開始 (なし、条件、シグナル、メッセージ、タイマー) イベントの終了 (なし、終了、エラー、エスカレーション、シグナル、メッセージ、補償) 中間キャッチイベント (シグナル、タイマー、条件、メッセージ) 中間スローイベント (なし、シグナル、エスカレーション、メッセージ、補償) 中断なし (Non-interrupting) の境界イベント (エスカレーション、タイマー) 中断あり (Interrupting) 境界イベント (エスカレーション、エラー、タイマー、補償) アクティビティ スクリプトタスク (Java あるいは MVEL 表現言語) タスク サービスタスク ユーザータスク ビジネスルールタスク 手動タスク 送信タスク 受信タスク 再利用可能なサブプロセス (呼び出しアクティビティ) 埋め込みされたサブプロセス アドホックサブプロセス データオブジェクト ゲートウェイ 分岐 排他 (Java、MVEL、あるいは XPath 表現言語) 包含 (Java、MVEL、あるいは XPath 表現言語) 並行 イベント準拠型 収束 排他 43 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 並行 レーン データ Java型言語 プロセスプロパティ 埋め込みされたサブプロセスプロパティ アクティビティプロパティ 接続オブジェクト シーケンスフロー ここで、企業の人事部における人事評価プロセス関連の例を挙げています。下の図にあるように、特定の 従業員の評価ルールフローを開始すると、その従業員の自己評価をまず実行しなければなりません。その 後にプロジェクトマネージャーや人事部長もそれぞれの評価フォームを記入しなければなりません。 このプロセスの実行可能バージョンを以下のようにBPMN 2.0 XML 形式でコード化表現しました。 44 第7章 Business Process Model and Notation (BPMN 2.0) <?xml version="1.0" encoding="UTF-8"?> <definitions id="Definition" targetNamespace="http://www.jboss.org/drools" typeLanguage="http://www.java.com/javaTypes" expressionLanguage="http://www.mvel.org/2.0" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" xmlns:g="http://www.jboss.org/drools/flow/gpd" xmlns:tns="http://www.jboss.org/drools"> <process processType="Private" isExecutable="true" id="com.sample.evaluation" name="Evaluation Process" > <property id="employee" itemSubjectRef="_employeeItem"/> <startEvent id="_1" name="StartProcess" g:x="16" g:y="56" g:width="48" g:height="48" /> <userTask id="_2" name="Self Evaluation" g:x="96" g:y="56" g:width="143" g:height="48" > <ioSpecification> <dataInput id="_2_CommentInput" name="Comment" /> <dataInput id="_2_SkippableInput" name="Skippable" /> <dataInput id="_2_TaskNameInput" name="TaskName" /> <dataInput id="_2_ContentInput" name="Content" /> <dataInput id="_2_PriorityInput" name="Priority" /> <inputSet> <dataInputRefs>_2_CommentInput</dataInputRefs> <dataInputRefs>_2_SkippableInput</dataInputRefs> <dataInputRefs>_2_TaskNameInput</dataInputRefs> <dataInputRefs>_2_ContentInput</dataInputRefs> <dataInputRefs>_2_PriorityInput</dataInputRefs> </inputSet> <outputSet> </outputSet> </ioSpecification> <dataInputAssociation> <targetRef>_2_CommentInput</targetRef> <assignment> <from xs:type="tFormalExpression">You need to perform a selfevaluation</from> <to xs:type="tFormalExpression">_2_CommentInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_2_SkippableInput</targetRef> <assignment> <from xs:type="tFormalExpression">false</from> <to xs:type="tFormalExpression">_2_SkippableInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_2_TaskNameInput</targetRef> <assignment> <from xs:type="tFormalExpression">Performance Evaluation</from> <to xs:type="tFormalExpression">_2_TaskNameInput</to> </assignment> 45 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド </dataInputAssociation> <dataInputAssociation> <targetRef>_2_ContentInput</targetRef> <assignment> <from xs:type="tFormalExpression"></from> <to xs:type="tFormalExpression">_2_ContentInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_2_PriorityInput</targetRef> <assignment> <from xs:type="tFormalExpression">1</from> <to xs:type="tFormalExpression">_2_PriorityInput</to> </assignment> </dataInputAssociation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>#{employee}</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <parallelGateway id="_3" name="Diverge" g:x="271" g:y="56" g:width="49" g:height="49" gatewayDirection="Diverging" /> <userTask id="_4" name="HR Manager Evaluation" g:x="352" g:y="96" g:width="225" g:height="48" > <ioSpecification> <dataInput id="_4_CommentInput" name="Comment" /> <dataInput id="_4_SkippableInput" name="Skippable" /> <dataInput id="_4_TaskNameInput" name="TaskName" /> <dataInput id="_4_ContentInput" name="Content" /> <dataInput id="_4_PriorityInput" name="Priority" /> <inputSet> <dataInputRefs>_4_CommentInput</dataInputRefs> <dataInputRefs>_4_SkippableInput</dataInputRefs> <dataInputRefs>_4_TaskNameInput</dataInputRefs> <dataInputRefs>_4_ContentInput</dataInputRefs> <dataInputRefs>_4_PriorityInput</dataInputRefs> </inputSet> <outputSet> </outputSet> </ioSpecification> <dataInputAssociation> <targetRef>_4_CommentInput</targetRef> <assignment> <from xs:type="tFormalExpression">You need to perform an evaluation for #{employee}</from> <to xs:type="tFormalExpression">_4_CommentInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_4_SkippableInput</targetRef> <assignment> <from xs:type="tFormalExpression">false</from> <to xs:type="tFormalExpression">_4_SkippableInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_4_TaskNameInput</targetRef> <assignment> <from xs:type="tFormalExpression">Performance Evaluation</from> 46 第7章 Business Process Model and Notation (BPMN 2.0) <to xs:type="tFormalExpression">_4_TaskNameInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_4_ContentInput</targetRef> <assignment> <from xs:type="tFormalExpression"></from> <to xs:type="tFormalExpression">_4_ContentInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_4_PriorityInput</targetRef> <assignment> <from xs:type="tFormalExpression">1</from> <to xs:type="tFormalExpression">_4_PriorityInput</to> </assignment> </dataInputAssociation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>mary</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <userTask id="_5" name="Project Manager Evaluation" g:x="352" g:y="16" g:width="225" g:height="48" > <ioSpecification> <dataInput id="_5_CommentInput" name="Comment" /> <dataInput id="_5_SkippableInput" name="Skippable" /> <dataInput id="_5_TaskNameInput" name="TaskName" /> <dataInput id="_5_ContentInput" name="Content" /> <dataInput id="_5_PriorityInput" name="Priority" /> <inputSet> <dataInputRefs>_5_CommentInput</dataInputRefs> <dataInputRefs>_5_SkippableInput</dataInputRefs> <dataInputRefs>_5_TaskNameInput</dataInputRefs> <dataInputRefs>_5_ContentInput</dataInputRefs> <dataInputRefs>_5_PriorityInput</dataInputRefs> </inputSet> <outputSet> </outputSet> </ioSpecification> <dataInputAssociation> <targetRef>_5_CommentInput</targetRef> <assignment> <from xs:type="tFormalExpression">You need to perform an evaluation for #{employee}</from> <to xs:type="tFormalExpression">_5_CommentInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_5_SkippableInput</targetRef> <assignment> <from xs:type="tFormalExpression">false</from> <to xs:type="tFormalExpression">_5_SkippableInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_5_TaskNameInput</targetRef> <assignment> <from xs:type="tFormalExpression">Performance Evaluation</from> 47 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド <to xs:type="tFormalExpression">_5_TaskNameInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_5_ContentInput</targetRef> <assignment> <from xs:type="tFormalExpression"></from> <to xs:type="tFormalExpression">_5_ContentInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_5_PriorityInput</targetRef> <assignment> <from xs:type="tFormalExpression">1</from> <to xs:type="tFormalExpression">_5_PriorityInput</to> </assignment> </dataInputAssociation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>john</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <parallelGateway id="_6" name="Converge" g:x="603" g:y="55" g:width="49" g:height="49" gatewayDirection="Converging" /> <endEvent id="_7" name="EndProcess" g:x="690" g:y="56" g:width="48" g:height="48" > <terminateEventDefinition/> </endEvent> <sequenceFlow id="_1-_2" <sequenceFlow id="_2-_3" <sequenceFlow id="_3-_4" g:bendpoints="[295,120]" /> <sequenceFlow id="_3-_5" g:bendpoints="[295,39]" /> <sequenceFlow id="_5-_6" g:bendpoints="[627,40]" /> <sequenceFlow id="_4-_6" g:bendpoints="[627,121]" /> <sequenceFlow id="_6-_7" sourceRef="_1" targetRef="_2" /> sourceRef="_2" targetRef="_3" /> sourceRef="_3" targetRef="_4" sourceRef="_3" targetRef="_5" sourceRef="_5" targetRef="_6" sourceRef="_4" targetRef="_6" sourceRef="_6" targetRef="_7" /> </process> </definitions> 注記 このプロセスを実行可能にするには、現在ある各タスクへのパラメーターなど(つまりルールフ ロー定義の長さなど)全詳細を含める必要があります。 独自のプロセスをBPMN 2.0 形式を使い作成するには、以下のオプションのいずれかを選択してくださ い。 JBDSのJBoss Rulesプラグインウィザードを使い新規のフローファイルを作成し、ウィザードの最後 でJBoss Rules 5.1 code com patibilityを必ず選択してください。これにより、従来の Rule 48 第7章 Business Process Model and Notation (BPMN 2.0) Flow 形式ではなく、BPMN XML 形式を使い新規プロセスが作成されます。 重要 ただし、これは別の属性を依然として利用しているため、本当のBPMN 2.0 エディターではあ りません。しかし、BPMN 2.0 の構文を使いルールフローを保存することはできます。 また、実行エンジンが対応しているノード型や属性すべてに対応しているわけではない点に留 意ください。 Oryx は、オープンソースの Web ベースエディターで BPMN 2.0 形式に対応しています。Red Hat は、BPMN 2.0 ルールフロー表示と編集機能を提供するため、Oryx をJBoss Rulesエンジンに含めて います。(スタンドアローンあるいは統合ツールとして) Oryx エディターを使い BPMN 2.0 プロセスを 作成・編集することができます。 終了すると、実行できるようBPMN 2.0 形式へエクスポートします。 警告 ただし、Orxy はBPMN 2.0 ベータ版1形式を依然として利用しており、(特にインポートやエク スポート機能などの) 実装は不完全である点に注意してください。 XMLをハンドコーディングすることでBPMN 2.0 のプロセスファイルを手動で作成することができま す。 このコードを使いBPMNプロセスをお使いのナレッジベースに読み込んでください。 private static KnowledgeBase readKnowledgeBase() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("sample.bpmn"), ResourceType.BPMN2); return kbuilder.newKnowledgeBase(); } このコードを使いルールフローを実行します。 KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test"); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new WSHumanTaskHandler()); // start a new process instance Map<String, Object> params = new HashMap<String, Object>(); params.put("employee", "krisv"); ksession.startProcess("com.sample.evaluation", params); 7.1. 現 在 の 制 限 49 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 警告 BPMN 2.0 仕様は現在最終段階で、BPMN 2.0 の実行は実験版機能となっています。 仕様が成熟するにつれ、形式を定義するXSDが少し変更する可能性があるため、この形式をご利用 される場合はご留意ください。 ただし、BPMNは同じ実行エンジンを使い Rule Flow 形式として構築します (XML シリアル化形式の一 種)。そのため、RuleFlow 形式で利用可能な機能とコンポーネントはすべてBPMN 2.0 プロセスで機能し ます。お使い中のナレッジベースにBPMN 2.0 プロセスを追加する際に正しいResourceT ypeを使うよう にするだけです。 仕様を利用すると、各要素が同じ形式 (さらには実行セマンティクス) で定義されており、ツール間またエ ンジン間でもプロセスを共有できるため、多くの利点が出てきます。 重要 しかし今の時点では、ツール毎に本仕様の別の中間バージョンを使う可能性が高いでしょう。Red Hatは、この仕様が確定され、皆が同じバージョンを利用した時点でこの問題については時間とと もに解決されると確信しています。しかし、それまでの間はこの件に関する互換性の問題が出てく る可能性があります。 最後にBPMN 2.0 仕様は多くのノード型や属性を定義しますが、BPMN 2.0仕様で提供されているコンスト ラクターのみを使いすべてを表現することは不可能です。これを解決するため、この仕様では別のノード 型、属性などを追加可能です。Red Hatはカスタム拡張の利用を最小限に抑えようとしていますが、重要 と考えられているにも拘らずコアのBPMN 2.0 構文で表現できない機能を記述する際に、追加属性を定義 する必要が出てくる場合もあります。 以下のテーブルで、どのRuleFlow 言語の機能がBPMN 2.0 XML 形式にすでに移植されているかまとめてい ます。緑のチェックはBPMN 2.0 仕様で定義された機能を使い表現できるという意味です。 オレンジのチェックは、Red Hatが実装したカスタム拡張でその機能を利用できるという意味です。 注記 Red Hat は、on-entry や on-exit アクション、state ノードなど、デフォルトで BPMN 2.0 にて表 現可能な機能の実装を遅らせることにしました。 これらの機能の対応がいつ、どのように行われるかについては後日決定していきます。 50 第7章 Business Process Model and Notation (BPMN 2.0) 表 7.1 キーワード 機能 JBoss Rules BPMN JBoss Rules Flow A. プロセスレベル インポート 関数インポート 変数 - Javaプリミティブ型 - Java オブジェクト型 - デフォルト値 スイムレーン 例外ハンドラー - フォルト名 - 変数にバインド - アクション B. ノード 1. 起点ノード - ルールトリガー - シグナルトリガー - パラメーターマッピング 2. 終点ノード - 終了 3. アクションノード - Java 方言 * 変数、グローバル、コンテキス トへのアクセス - MVEL 方言 * 変数、グローバル、コンテキス トへのアクセス 4. RuleSet ノード - タイマー 5. Split ノード - AND - XOR - OR - Java コード制約 - MVEL コード制約 - ルール制約 - 制約名 - 制約の優先順位 6. 結合ノード AND XOR 識別子 51 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド n-of-m 7. ステータスノード - タイマー - on entry アクション - on exit アクション - 自動移行制約 - 手動移行シグナル 8. SubProcess ノード - タイマー - on entry アクション - on exit アクション - 完了まで待機 - 独立 - パラメーターマッピング (in/out) - 動的プロセス id 9. WorkItem ノード - パラメーター - パラメーターマッピング (in/out) - タイマー - on entry アクション - on exit アクション - 完了まで待機 10. タイマーノード - 遅延 - 期間 - スイムレーン 12. 複合ノード - タイマー - on entry アクション - on exit アクション - 変数 - 例外ハンドラー - マルチエントリーポイント - マルチエグジットポイント 13. ForEach ノード - 変数にバインド - 完了まで待機 - マルチエントリーポイント - マルチエグジットポイント 14. イベントノード - 変数にバインド - 内部/外部 52 第7章 Business Process Model and Notation (BPMN 2.0) - イベントフィルター 15. フォルトノード - フォルト名 - フォルトデータ グラフ情報 (x、y、幅、高さ) C. 関連 From, T o From 型 To 型 グラフ情報 (ベンドポイント) 53 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド 第 8章 コンソール 製品に同梱されているWeb コンソールを使いルールフローを管理できます。 JBoss Rules ビルドシステムでは、WAR アーカイブファイルを2種類生成します。これらをアプリケー ションサーバーにデプロイし実行します。 8.1. Process Management Console の 実 行 このコンソールを使うには Web ブラウザーを起動しhttp://localhost:8080/gwt-consoleのアドレスに移動 します。 注記 アプリケーションサーバーのデフォルト設定を変更した場合、アドレスあるいはポート番号が変 わっている可能性があります。 ログイン画面が表示されますので、ユーザー名とパスワードを入力します。 ここでProcess Managem ent Workbench 画面が表示されます。右側に複数のタブがあります。これ はそれぞれプロセスインスタンス管理と報告用となっています。 8.1.1. ルールフローインスタンスの管理 Processes 画面を使い、インストール済みのナレッジベースの一部となっているこれらのルールフロー 定義を確認します。ここで新規インスタンスを開始、管理することができます。 8.1.1.1. ルールフロー定義の確認 Process Definition Listを開くと、JBoss Rulesのデフォルトパッケージに格納されているルー ルフローがすべて表示されます。新規のルールフローインスタンスを起動するか、あるいは特定のプロセ スに所属するルールを検証することができます。 8.1.1.2. 新しいルールフローインスタンスの開始 特定のルールフロー定義に対して新しいインスタンスを開始するには以下の手順を踏んでください。 process definition list; から定義を選択します。 select the process instances タブをクリックします。 Start ボタンをクリックします。 注記 この特定プロセスにフォームが紐付けられている場合、フォームが表示されます。このフォームの 入力を終えると、ルールフローが起動し提示した情報が利用されるようになります。 8.1.1.3. ルールフローインスタンスの管理 process instances タブには指定のルールフロー定義で作動しているインスタンスをすべて表示する テーブルも含まれています。インスタンスを選択し詳細を表示します。 54 第8章 コンソール 8.1.1.4 . ルールフローインスタンスのステータスの確認 特定のルールフローインスタンスのトップレベル変数を確認するには、Instance Data ボタンをクリッ クします。そうすると、各変数とその変数に対応する値が表示されます。 8.1.1.5. ルールフローインスタンス変数の確認 特定のルールフローインスタンスのステータスを確認するには以下の手順に従います。 Diagram ボタンをクリックします。 すると、フローチャートが表示されます。このチャートにある赤い三角が現在有効となっているノードを 指しています。 注記 1つのノードで複数のインスタンスを同時に実行することができます。ただし、これらに対して赤 い三角1つしか表示されません。 8.1.2. レポーティング reporting セクションで、ルールフローの実行レポートを参照できます。以下に示すように、これには 全プロセスの概要を表示する概要レポートが含まれています。 特定プロセスインタンス1つに関するレポートも生成することができます。 ルールフローにはサンプルレポートがいくつか含まれており、これにより (プロセス毎に有効なプロセス インスタンス数など) 実行における一般的な特徴を視覚的に確認しやすくなります。 カスタマイズレポートを作成するには、report ディレクトリにあるレポートのテンプレートファイルを ご自身のバージョンで置き換えてください。 55 JBoss Enterprise BRMS Platform 5 BRMS Rule Flow Component ガイド © 2011 Apacheライセンスバージョン2 (以下「ライセンス」)に従い、当該ライセンスに準拠しないファイルを利 用することはできません。http://www.apache.org/licenses/LICENSE-2.0 のライセンス契約を取得してくだ さい。当該ライセンスの下で提供されたソフトウェアは、書面での同意あるいは準拠法で要請されない限 り、明示あるいは暗示によるいかなる保証や条件なしの「現状」で提供されるものとします。当該ライセ ンスにおける制限や権利については特定言語のライセンスを参照してください。 56 改訂履歴 改訂履歴 改訂 5.2.0-2.4 02 Fri Oct 25 2013 Landmann Rüdiger [FAMILY Given] 2012-07-18 T owns Anthony [FAMILY Given] Rebuild with Publican 4.0.0 改訂 5.2.0-2 Rebuild for Publican 3.0 改訂 5.2.0-1 T hu Sept 30 2011 JBoss Enterprise BRMS Platform向けに更新 Carlon L [FAMILY Given] 改訂 5.2.0-0 初版 Le Sage David [FAMILY Given] T hu Jul 14 2011 索引 シンボル サポート - サポートを受ける, サポートが必要ですか? フィードバック - 本書に対する連絡先情報, フィードバックをお願いします 57