SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所

オープンソースのワークフローエンジン「Activiti」チュートリアル

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所 第9回

2)プロセス定義ファイルの作成

 「1.開発対象のアプリケーションについて」の章で説明したワークフローを、「Activiti Designer(プロセスモデリングツール)」を使って描いてみましょう。

補足5

 Activiti Designerの基本的な使い方については、『オープンソースのワークフローエンジン「Activiti」入門』参照してください。

 src/main/resources/bpmn配下にプロセス定義ファイルを作成しますので、bpmnパッケージを右クリックし、下図のように[新規]-[その他]を選択してください。

 下図のように「Activiti Diagram」を選択してください。

 下図のようにファイル名は「transportation.bpmn」としてください。

 下図のように「No, just create an empty diagram」を選択してください。

 以下のように、プロセスフローを完成させてください。

 プロセスフロー全体のIdプロパティに「transportation」を設定してください。

補足6

 余白部分(白い部分)をクリックすると、プロセスフロー全体のプロパティビューを表示することができます。

プロパティ設定の補足
Idプロパティ プロセスフローを一意に特定するためのIDを設定します。
どのプロセスフローをもとにプロセスを開始するのかを指定する際に使います。

 プロセスフロー上の各要素に関するプロパティ設定は、下図を参考に設定してください(各要素をクリックすると、その要素のプロパティビューを表示することができます)。

プロパティ設定の補足
Assignee
プロパティ
タスクを実行できるユーザーを設定します。
${generalAffairsId}という記述は、「プロセス開始時にgeneralAffairsIdという変数で
動的にタスクを実行できるユーザーを割り当てること」を意味します。
条件
プロパティ
シーケンスフローの通過条件を設定します。
${flowCtrl=='APPROVE'}という記述は、
「タスク完了時にflowCtrlという変数の値が"APPROVE"の場合、
このシーケンスフローに流れること」を意味します。

3)プロセス定義ファイルのデプロイ

 「Activiti Designer」で作成した「プロセス定義ファイル」をアプリケーション実行時に利用するためには、事前にActiviti側のテーブルへ登録しておく必要があります。

 transportationプロジェクトに含まれるデプロイツール(DeploymentProcDef)を実行してください。

 DeploymentProcDef.javaを右クリックし、[実行]-[Javaアプリケーション]を選択します。

 デプロイが成功すると、コンソールへ以下のようなメッセージが表示されます。

補足7

 デプロイは、何度実行しても構いません。
 

  • デフォルトでは、最後にデプロイしたプロセス定義ファイルが利用されます。
  • バージョンを指定することで、以前にデプロイしたプロセス定義ファイルをもとにプロセスを開始することも可能です。

4)交通費申請入力画面:[申請]ボタン押下処理の実装

 入力された交通費申請データをDBに登録する処理は、すでに実装されていますが、ActivitiのAPIを使ってプロセスを開始する処理は、実装されていません。

 tutorial.action.paperwork.TransportationInputAction#doApplyメソッド内を以下のようにコーディングしてください。

// ----------------------------------------------------------------------
// TODO ActivitiのAPIを使ってプロセスを開始する処理を実装してください。
// ----------------------------------------------------------------------

// [STEP1] 本申請の「庶務担当者」「マネージャー」を設定します。
Map<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put("generalAffairsId", "messi"); // 庶務担当者
variableMap.put("managerId", "xavi"); // マネージャー

// [STEP2] 交通費申請IDをbusinessKeyとして、
// プロセスを開始します。
runtimeService.startProcessInstanceByKey(
    "transportation",
    Long.toString(transportation.transportationId),
    variableMap);

// ----------------------------------------------------------------------
// ここまで
// ----------------------------------------------------------------------

コードの解説

[STEP1]

 ワークフロー上の「庶務確認」「マネージャー承認」タスクの実行者に割り当てるユーザーIDをMapに格納しています。

 プロセス定義ファイルを作成した際、タスクのAssigneeプロパティに「${generalAffairsId}」と「${managerId}」を設定しましたが、このAssigneeへ割り当てるユーザーIDをこのMapで設定しています。

[STEP2]

 runtimeService(ActivitiのAPI)を使用して、プロセスを開始する処理を実装しています。

  • startProcessInstanceByKeyメソッドの第1引数は、「プロセス定義ファイルのID」です。
  • 第2引数は、「アプリケーション側のデータを一意に特定するためのキー(交通費申請ID)」を渡しています。
  • 第3引数は、[STEP1]で設定したMapを渡しています。

 Activiti APIの仕様は、Activiti - Engine 5.13 APIのサイトを参照ください。

補足8

 「アプリケーション側の申請データ」と「ワークフローエンジン側のデータ」を紐付けるためには、どちらかが相手のキーを保持する必要があります。

 どちらがキーを保持するかは、利用するワークフローエンジンによって異なります。

 Activitiは、ACT_HI_PROCINSTテーブルに"BUSINESS_KEY_"というカラムがあり、ここでアプリケーション側のキーを保持しています。

次のページ
5)交通費申請照会画面:[承認]ボタン押下処理の実装

この記事は参考になりましたか?

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所連載記事一覧

もっと読む

この記事の著者

佐藤 政美(TIS株式会社)(サトウ マサミ)

TIS株式会社 コーポレート本部 戦略技術センター所属。 TISのアプリケーション開発基盤『Xenlon~神龍』の開発および導入支援を中心に活動中。オープンソースのライブラリを活用し、アプリケーションを素早く構築することに興味があり、「開発現場に喜ばれるモノを提供したい!」と日々、Xenlonの改良・機能...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7495 2013/11/27 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー