IM-BPM for Accel Platform プログラミングガイド 第8版 2020-12-01

3.3. リスナ

全てのアクティビティ(シーケンスフローも含む)にリスナを設定できます。
リスナを設定することにより、任意の処理をアクティビティの開始時、通過時、終了時に実行できます。
プロセスインスタンスの開始時、および、終了時も設定できます。
../../../_images/listener_1.png
図:リスナ

3.3.1. javaプログラム

任意のjavaプログラムを指定して実行できます。
javaプログラムにはいくつかの制約があります。

コラム

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. ユーザタスクでのリスナ

ユーザタスクにはアクティビティのリスナの他にユーザタスクに関するリスナを設定できます。
リスナを設定することにより、任意の処理をユーザタスクの作成時、振り分け時、完了時に実行できます。
../../../_images/listener_2.png
図:リスナ
アクティビティと同様に任意の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 を指定してください。