ビジネスプロセス管理アプリ - タスクの実行

Red Hatの梅野です。

前回の記事は、タスクのリストを表示させるために必要なソースをご紹介しました。 今回はタスクを実行するところをご紹介します。

タスクとは

タスクにはいろいろな種類がありますが、全てのタスクの役割は同じで、「誰にアサインされたか」「いつからこの仕事を行ったか」「いつこの仕事を終えたか」を記録するものです。 タスクはアサインされた人しか実行できません。タスクのアサインは、Business Central上のプロセスを設計するツールより設定できます。

f:id:mumeno:20190213155756p:plain
Taskのアサイン

アクターのところに、Business Centralに登録してあるユーザを指定します。 アクターの人が病気等で仕事ができない状況の場合、仕事が止まることを意味します。そうすると困った状況になりますので、独裁的承認がどうしても必要等の特段の理由のない限り、ここはBusiness Centralに登録されているグループを指定しておくのが良いです。グループには複数のユーザーを登録することができます。

グループの指定の方法はまた別途ご紹介するとして、今回はシンプルにユーザをここで指定しておきます。

タスクの開始

タスクを開始するには、下記のような実装が必要です。

String SERVERURL = "http://localhost:8080/kie-server/services/rest/server";
String USER ="rhpamAdmin";
String PASSWORD = "PASSWORD";
MarshallingFormat FORMAT = MarshallingFormat.JSON;
String CONTAINER = "Seal_1.0.0";
String ProcessID = "Seal.Seal_Process";     
        
KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(SERVERURL, USER, PASSWORD);
config.setMarshallingFormat(FORMAT);
KieServicesClient client = KieServicesFactory.newKieServicesClient(config);

ここまでは前回と同じです。(これ以降はこの共通部分は省略します)

UserTaskServicesClient taskClient = client.getServicesClient(UserTaskServicesClient.class); 
taskClient.startTask(ContainerID, TaskID, UserID);

ContainerID と TaskID と UserID は、前回紹介したTask Listから取得して渡してください。 TaskID はlongである必要があります。UserIDはこのタスクを実行するユーザーで、Business Centralで登録されている必要があります。TaskListが取れている時点でUserIDはわかっているかと思います。

タスクの終了

タスクを終了するには、下記のような実装が必要です。

taskClient.completeTask(ContainerID, TaskID, UserID, null);

何か残したい場合は、4つ目の引き数にMap<String, Object> 型で渡してあげるとtaskVariableとして記録されます。承認行為の時の申し送り的な使い方になります。

タスクを一気に終了

通常は、作業を開始するときにタスクの開始、作業を終了するときにタスクの終了を行い、そのタスクにどれだけの時間が掛かったのかを統計的に取得し、業務の効率化を目指すものです。なので、start / end を別個に呼ぶことが必要ですが、画面を一瞬見ればわかる等、人間側か2回アクションしたくないときもあります。その場合、下記のような実装をすることで、自動的にstart / end を呼んでくれ、1アクションで済むことがあります。

taskClient.completeAutoProgress(ContainerID, TaskID, UserID, null);

Process Automation Managerの中では、あくまでも Start - End を記録します。このAPIを呼び出すと、後続にある停止すべきノードで止まります。停止すべきノードとは、Human TaskやEnd node等です。 これを行うと、各タスクのStart - End にかかる時間は数ミリ秒となり、人的作業でどれくらい掛かったかはわからなくなります。統計情報が必要な場合は、completeAutoProgress ではなく、startTaskとcompleteTaskを呼ぶように実装します。

使う上での注意

ご紹介したとおり、Process Automation Manager は、全てのタスクやノードにて、必ず「Start」「End」が記録されます。普段見ることは無いと思いますが、PAMが使用するDBの中の"nodeinstancelog" テーブルに全て記録されます。つまり、PAMというアプリケーションが毎回DBに記録に行くため、パフォーマンスはPersistenceであるDBの速度に大きく依存します。応答速度は超高速とは言えません。従って、同時接続数や必要な応答速度をよく検討した上で、マシンのスペックやサブスクリプションのCore数を決定する必要があります。 また、プロセス内での各タスクのトランザクションは保証されますが、RESTや他のDB等、外部連携タスクを利用した場合のXAには対応していません。なので、「サービス連携」をPAMで行おうとすると、commitに失敗した場合の復旧策は製品にはありません。PAMを「サービス連携基盤」と考えるのは間違った使い方になります。サービス連携でトランザクション保証が必要な場合は、Red Hat Process Automation ManagerではなくRed Hat Fuseを利用してください。

PAMはあくまでも、「申請・承認行為が必要なビジネスの流れにおいて、各案件の状態を一元的に管理する」という使い方になります。

次回はTaskをGroupでの指定した場合の方法をご紹介します。

うめの(id:mumeno)

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。