【Activiti開発入門】ビジネスロジックの作成
概要
今回の入門記事では、Javaを利用して任意のビジネスロジックを記述できるJava Service Taskをご紹介します。Java Service Taskの詳細な仕様に関しては、「Activiti User Guide 8.5.3. Java Service Task」をご参照ください。 http://www.activiti.org/userguide/#bpmnJavaServiceTaskXML
ステップ
ビジネスロジックの実装
JavaDelegateインターフェースを実装したクラスを作成し、ビジネスロジックを作成します。
ビジネスロジックを呼び出すフローの作成
1で作成したビジネスロジックを呼び出すService Taskをフロー上に配置します。
ビジネスロジックの作成
クラスパスの通し方
「Activiti Project」の作成
BPMのフロー開発と同じく、ビジネスロジックもActiviti Project上で開発します。Activiti Designer(eclipse)上でActiviti Projectを作成します。
「Java Build Path」の設定
作成したActiviti Projectに対してビルドパスを設定します。Activiti ProjectはMavenプロジェクトの形式になっていますが、eclipseのMavenプロジェクトの形式としては不完全でMaven経由のビルドパスが通らないため、直接jarファイルをビルドパスに追加することでeclipse上のクラスパスを解決します。
Activiti Project上で右クリックし、プロパティ画面を表示します。「Java Build Path」を設定し、「Add External JARS」を押下し、「activiti-engine-5.21.0.jar」を選択します。
ビジネスロジックの実装
通常のMavenプロジェクトのような感じで、Javaクラスを追加します。クラスの追加時に、org.activiti.engine.delegate.JavaDelegateインターフェースを選択します。
クラス内に任意の業務処理を記述します。
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 { /* * 任意の業務処理を記述します。 */ } }
引数として渡ってくるorg.activiti.engine.delegate.DelegateExecutionからは様々なプロセスの情報が取得することが可能です。 http://activiti.org/javadocs/org/activiti/engine/delegate/DelegateExecution.html
もちろん、変数操作を行うことも可能です。
// 変数の取得 String value = (String) execution.getVariable("sampleVar");
// 変数の更新 execution.setVariable("sampleVar", "aaa");
ビルド(パッケージング)とデプロイ
作成したクラスを含むjarファイルをビルドします。Activiti ProjectはMavenプロジェクトの形式になっているので、Mavenのコマンドを実行するだけでjarファイルを作成可能です。
ビルドしたjarファイルは、Activitiを動作させるWebアプリケーションに同梱します。
Activitiのエンジンでは、独自のクラスローダを差し込む仕組みも提供しているため、例えばActiviti Projectから生成したデプロイメントにクラスを同梱してデプロイするような仕組みも作成可能ですが、今回は紹介しません。 http://activiti.org/javadocs/org/activiti/engine/ProcessEngineConfiguration.html#setClassLoader-java.lang.ClassLoader-
ビジネスロジックを呼び出すフローの作成
ここでは、「ビジネスロジックの実装」で作成したクラスを呼び出すだけのフローの作成方法をご紹介します。
Activiti Diagramを作成し、フローのデザイナー画面を表示します。
以下のアイコンを配置します。
- 「Start Event」カテゴリから「StartEvent」を配置します。
- 「Task」カテゴリから「Service Task」を配置します。
- 「End Event」カテゴリから「EndEvent」を配置します。
以下のように線を引きます。
- 「StartEvent」から「Service Task」へ線を引きます。
- 「Service Task」から「EndEvent」へ線を引きます。
起票者を設定します。
- デザイナー上のアイコン以外の箇所をクリックします。
- Propertiesタブの「Candidate start users」に任意のユーザを設定します。
Service taskを設定します。
- デザイナー上の「Service Task」のアイコンをクリックします。
「Main config」タブのClass name属性に「ビジネスロジックの実装」で作成したクラス名を設定します。
「General」タブのAsynchronous属性にて同期・非同期の設定を行います。デフォルトの設定では、Service Taskで設定したJavaクラスの処理はフロー上で手前に配置されているアクティビティと同一のスレッドから呼び出されます。例えば、User Taskの直後にService Taskを配置し、同期の設定にした場合は、User Taskを操作しているユーザは、Service Taskの処理の完了を待ちます。Service Taskで時間がかかる処理を行う場合には、Asynchronous属性をオンにして、処理が非同期スレッドにて実行されるようにしてください。
フローを保存・ビルドし、出力されたbarファイルをActiviti Explorerにデプロイします。
サンプルフロー
ユーザタスクで入力した文字列が数値形式かどうかチェックして、数字でない場合はエラーを返すだけのサンプルを以下のページで公開しています。 https://github.com/daisuke-yoshimoto/sample_java_service
上記のリポジトリのサンプルコードはシンプルさを重視しています。 実際の開発・運用において必ずしも適切な実装ではありません。参考にされる場合は、十分ご注意ください。
[追記]
JavaDelegateインターフェースを実装したクラスは、Service Taskに対して1インスタンスのみ生成され、全てのプロセスインスタンスの間で共有されます。そのため、スレッドセーフに実装する必要があります。