Pocket

こんにちは、hatanakaです。

業務の中でActivitiというワークフローエンジンを利用する機会に恵まれましたので
これについて何回に分けて記事を投稿しようと思います。

1.ワークフローとシステム開発

皆さんは日々の業務の中で「ワークフロー」という言葉を意識することはあるでしょうか?
「仕事の流れ」という意味でしょうか?
ただ普段「ワークフロー」という言葉で表すことは私の周りではあまり聞かないですね。

では「業務のやり方」だとどうでしょう?「業務手順」でも構いません。
すると少しは身近な言葉になるでしょうか。
申請や承認、稟議を回したりなど決められた手順に沿って
業務を進めることが多いと思います。

当然のことながらその業務を支えるシステムではこういった手順に沿って
オペレーションをできるように設計していきます。

システム開発のプロジェクトではこういった業務手順を「業務フロー」で定義して
設計段階でこれを実現するための設計をしていきます。

2.ワークフローとステータス管理

この業務フローを実現する際、よくあるやり方が「ステータス」を持たせて
その「ステータス」を進めていくという考え方です。

例えば下記の様な業務フローがあったとします。

  1. 事務担当者 : 開設の申し込みを受け付ける。
  2. 事務担当者 :申込者の本人確認を行う。
  3. 上席者 : 本人確認の承認を行う。
  4. 最終承認者:開設の承認もしくは謝絶を行う。

activiti-業務フロー

上記の図にある通り、業務プロセスのステータスを値として表わすと下記のようになります。

  • 1:受付完了
  • 2:申込受付済
  • 3:本人確認実施済
  • 4:本人確認承認済
  • 5:開設承認済
  • (不承認の場合)6:開設謝絶

さらに業務フローの中には差戻しもあります。
差戻しされた場合はステータスの値も差し戻していきます。(例:3:本人確認実施済⇒2:申込受付済)
こういった内容をロジックの中で記載していくわけです。

このステータス管理方法は数値で管理するためわかりやすいという点もありますが、
業務フローの遷移を意識しながら、ステータス値を管理していく必要があります。
そのため各所でステータス値を利用したロジックが生まれることになります。

例えば本人確認の作業を行う機能では、処理対象のデータを取得する際に
「2:申込受付済」のデータを条件に指定して取得します。
更新時にも他の方が処理していないことを担保(※)するため、
更新条件に同じステータスを設定します。

※楽観ロックや担当者が処理中の場合はロックを取得させるなど
 その他の方法もあります。

今回紹介したぐらいの単純な業務フローであれば、これで十分かもしれませんが
より複雑な業務フローになってくるとステータス管理が非常に煩雑となり
見通しも悪くなっていきます。

3.Activiti:ワークフローとBPM管理のプラットフォーム

そこで最近ではこのワークフローを管理するためのプラットフォームとなる
ワークフローエンジンが多数展開されています。
ワークフローエンジンの特徴としては下記の様な項目が挙げられます

  • 業務プロセスのフローおよび状態を管理する。
  • ワークフローを定義するためのモデリングツールが提供されている。
  • 業務プロセスの定義言語(例:BPMN)に対応している。

ここではその中からオープンソースとして提供されている「Activiti」を利用した
ワークフローシステムの開発について何回かに分けて連載をしていこうと思います。

■Activiti BPM Platform
http://www.activiti.org/index.html

Activiti

4.Activiti-Explorerで業務プロセスを動かしてみる

まずはこのActivitiをダウンロードして、実際に動かしてみましょう。
ActivitiにはActiviti Explorerというサンプルアプリケーションが同梱されています。

下記のページにアクセスして、「activiti-5.15.1.zip」を取得します。
http://www.activiti.org/download.html

取得したファイルを展開したディレクトリに「wars」フォルダがあるのを確認できます。
その中にある「activiti-explorer.war」をデプロイしてみてください。
(ここではtomcatにデプロイしたと想定します。)

デプロイ後、下記のURLでアクセスするとログイン画面が表示されます。
http://localhost:8080/activiti-explorer/

activiti-01

Activiti-Explorerにはあらかじめグループおよびユーザが登録されています。
またいくつかの業務プロセスも用意されています。

今回は下記の業務プロセスを実施してみたいと思います。

プロセス名:Vacation Request (休暇申請)
申請者:fozzie
承認者:kermit
※それぞれログインのパスワードは名前と同じです。

ではまず申請者である「fozzie」でログインしてみましょう。
IDとPasswordに「fozzie」を入力します。

ログイン後の画面が表示されたら、上部メニューから「Processes」をクリックします。

activiti-02

登録されているプロセスの一覧が表示されます。
一番下にある「Vacation request」をクリックします。

activiti-03

定義されているプロセスがプロセスダイアグラムとして表示されます。
このプロセスダイアグラムを定義するためのモデリングツールも提供されています。

では申請を開始しましょう。
上部の「Start process」をクリックします。

申請内容を登録します。
適当に入力して「Start process」をクリックします。
ここでは2014/4/14から2日間申請しました。

activiti-04

では申請完了です。
右上の「Fozzie Bear▼」をクリックして「Logout」をしてください。

再びログイン画面が表示されます。
IDとPasswordに「kermit」を入力します。

ログインすると「Queued」が「1」と表示されていることを確認できます。
「Queued」から「management」を選択してクリックします。
fozzieから休暇申請が入っていることを確認できます。

activiti-05

「claim」ボタンをクリックして、担当者を自分にアサインします。
すると画面下部に承認するか、棄却するか選択するプルダウンが表示されます。

activiti-06
「Approve」を選択したまま、「Complete task」をクリックします。

これで休暇申請は無事、承認されました。
fozzieさんは土日含めて、どこか旅行に行くのでしょうか?

最後に

このようにActivitiを利用したワークフローシステムでは、定義した業務プロセスに基づいて
フローと状態を管理することができます。

今回はサンプルのご紹介でしたが次回から実際にシステムに組み込んでいく過程を
何回かに分けてご紹介したいと思います。

それではお楽しみに。

参考情報

Activiti User Guide
Activiti 10minutes Tutorial

http://www.activiti.org/userguide/index.html