Activiti日本語情報ブログ

OSSのBPMエンジン Activitiの日本語情報をまとめています。

【Activiti開発入門】ビジネスロジックの作成

概要

今回の入門記事では、Javaを利用して任意のビジネスロジックを記述できるJava Service Taskをご紹介します。Java Service Taskの詳細な仕様に関しては、「Activiti User Guide 8.5.3. Java Service Task」をご参照ください。 http://www.activiti.org/userguide/#bpmnJavaServiceTaskXML

f:id:lalalafrance:20161023141133p:plain

ステップ

  1. ビジネスロジックの実装

    JavaDelegateインターフェースを実装したクラスを作成し、ビジネスロジックを作成します。

  2. ビジネスロジックを呼び出すフローの作成

    1で作成したビジネスロジックを呼び出すService Taskをフロー上に配置します。

ビジネスロジックの作成

クラスパスの通し方

  1. 「Activiti Project」の作成

    BPMのフロー開発と同じく、ビジネスロジックもActiviti Project上で開発します。Activiti Designer(eclipse)上でActiviti Projectを作成します。

  2. Java Build Path」の設定

    作成したActiviti Projectに対してビルドパスを設定します。Activiti ProjectはMavenプロジェクトの形式になっていますが、eclipseMavenプロジェクトの形式としては不完全でMaven経由のビルドパスが通らないため、直接jarファイルをビルドパスに追加することでeclipse上のクラスパスを解決します。

    Activiti Project上で右クリックし、プロパティ画面を表示します。「Java Build Path」を設定し、「Add External JARS」を押下し、「activiti-engine-5.21.0.jar」を選択します。

    f:id:lalalafrance:20161023143254p:plain

ビジネスロジックの実装

  • 通常のMavenプロジェクトのような感じで、Javaクラスを追加します。クラスの追加時に、org.activiti.engine.delegate.JavaDelegateインターフェースを選択します。

    f:id:lalalafrance:20161023144808p:plain

  • クラス内に任意の業務処理を記述します。

package sample_java_service;

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;

public class SampleJavaDelegate implements JavaDelegate {

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        /*
        *  任意の業務処理を記述します。
        */
    }

}
// 変数の取得
String value = (String) execution.getVariable("sampleVar");
// 変数の更新
execution.setVariable("sampleVar", "aaa");
  • JavaDelegateのインスタンスはプロセス定義ごとにキャッシュされるため、同一のプロセス定義から生成されたプロセスインスタンス間で共有されます。スレッドセーフな実装になるようにしてください。

ビルド(パッケージング)とデプロイ

  • 作成したクラスを含むjarファイルをビルドします。Activiti ProjectはMavenプロジェクトの形式になっているので、Mavenのコマンドを実行するだけでjarファイルを作成可能です。

    f:id:lalalafrance:20161023145232p:plain

  • ビルドしたjarファイルは、Activitiを動作させるWebアプリケーションに同梱します。

  • Activitiのエンジンでは、独自のクラスローダを差し込む仕組みも提供しているため、例えばActiviti Projectから生成したデプロイメントにクラスを同梱してデプロイするような仕組みも作成可能ですが、今回は紹介しません。 http://activiti.org/javadocs/org/activiti/engine/ProcessEngineConfiguration.html#setClassLoader-java.lang.ClassLoader-

ビジネスロジックを呼び出すフローの作成

ここでは、「ビジネスロジックの実装」で作成したクラスを呼び出すだけのフローの作成方法をご紹介します。

  1. Activiti Diagramを作成し、フローのデザイナー画面を表示します。

  2. 以下のアイコンを配置します。

    • 「Start Event」カテゴリから「StartEvent」を配置します。
    • 「Task」カテゴリから「Service Task」を配置します。
    • 「End Event」カテゴリから「EndEvent」を配置します。
  3. 以下のように線を引きます。

    • 「StartEvent」から「Service Task」へ線を引きます。
    • 「Service Task」から「EndEvent」へ線を引きます。
  4. 起票者を設定します。

    • デザイナー上のアイコン以外の箇所をクリックします。
    • Propertiesタブの「Candidate start users」に任意のユーザを設定します。
  5. Service taskを設定します。

    • デザイナー上の「Service Task」のアイコンをクリックします。
    • 「Main config」タブのClass name属性に「ビジネスロジックの実装」で作成したクラス名を設定します。

    • 「General」タブのAsynchronous属性にて同期・非同期の設定を行います。デフォルトの設定では、Service Taskで設定したJavaクラスの処理はフロー上で手前に配置されているアクティビティと同一のスレッドから呼び出されます。例えば、User Taskの直後にService Taskを配置し、同期の設定にした場合は、User Taskを操作しているユーザは、Service Taskの処理の完了を待ちます。Service Taskで時間がかかる処理を行う場合には、Asynchronous属性をオンにして、処理が非同期スレッドにて実行されるようにしてください。

  6. フローを保存・ビルドし、出力されたbarファイルをActiviti Explorerにデプロイします。

サンプルフロー

ユーザタスクで入力した文字列が数値形式かどうかチェックして、数字でない場合はエラーを返すだけのサンプルを以下のページで公開しています。 https://github.com/daisuke-yoshimoto/sample_java_service

上記のリポジトリのサンプルコードはシンプルさを重視しています。 実際の開発・運用において必ずしも適切な実装ではありません。参考にされる場合は、十分ご注意ください。

[追記]

JavaDelegateインターフェースを実装したクラスは、Service Taskに対して1インスタンスのみ生成され、全てのプロセスインスタンスの間で共有されます。そのため、スレッドセーフに実装する必要があります。

【Activiti EL式】リスナーのEL式でプロセスの変数にシステムパラメータを書き込む

(例)プロセスインスタンスIDを変数に格納する。

1. 開始イベントのリスナーに以下を追加する。

  • イベント「start」

  • タイプ「式」

${execution.setVariable("process_instance_id", execution.getProcessInstanceId())}

2. プロセスの開始時に変数にプロセスインスタンスIDが格納される。

【Activitiはまりポイント】デフォルトフローの仕様

Inclusive GatewayやExclusive Gatewayの設定でデフォルトフローが設定できるが、こちらで選択したフローは他のフローが選出されない場合有効である。 デフォルトフローの条件は無視される。

http://www.activiti.org/userguide/#bpmnDefaultSequenceFlow

【Activiti入門】並行ルートの作成

概要

前回の入門記事では条件分岐のルートを紹介しましたが、今回は並行ルートを扱います。 並行ルートとは、同時に異なるユーザタスクが割り当てられるルートのことです。

f:id:lalalafrance:20160428212458p:plain

ステップ

  1. 並行ルートを実現するには、「ParallelGateway」のアイコンを利用します。

    • Gateway」カテゴリにある「ParallelGateway」を利用することで、並行なルートを引くことが可能です。

      http://www.activiti.org/userguide/#bpmnParallelGateway

    • 「ParallelGateway」から各「UserTask」へのシーケンスを引くことで、各「UserTask」ごとに並列にプロセスが動作します。

    • 各「UserTask」から「ParallelGateway」へシーケンスを引くことで、並行に実行されていたプロセスが結合します。各プロセスが完了するまで待ち合わせを行います。

フローの作成

では、実際に並行ルートを実現するフローを作成していきます。

  1. Activiti Diagramを作成し、フローのデザイナー画面を表示します。

  2. 以下のアイコンを配置します。

    • 「Start Event」カテゴリから「StartEvent」を配置します。
    • Gateway」カテゴリから「ExclusiveGateway」を配置します。
    • 「Task」カテゴリから「UserTask」を2つ配置します。
    • Gateway」カテゴリから「ExclusiveGateway」を配置します。
    • 「End Event」カテゴリから「EndEvent」を配置します。
  3. 以下のように線を引きます。

    • 「StartEvent」から「ParallelGateway」へ線を引きます。
    • 「ParallelGateway」から2つの「UserTask」へそれぞれ線を引きます。
    • 2つの「UserTask」からそれぞれ「ParallelGateway」へ線を引きます。
    • 「ParallelGateway」から「EndEvent」へ線を引きます。
  4. 起票者を設定します。

    • デザイナー上のアイコン以外の箇所をクリックします。
    • Propertiesタブの「Candidate start users」に「fozzie」を設定します。
  5. 処理対象者を設定します。

    • デザイナー上のユーザタスクの1つ目をクリックします。
    • Propertiesタブの「Main config」-「Assignee」に「kermit」を設定します。
    • デザイナー上のユーザタスクの2つ目をクリックします。
    • Propertiesタブの「Main config」-「Assignee」に「gonzo」を設定します。
  6. フローを保存・ビルドし、出力されたbarファイルをActiviti Explorerにデプロイします。

フローの実行

  1. fozzie/fozzieでActiviti Explorerへログインします。

  2. 「プロセス」からデプロイしたフローを選択します。

  3. 「プロセスの開始」を押下し、プロセスを開始します。

  4. kermit/kermitでActiviti Explorerへログインします。

  5. 「ケース」-「受信トレイ」にタスクがあります。

  6. 「タスクの完了」を押下し、タスクを完了させます。

  7. gonzo/gonzoでActiviti Explorerへログインします。

  8. 「ケース」-「受信トレイ」にタスクがあります。

  9. 「タスクの完了」を押下し、タスクを完了させます。

  10. fozzie/fozzieでActiviti Explorerへログインします。

  11. 「プロセス」-「マイ・インスタンス」から開始したフローが完了していることを確認します。

f:id:lalalafrance:20160428212516p:plain

注意

  • ParallelGatewayに接続されるシーケンスの条件は、評価されません。条件の設定は、無視されます。

[追記]

この記事では、並列に動作しているプロセスをParallelGatewayで再度結合し待ち合わせを行っていますが、結合しない場合は各プロセスが終了まで並列に動作します。

f:id:lalalafrance:20170416003923p:plain

【Activiti入門】変数

概要

  • Activitiのプロセスでは、変数を利用してプロセスに関する入力データを扱う。

  • 変数はデータベース(テーブル ACT_RU_VARIABLE)にて管理される。

    ただし、変数の値にJava beanなどが格納された場合は、バイナリデータとしてACT_GE_BYTEARRAYテーブルに格納される。

  • 変数には、スコープが存在する。

  • 参考

    Activiti User Guide 4.5. Variables

Process Variables

  • プロセス全体で有効となる変数。

    レコードとしては、テーブル ACT_RU_VARIABLEのカラムproc_inst_idとカラムexecution_idが一致するもの。

Execution

  • アクティブなExecution内でのみ有効な変数。

    説明が難しいが、Activitiでは、プロセスインスタンス上で現在アクティブな箇所をExecutionと定義している。 例えば、以下のような並行ルートの場合は、並行ルートの処理中に3つのアクティブなExecutionが存在する。 1つ目はプロセスインスタンス全体のExecution、2,3つ目はそれぞれの並行ルートのExecutionである。

    f:id:lalalafrance:20160419175932p:plain

  • Executionスコープの変数とは、プロセスインスタンスのExecutionではない、個々のExecution内で有効となる変数である。

    レコードとしては、テーブル ACT_RU_VARIABLEのカラムproc_inst_idとカラムexecution_idが一致しないもの。

UserTask Variables

  • ユーザタスク内でのみ有効な変数。

    レコードとしては、テーブル ACT_RU_VARIABLEのカラムtask_id_が空でないもの。

履歴

  • 変数の履歴は、テーブル ACT_HI_VARINSTに格納される。

Activiti 公開情報

Activitiに関して公開されている情報源をまとめました。

Document

  1. Activiti User Guide

    無料で公開されている公式ドキュメント。

    Activiti EngineからActiviti Explorer・Activiti RESTまで薄く広く解説している。

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

  2. Activiti 5.x Business Process Management Beginner's Guide

    Activiti Explorerをベースにして各アイコン・機能の解説をしている。

    Activiti Explorer・Activiti Designerだけの利用であれば、この1冊で十分事足ります。

    Activiti 5.x Business Process Management Beginner's Guide

    Activiti 5.x Business Process Management Beginner's Guide

  3. Activiti in Action: Executable Business Processes in BPMN 2.0

    Activiti EngineのAPI・内部仕様の解説書。

    Activiti Engineを組み込んだWebアプリケーションを開発する場合は参考になります。

    Activiti in Action: Executable Business Processes in BPMN 2.0

    Activiti in Action: Executable Business Processes in BPMN 2.0

Download

  1. Activiti Designer

    EclipseプラグインであるActiviti Designerの更新サイト。

    http://activiti.org/designer/update/

  2. Activiti Explorer

    Activiti Explorerのwarファイルが含まれたzipがダウンロードできます。 http://activiti.org/download.html

リリース情報

  1. JIRA

    各バージョンごとの不具合修正・機能追加情報がまとまっています。

    私はやったことはないですが、issueを報告することもできるようです。

    https://activiti.atlassian.net/projects/ACT?selectedItem=com.atlassian.jira.jira-projects-plugin:release-page&status=no-filter

    無料ですが、アカウントを作成する必要があります。

Q&A

  1. フォーラム

    困った場合は、こちらで質問できるようです。

    感覚ですが、GitHubのissueよりは活発な感じがします。

    https://forums.activiti.org/

    [2016/12/14 追記]フォーラムのサイトが以下に変更になったようです。 https://community.alfresco.com/community/bpm/content

  2. Github Issues

    https://github.com/Activiti/Activiti/issues

その他

  1. Jenkins(各プラットフォームごとのテストケース実行環境)

    http://ec2-54-217-5-246.eu-west-1.compute.amazonaws.com:8080/jenkins/