ビジネスプロセス管理アプリ - プロセスのスタート

Red Hat で主にMiddlewareのプリセールスをやっている梅野です。

いわゆるBPMツールである、Red Hat Business Process Manager 7(以下RHPAMと略します)について書いていきます。 普通なら製品の紹介とかインストールの方法などから入るのでしょうけど、その辺りは我々の活動でご紹介させていただいたりドキュメントに書いてあったりしますので、そちらを御覧くださいまし。そのうちこちらで紹介するかも...

なぜRHPAMについて書くかというと、昨年くらいからLegacyな基幹システムを刷新したいというお客様が増えてきています。基幹システムは業務の根幹を成すわけですが、業務をシステム化すると、入出力・データ・プロセス・ルール に分類することができます。これらを疎結合にして単体で管理しやすく作らないと、刷新したシステムがリリースと同時にレガシー化という悲しい運命をたどり、業務のお荷物とまで言われかねません。折角新しく作るのですから、時代や業務の変化に柔軟に対応できるものにしておく必要があります。そうすると、プロセスの部分がRHPAM、ルールの部分がRed Hat Decision Manager、データの部分(特に高速バッチやオンライン系)でRed Hat Data Grid、システム関連系でRed Hat Fuseがそれぞれ役割の担い、アプリ構築の高速化や柔軟性の確保に一役たちます。

ということで、ここではRHPAMについて書いていこうと思った次第です。 特にこだわりのない限り、RHPAM Version 7.1.1 をベースに書いています。

PAMでプロセスを記述

RHPAM では、BPMN2.0の標準に則ったプロセスとタスクの絵を書くことができます。 例えばこんな感じ。

f:id:mumeno:20190201135038p:plain
プロセスの絵

製品の中にある、Business Central というWebのツールで書くことができます。

今回のフォーカスするのは、このプロセスの描き方ではなく、書いたは良いけどどうやって呼ぶの? というところです。細かい説明は後ほどということで。

このプロセスの絵を製品に含まれるRHPAMの実行環境、KieServerにdeployすることで、タスクの進捗状況を管理することができます。 RHPAM自体は業務アプリケーションではないので、このプロセスをで進捗を管理するためには、アプリからKieServerをcallする必要があります。

KieServerとアプリの関係

KieServerはPAMの実行環境になり、プロセスの進捗状況を管理・レコードする役割になります。

アプリから実行には3タイプあります。

  1. アプリ側でKieService を作成してcontainerをアプリ側で動かし、KieServerへ"報告"する
  2. KieServer 側にあるcontainerへREST API経由でcallするJava Client API for Kie Containerを使う
  3. KieServer 側にあるcontainerへアプリからREST APIを直接呼び出す

  4. はRHPAM (Version 7) がRed Hat JBoss Business Process Manager 5からのやり方で、containerをアプリ側で作成、実行する必要がありました。Kie container command方式。

  5. は実行側をKieServer側で行い、アプリは単なるClientになりきります。通信はRESTで行い、メッセージタイプはjsonもしくはXMLで交換可能です。
  6. はJavaではない環境などから直接REST APIを呼ぶ形式です。

RHPAMからはREST APIが充実しましたので、RESTでの利用を推奨します。 以下では 2. と 3. について実装の違いを紹介します。

REST API for Kie Containers を呼び出す

まずは3. の REST API を呼び出すときのやり方です。

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
...

String SERVERURL = "http://localhost:8080/kie-server/services/rest/server";
String USER ="rhpamAdmin";
String PASSWORD = "PASSWORD";
String CONTAINER = "Seal_1.0.0";
String ProcessID = "Seal.Seal_Process";

 //Process Variable として送りたいものをjson形式で用意しておく
String jsonString ="{\"EmailAddress\":\"ahaha@ehehe.ohho\"}" 

URL url = new URL(SERVERURL + "/containers/"+ CONTAINER + "/processes/" + ProcessID + "/instances");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
final String userPassword = USER + ":" + PASSWORD;
con.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString(userPassword.getBytes()));
con.setRequestMethod("POST");
con.setRequestProperty("content-type", "application/json");
con.setRequestProperty("accept", "application/json");
con.setUseCaches(false);
con.setDoOutput(true);

OutputStreamWriter out = new OutputStreamWriter(new BufferedOutputStream(con.getOutputStream()));
out.write(jsonString);
            
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            
con.connect();
            
String line = in.readLine(); // 戻りのjsonを受ける
String body = "";
            
while (line != null) {
body = body + line;
line = in.readLine();
}
 
con.disconnect();
System.out.println("body:"+body);

ベタにHttpURLConnection を呼んでやっているので、ガチでやるならエラーハンドリングやらタイムアウトやらも書かなければいけません。 json文字列も、こんな簡単な例ならよいですが、多階層になっていると面倒です...

Java Client API for Kie Containers を使う

RHPAMで用意されている Java Client API for Kie Containerを使う方法です。

import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.client.KieServicesClient;
import org.kie.server.client.KieServicesConfiguration;
import org.kie.server.client.KieServicesFactory;
import org.kie.server.client.ProcessServicesClient;

import java.util.Map;

....


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 を作成
KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(SERVERURL, USER, PASSWORD);
config.setMarshallingFormat(FORMAT);
KieServicesClient client = KieServicesFactory.newKieServicesClient(config);
ProcessServicesClient processServicesClient = client.getServicesClient(ProcessServicesClient.class);
           
//投入したいデータをMap形式で作成        
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("EmailAddress", sd.getApplicantEmail());
variables.put("DocumentName", sd.getDocumentName());

// startProcess RESTAPIを呼び出します。戻り値としてProcess Instance IDが返る
long processInstanceId = processServicesClient.startProcess(CONTAINER, ProcessID, variables);

System.out.println("Process Instance ID:"+processInstanceId);

Process Instanceが作成されると、Processとして記述したtaskまで自動的に進みます。TaskがHumantask等、何かのトリガーが必要なところまでは自動的に進み、そこで停止し、トリガーを待ちます。 KieServerへのアクセス設定はどうしても必要ですが、RESTに必要なKieServiceClient を作り、そのインスタンスから processServiceClientを生成しています。 必要な手続きなどはAPI内に隠蔽されているので、単純にREST APIを呼び出すよりは Java Client API for Kie Container の利用を強くお勧めします。

次回はタスクリストを取得するところをご紹介します。

うめの(id:mumeno)

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません