クラウド型 ワークフロー

Questetra と Cacoo の連携プレー(その2)

Questetra BPM Suite から Cacoo の図を新規作成し、その URL を取り込みます。

前回に引き続き、Questetra と Cacoo の連携についてです。

Questetra BPM Suite には、複数人でタスクを処理することを意図した、チームタスクという機能を持っています。業務プロセス上の特定のチームタスクを Cacoo 上で処理し、タスクの成果物として Cacoo 上で作成した図を Questetra BPM Suite に取り込むということを実現します。

「その1」で Cacoo 上に作業場となる図を新規作成できましたので、今回は図の URL を Questetra BPM Suite に取り込み、タスクの処理ユーザに対して案内するところまで説明します。

qbpms-cacoo

ステップ1~2で、Questetra BPM Suite 上のメッセージ送信中間イベント(HTTP)から、 Google App Engine を経由して、Cacoo の API を呼び出しました。Cacoo のAPI の呼び出しで、Cacoo 上に図を新規作成し、その応答から図の URL も取得できます。このまま Questetra BPM Suite に図の URL を返したいところですが、メッセージ送信中間イベント(HTTP) はHTTPの応答を処理することができません。したがって、いったんステップ1の HTTP リクエストを完了させる必要があります。完了させないと、Questetra BPM Suite 上の処理が進んでくれないためです。

そこで別プロセスに 図の URL を引き渡してHTTPリクエストを完了し(ステップ3)、別プロセスから Questetra BPM Suite のメッセージ受信中間イベント (HTTP) を呼び出して、図の URL を渡すようにします(ステップ4)。メッセージ受信中間イベント (HTTP) は、特定の URL にてHTTPリクエストを受けると、業務プロセスを進めることができる自動処理機能です。HTTP リクエストのパラメータの値を受け取って、データに書き込むこともできます。

3.Google App Engine 上で、別プロセスに処理を引き渡す

まず始めに、Google App Engine 上で別プロセスに処理を引き渡すところについて説明します。これにはGoogle App Engine の「タスクキュー」の機能を利用します。タスクキューを使うと、一定時間後に、特定の URL に対して HTTP リクエストを発生させることが、簡単に実現できます。「別プロセスに処理を引き渡す」と言うより、「別の Servlet プログラムへの HTTP リクエストを発生させる」という表現の方が適当かもしれません。その1で添付した Servlet プログラム の一部がそれにあたるのですが、以下に抜粋します。

// Google App Engine のキューに、次のサーブレットを呼び出すタスクを登録。
Queue queue = QueueFactory.getDefaultQueue();
queue.add(withUrl("/callQbpms")
  .param("processInstanceId", processInstanceId)
  .param("diagramUrl", diagramUrl)
  .countdownMillis(60 * 1000)); //60秒遅らせる

複数のキューを使うことができるのですが、今回は1種類しか使わないのでデフォルトのキューを使用しています。

TaskOptions.Builder.withUrl メソッドを使用していますが、これで特定の URL へ HTTP リクエストを行うタスクを、作成することができます。param メソッドで HTTP リクエストを行う際のパラメータを登録、countDownMillis() メソッドで、タスクの実行を遅らせることを指示しています。2つのパラメータは以下の通りです。いずれもステップ4で使用するものです。

  • processInstanceId:Questetra BPM Suite における業務プロセスのID。図のURLを書き渡す対象業務プロセスを表している。
  • diagramUrl: Cacoo 上に作成した図のURL

なおタスクキューを使うためには、WEB-INF 直下に queue.xml を置く必要があります。その内容を以下に記載します。キューの中に貯められたタスクを処理する頻度や、タスクの処理に失敗した場合のリトライ回数や間隔について設定しています。今回のプログラムでは、queue.xml の内容はさほど重要でありません。詳細は割愛します。

<queue-entries>
  <queue>
    <name>default</name>
    <rate>6/m</rate>
    <retry-parameters>
      <task-retry-limit>10</task-retry-limit>
      <min-backoff-seconds>60</min-backoff-seconds>
      <task-age-limit>10m</task-age-limit>
    </retry-parameters>
  </queue>
</queue-entries>

4.図の URL を Questetra BPM Suite に書き戻す

ステップ4のServletプログラムを添付します。ステップ1~3とは、別プログラムになります。ステップ3で指定したHTTPパラメータを解析し、Questetra BPM Suite のメッセージ受信中間イベント (HTTP) に向かって、HTTP リクエストを投げています。以下がメッセージ受信中間イベント (HTTP) に HTTP リクエストを投げる部分の抜粋です。

URL url = new URL(URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
try {
  conn.setDoOutput(true);
  conn.setRequestMethod("POST");

  try (OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), "UTF-8")) {
    writer.write("processInstanceId=" + processInstanceId);
    writer.write("&nodeNumber=" + NODE_NUMBER);
    writer.write("&key=" + KEY);
    writer.write("&data[0].input=" + URLEncoder.encode(diagramUrl, "UTF-8"));
  }

  if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
    throw new IOException(conn.getResponseCode() + ":" + conn.getResponseMessage());
  }
} finally {
  conn.disconnect();
}

今回は単純なリクエストですので、Google App Engine のローレベル API ではなく、Java 標準クラスでリクエストを行なっています。GET でも POST でもいずれでも問題ないのですが、今回は POST でプログラムを書きました。

このステップ4の処理が正常に進むと、以上のようなタスク処理画面を表示させることができます。

 

次回、「その3」では、タスク処理後の後処理、Cacoo で作成した図を Questetra BPM Suite に取り込むことについて説明したいと思います。

あわせて読みたい
15.野望・展望・志 の前の記事 クラウド時代の業務改善
15.野望・展望・志 の次の記事 BPMフォーラム2013 クエステトラ展示ブース編
Hatanaka Akihiro の他の記事 電光掲示板で業務の状況をモニタリングする ~とりあえず1桁~

アーカイブ

 RSS