3.3. リスナ¶
全てのアクティビティ(シーケンスフローも含む)にリスナを設定できます。
リスナを設定することにより、任意の処理をアクティビティの開始時、通過時、終了時に実行できます。
プロセスインスタンスの開始時、および、終了時も設定できます。
3.3.1. javaプログラム¶
任意のjavaプログラムを指定して実行できます。
javaプログラムにはいくつかの制約があります。
jp.co.intra_mart.activiti.engine.delegate.ExecutionListener インタフェースを実装している必要があります。 デフォルトコンストラクタが存在しなければなりません。 リスナにフィールドを設定した場合、そのフィールド名の jp.co.intra_mart.activiti.engine.delegate.Expression のクラス変数を宣言している必要があります。コラム
javaプログラムの設定やフィールドの設定の詳細は「IM-BPM プロセスデザイナ 操作ガイド」 - 「実行リスナ」を参照してください。package sample; import jp.co.intra_mart.activiti.engine.delegate.DelegateExecution; import jp.co.intra_mart.activiti.engine.delegate.ExecutionListener; import jp.co.intra_mart.activiti.engine.delegate.Expression; public class SampleListener implements ExecutionListener { private static final long serialVersionUID = 1L; protected Expression param1; protected Expression param2; @Override public void notify(DelegateExecution execution) throws Exception { // 変数を取得する。 Object variable1 = execution.getVariable("variable1"); Object variable2 = execution.getVariable("variable2"); // 変数を更新する。変数が存在する場合は更新される。 execution.setVariable("variable1", ((int) variable1) + (Integer.parseInt((String) param1.getValue(execution)))); // 変数を追加する。変数が存在しない場合は追加される。 execution.setVariable("variable3", ((int) variable2) + (Integer.parseInt((String) param2.getValue(execution)))); } }
3.3.2. EL式¶
リスナは、EL式を実行できます。
${execution.setVariable("foo", "FOO")}コラム
タイプの設定の詳細は「IM-BPM プロセスデザイナ 操作ガイド」 - 「実行リスナ」を参照してください。
3.3.3. スクリプト¶
リスナは、スクリプトを実行できます。
タイプは「Javaクラス」に設定し、サービスクラスに jp.co.intra_mart.activiti.engine.impl.bpmn.listener.ScriptExecutionListener を指定します。 フィールドに、フィールド名「language」値「im_javascript」を設定します。 フィールドに、フィールド名「script」値にスクリプトを設定します。 フィールドに任意で、フィールド名「resultVariable」値「%任意の文字列%」を設定します。設定した場合、変数にスクリプトの戻り値が%任意の文字列%で作成されます。function run(variables, execution, entity) {entity.setVariable('foo', 'FOO');}
3.3.4. ユーザタスクでのリスナ¶
ユーザタスクにはアクティビティのリスナの他にユーザタスクに関するリスナを設定できます。
リスナを設定することにより、任意の処理をユーザタスクの作成時、振り分け時、完了時に実行できます。
アクティビティと同様に任意のjavaプログラムとEL式とスクリプトを実行できます。
javaプログラムを実行する場合は、jp.co.intra_mart.activiti.engine.delegate.TaskListener インタフェースを実装してください。
package sample; import jp.co.intra_mart.activiti.engine.delegate.DelegateTask; import jp.co.intra_mart.activiti.engine.delegate.Expression; import jp.co.intra_mart.activiti.engine.delegate.TaskListener; public class SampleTaskListener implements TaskListener { private static final long serialVersionUID = 1L; protected Expression param1; protected Expression param2; @Override public void notify(DelegateTask task) { // 変数を取得する。 Object variable1 = task.getVariable("variable1"); Object variable2 = task.getVariable("variable2"); // 変数をローカルに追加する。 task.setVariableLocal("variable1", ((int) variable1) + (Integer.parseInt((String) param1.getValue(task)))); // 変数をローカルに追加する。 task.setVariableLocal("variable3", ((int) variable2) + (Integer.parseInt((String) param2.getValue(task)))); } }
スクリプトを実行する場合は、サービスクラスに jp.co.intra_mart.activiti.engine.impl.bpmn.listener.ScriptTaskListener を指定してください。