jBPM5-クイックガイド
JBPMは「JavaBusinessProcessManagement」の略です。オープンソースのフレームワークであるJBoss製品です。先に進む前に、まずビジネスプロセスを定義しましょう。
ビジネスプロセスとは何ですか?
定義上、ビジネスプロセスは、ビジネス目標を達成するために人間やシステムによって実行される、繰り返し可能な順序で実行される一連のタスクです。一連のステップを実行する必要がある順序を(フローチャートを使用して)説明します。ビジネスプロセスは、ビジネスロジックの可視性と敏捷性を大幅に向上させることができます。
例を見てみましょう。次のスクリーンショットは、ほとんどのITプロフェッショナルが関係できるワークフロー/フローチャートを示しています。これは、ほとんどの組織で、パフォーマンスに基づいて従業員を評価するための一般的なプロセスです。

プロセスは次の順序で行われます-
従業員は自分自身を自己評価し、レポートをプロジェクトマネージャーに提出します。
次に、パフォーマンスはプロジェクトマネージャーと人事マネージャーによって評価されます。評価に基づいて、従業員に評価を与えます。
その後、最終的な評価またはパフォーマンスのフィードバックが従業員に中継されます。
このプロセスはほぼすべての従業員に適用できるため、ビジネスプロセスを理解するのに非常に良い例です。これは一連のタスクであり、特定の順序で発生します。
jBPMとは何ですか?
ビジネスプロセスは、組織のフレームワークを理解するための重要な概念です。jBPMのようなテクノロジーは、複雑なビジネスプロセスを効率的に管理するのに役立ちます。JBPMは、ビジネスプロセスを効果的に調整できるツールです。一般に、すべてのエンタープライズレベルのアプリケーションには、特定の順序で実行される一連のタスクがあり、それらのプロセスはjBPMを使用して調整できます。
jBPMの利点は、フローチャートに似ていることです。ビジネスアナリストにも簡単に理解できます。jBPMは、Javaアプリケーションに組み込んで、サービスとして実行できます。
JBPMの特徴
jBPMは、Javaで記述された、軽量でオープンソースの完全に埋め込み可能なプロセスエンジンです。その最も注目すべき機能を以下に示します-
jBPMは、BPMN2.0仕様を使用して設計されたビジネスプロセスを実行します。
jBPMは、Eclipseおよび同様のIDEと完全に統合して、ワークフローを作成するためのドラッグアンドドロップサポートを提供できます。
jBPMには、設計段階からビジネスアナリストやユーザーを巻き込むために利用できるUIツールがあります。
jBPMは、JPAとJTAの助けを借りて、永続性とトランザクション管理をサポートします。
カスタムワークアイテムハンドラーを定義して、後で他のワークフローのコンポーネントとして使用できるユーザー定義タスクを作成できます。
以下は、jBPMプラグインをインストールするための前提条件です-
- Java 1.5(またはそれ以降)SE JDK
- Eclipse4.2または任意のバージョンとjBPMプラグイン
jBPMはJavaで記述されているため、このセクションでは、必要なプラグインを追加する方法について説明します。最大のJavaユーザーがEclipseを使用することを考慮して、EclipseにjBPMプラグインを追加する方法を見てみましょう。
次のリンクからバイナリをダウンロードします- http://download.jboss.org/drools/release/5.3.0.Final/
ここでDroolsを見て混乱しないでください。同じプラグインがjBPMに使用されます。Droolsプラグインをすでにインストールしている場合は、インストール手順をスキップできます。

それをハードディスクに解凍します。次に、Eclipseを起動し、[ヘルプ]→[新しいソフトウェアのインストール]に移動します。

クリック Add Repository −

クリック Local ボタンをクリックし、「... / binarys / org.drools.updatesite」(マシンにダウンロードした場所)を選択します。

選択する Drools and jBPM 次に、をクリックします Next ボタン。

もう一度クリック Next [使用許諾契約の条項に同意します]を選択して、[ Finish。ソフトウェアのインストールが開始されます-

インストールが正常に完了すると、次のダイアログボックスが表示されます-

クリック Yes。Eclipseが再起動します。さあ、Windows → Preferences → Drools → Drools Flow Nodes

上のスクリーンショットに示すようにノードが表示されている場合は、プラグインが正常にインストールされたことを示しています。これで、最初のjBPMプログラムを作成する準備が整いました。
この章では、jBPMを使用して最初のプログラム「HelloWorld」を作成します。以下の手順に従ってください-
[ファイル]→[新規]→[Droolsプロジェクト]に移動します-

クリック Next。最初のプロジェクトに適切な名前を付けます。この場合は「HelloWorld」です。

クリック Next。下の2つのチェックボックスを選択します。
- サンプルのHelloWorldプロセスファイルをこのプロジェクトに追加します
- HelloWorldプロセスをロードして実行するためのサンプルクラスを追加します

クリック Next。[ワークスペース設定の構成]をクリックします(次のスクリーンショットで赤でマークされています)-

クリック Add ボタン−

クリックすると Addボタンをクリックすると、次の画面が表示されます。「新しいDrools5ランタイムの作成」をクリックします

droolsjbpm-tools-distribution-5.3.0.Final.zipをダウンロードしたbinariesフォルダーまでのパスを指定します
次に、インストールされているDroolsランタイムを選択し、 OK。

次の画面が表示されます。クリックFinish ボタン。

次に、Eclipseでパッケージエクスプローラービューを開きます。次の画面が表示されます-

ザ・ ProcessTest.java classは、ruleflow(rf)ファイルをロードするクラスです。 ruleflow.rf HelloWorldプロジェクト用に作成された基本的なルールフローです。
をダブルクリックします ruleflow.rf ファイルを作成すると、次のルールフローが表示されます-

ザ・ GREEN 円はワークフローの開始を示していますが、 RED サークルはワークフローの終わりです。
左側に示されているパネルには、ワークフローで使用されるさまざまなコンポーネントがリストされています。STARTとENDの他に、ワークフローで使用できるコンポーネントがたくさんあります。これらについては、次のセクションで説明します。
STARTイベントとENDイベントの間のHelloはスクリプトタスクであり、スクリプトタスクの名前は次のとおりです。 Hello。スクリプトタスク「Hello」で記述されているコードを確認するには、[Windows]→[ビューの表示]→[その他]→[プロパティ]に移動します。

Note − jBPMでの作業中は、すべての構成がプロパティビューにのみ表示されるため、常にプロパティビューを開いたままにしてください。
クリック OKボタン。ここで、Hello そして、あなたは「こんにちは」イベントのプロパティを見ることができます-

「Hello」イベント内に記述されたコード全体を表示するには、 Action プロパティ。

赤でマークされた円は、アクションプロパティの編集です。[編集]をクリックしたら-

これを編集して、「Hello」スクリプトタスク内で実行するコードを記述できます。編集しましょう−

クリック OK。次に、ProcessTest.javaクラスを開き、Javaアプリケーションとして実行します。以下にその出力を示します-

ProcessTest.javaクラスで使用される用語は、Droolsで使用されるものと同じです。ProcessTest.javaクラスで注意すべき点は-です。
ksession.startProcess("com.sample.ruleflow");
プロセスを開始するためのコードを記述すると、に渡される文字列 startProcess メソッドは、ワークフローを開くときのidプロパティです。

BPMSコアはBPMの中心です。次の図は、BPMSコアとそのコンポーネントを示しています。

セマンティックモジュール
セマンティックモジュールは、言語セマンティック(各単語の意味)と、実行の準備ができているプロセスエンジンの内部構造に対してどのように翻訳されるかを定義します。このモジュールには、基本的にBPMN2言語を理解するための基本事項が含まれています。
プロセスエンジン
プロセスエンジンは、ビジネスプロセスを実際に実行する役割を果たします。プロセスエンジンは、新しいプロセスインスタンスの作成と、各インスタンスの状態の維持を担当します。プロセスエンジンコード内では、プロセス定義に含まれる各アクティビティを表すために内部構造が定義されています。これらのプロセス定義をインスタンス化するために使用されているすべてのメカニズムは、プロセスエンジンで定義されているとおりにそれらを実行します。
永続性とトランザクション
ほとんどのエンタープライズアプリケーションでは、すべての対話はトランザクション境界内で実行する必要があり、さまざまなシステム、API、および設計を処理する必要があります。また、-を定義するための柔軟なメカニズムが必要です。
長時間実行されるプロセスを処理する方法
プロセスステータスに関する情報とプロセスが処理している情報をいつどのように保存できるか
プロセスエンジントランザクションを作成、コミット、またはロールバックする必要がある方法とタイミング
すでに実行されたビジネスアクションをロールバックまたは補正できるビジネス例外
上記のすべてのポイントは、jBPM内の永続性およびトランザクションコンポーネントによってカバーされます。
監査/履歴ログ
このモジュールは、プロセスがどのように実行されているかをユーザーに照会する方法を提供します。この情報には、すでに終了したプロセスに関する履歴情報と、実行中のプロセスに関する最新情報が含まれます。
Business Activity Monitoring (BAM) ツールと情報ダッシュボードは、このモジュールによって生成される情報の最も一般的なクライアントの一部です。 The Audit/History Logs モジュールは通常、この情報を適切に表示するように設計されたさまざまなツールと連携する有用な情報とメトリックを抽出するために使用されます。
次のスクリーンショットは、jBPM 5で使用可能なさまざまなワークフローコンポーネントを示しています。これらのコンポーネントを使用して、プロセスを調整するワークフローを作成できます。

カスタムタスクを作成することもできますが、それについては後で説明します。さらに、プロセスを調整するために使用できるサービスタスクが利用可能です。
Start Event−これはすべてのプロセスで実行される最初のノードです。プロセスに存在できる開始ノードは1つだけです。
End Event−このノードは、プロセスの終了を通知します。プロセス内でこのタイプのノードが複数発生する可能性があります。
Rule Task −同じ名前のスコープの下にあるDroolsルールのグループであるRuleFlowグループを評価するノードです。
Gateway (diverge) aka Split−この特定のノードは、プロセスに新しいパス/ウェイを作成します。2つ以上の発信接続があります。利用可能なスプリット/ゲートの3つの異なるタイプから選択できます。
AND GATE −プロセスのフローがすべての発信接続に同時に続く場合。
XOR GATE −ワークフローで定義されたいくつかの事前定義された制約に従って、1つの発信パスのみに送信されます。
OR GATE −すべての発信制約の評価に基づいてフローが進行し、制約がtrueと評価された場合にそのパスが有効になる場合。
Gateway (converge) aka Join−この結合は分割の逆です。複数のパスを1つに結合します。結合/ゲートには4つの異なるタイプがあります-
AND −すべてのブランチが完了すると、フローが続行されます。
XOR −フローは、少なくとも1つのブランチが完了すると続行されます。
Discriminator− XORと同様に、ブランチの1つが完了した場合も続行します。ただし、XORとは異なり、すべての接続が完了するまで、他のブランチの完了を登録します。それが発生すると、ノードはリセットされ、着信ブランチがアクティブになり、サイクルが最初からやり直されると、ノードに再び入ることができます。
N-of-M −フローは次の場合に継続します n の数 mブランチが完了します。指定する必要がありますn (番号)フローが終了する前に完了する必要のあるブランチの数に関するゲートの構成中。
Reusable Sub-Process−別のプロセスを呼び出します。これは、いくつかの小さなプロセスを大きなプロセスに構成するのに非常に便利です。この大きなものは、調整プロセスになる可能性があります。呼び出し先が完了するのを待機し、その親の独立したライフサイクルを持つように呼び出しプロセスを構成できます。
Script Task −単純なコードを実行できるノード。
Timer Event−このタイプのノードはタイマーを開始し、タイマーの期限が切れるとトリガーされます。時間関連のプロセスと反復タスクを有効にします。
Error Event−この種のノードは、プロセスのエラー状態を示します。発信接続はありません。これは、FaultNameとFaultVariableを指定します。エンジンは、FaultNameに一致する例外ハンドラーを検索し、FaultVariableで定義された変数にFault情報を格納します。
Message Event−事前定義されたタイプのイベントが発行されたときにトリガーされます。これは、内部イベント(プロセス内で通知される)または外部イベント(プロセスエンジン以外の外部エンティティによって通知される)のいずれかです。
User Task−ヒューマンタスクを作成するノード。このヒューマンタスクは、人間のアクターが完了する必要のあるアクティビティです。
Embedded Sub-Process−親プロセス内にサブプロセスを作成するのに役立ちます。独自のスコープを持つことができます。これは、いくつかの複雑なブランチを分離したままにしたい大規模なプロセスに役立ちます。独自の変数と例外ハンドラーを持つことができます
Multiple Instances aka for Each−要素のコレクションをサブプロセスにフィードできます。再利用可能なサブプロセスと組み合わせて、より小さなプロセスを構成および調整する場合に非常に役立ちます。
ワークフローを描画するには、上記の記事で説明されているように、パレットで使用可能な任意のコンポーネントを使用できます。すべてのワークフローの開始は1つですが、終了は複数にすることができます。
スクリーンショットの助けを借りて、ワークフローを作成する方法を説明します。
ここで、私は空白を開きました rf または bpmn ファイル

イベントを追加するには、コンポーネントパレットから特定のイベントを選択し、右側にドラッグアンドドロップします。たとえば、開始イベントを選択し、それを右側と分岐ゲートウェイにドラッグしました。

次に、2つのコンポーネントを接続する必要があります。シーケンスフローを選択し、2つのコンポーネントを接続します。


このようにして、コンポーネントをエディターにドラッグし、シーケンスフローを使用してさまざまなコンポーネントを結合できます。一部のコンポーネントには1つの着信接続と1つの発信接続のみがあり、それに応じてシーケンスフローを設定して、意味のあるフローを作成する必要があることに注意する必要があります。
ワークフローを描画するときに、いくつかのプロパティも設定する必要があります。ここに設定するすべてのプロパティを投稿します。フローを作成したばかりですが、作成したワークフローにプロパティを設定していないため、最初にフローを確認することはあまり意味がありません。

上記のように、これは説明のない空白のワークフローであり、作成されたワークフローから何も理解できません。
ただし、さらに説明するために、開始コンポーネントと分岐ゲートウェイがあり、分岐ゲートウェイの状態に応じて、1つの方法を選択し、スクリプトタスクでコードを実行して、ワークフローを終了します。したがって、発散ゲートウェイ、次にスクリプトタスク、および収束ゲートウェイのプロパティを設定する必要があります。
この段階で、ワークフローにエラーがあることも示します。後で、プロパティを設定するとワークフローにエラーがないことを示します。したがって、作成されたワークフローを検証する方法を示します。
ヒント-バリデーターはWindows→設定→検証でオンになっていることを忘れないでください
以下のスクリーンショットは、Eclipseの設定を示しています。


スクリーンショットのとおり、4つのエラーがあることがわかります。最初のエラーは、スクリプトにアクションがないことを示し、別のエラーは、ゲートウェイの定義にタイプが定義されていないことです。したがって、ワークフローを実行できるようにするには、これらのエラーを削除する必要があります。
プロパティを1つずつ設定し、エラーが消えていくのを確認します。
最初のゲートウェイ(発散)を選択し、プロパティをクリックしてから、タイプをクリックして、要件に応じてゲートを選択します。

ゲートウェイを選択したら、制約を選択する必要があります。

赤でマークされた円をクリックすると、下のスクリーンショットが表示されます

編集をクリックして、スクリーンショットに従って詳細を入力します-


[インポート]をクリックして、操作を実行するクラスをインポートします。スクリーンショットでは、例で使用する乗客POJOをインポートしています。

同様に、別の制約の詳細を入力します-

次に、をクリックします OK ボタン。

もう一度クリックします OK。ここで、スクリプトタスクを選択し、分岐ゲートウェイの場合と同じプロセスを実行します。
フローを示すためにSOP(printステートメント)を追加しました。スクリプトタスクでは、任意のJavaまたはmvelコードを記述できます。

同様に、2番目の制約のコードを追加します-

最後に、分岐ゲートウェイのゲートウェイタイプを追加する必要があります。

次に、ワークフローファイルを保存して、問題ビューに移動します。すべての問題が解決されます。

問題ビューにエラーがないということは、作成されたワークフローにエラーがないことを示しています。これは、ワークフローが作成され、jBPMで検証される方法です。
この章では、jBPMを実践する方法を説明するために例を取り上げます。当面のタスクは、jBPMを使用して、収入に応じて乗客が飛行機に乗るか電車に乗るかを決定することです。
プロジェクトを作成する手順は、「HelloWorld」プロジェクトの手順と同じです。エディターで.rfファイルを開き、赤でマークされた変更を確認します-

ここでは、乗客の収入に基づいてルートを決定するため、ルールフローID(一意)を変更し、可変収入を追加しました。
How to set variable −赤でマークされた編集ボタンを選択します。

クリック Add ボタン−

次の画面がポップアップします-

名前を収入として入力し、入力を整数として入力します。

クリック OK。これで定義された収入変数が表示されます。

ProcessTest.javaクラス(プロセスをロードして実行するクラス)で行われる変更-

Map<String, Object> params = new HashMap<String, Object>();
params.put("income", 1200);
// start a new process instance
ksession.startProcess("vivek.ruleflow", params);
MAPを作成し、MAPに値を設定して、この値をstartProcessオーバーロードメソッドに渡す必要があります。示されているように、ルールフローIDを変更したため、startProcessメソッドで同じID(vivek.ruleflow)を使用しました。
ProcessTest.javaクラスを実行する前に、ProcessTest.javaと同じパッケージにPOJOPassenger.javaを作成します。
public class Passenger {
private String name;
private int income;
Getters and setters here
}
ここで、ProcessTest.javaクラスをJavaアプリケーションとして実行し、出力を確認します-

Change the value− params.put( "income"、900); クラスを再実行して、出力の変化を確認します。
