アクションエグゼキュータの作成
ワークフロー ノードには、 <action> 要素を含めることができ、それらの要素は Groovy スクリプトを介してカスタム ロジックを実行します。
<action>
<name>approve</name>
<script>
<![CDATA[
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.kernel.workflow.WorkflowStatusManagerUtil;
WorkflowStatusManagerUtil.updateStatus(WorkflowConstants.getLabelStatus("approved"), workflowContext);
]]>
</script>
<script-language>groovy</script-language>
<execution-type>onEntry</execution-type>
</action>
ワークフロー定義 <script> 要素に Groovy アクション ロジックを直接記述する代わりに、 ActionExecutor インターフェイスを実装して Java ロジックを実行できます。
- Javaの実装を書きます。
- ワークフロー定義XMLファイルからJavaクラスを呼び出します。
まず、 ActionExecutorをデプロイし、動作を確認します。
アクション・エクゼキュータの配置
新しいLiferay DXPインスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/dxp:2025.q1.6-lts
メールアドレス test@liferay.com とパスワード testを使用して、 http://localhost:8080 で Liferay にサインインします。 プロンプトが表示されたら、パスワードを learnに変更します。
サンプルプロジェクトを展開する前に、システム設定 → スクリプト管理(セキュリティカテゴリ内)でスクリプトを有効にします。
次に、以下の手順に従います。
-
Acme E5C9 Implementationプロジェクトをダウンロードして解凍します。
curl https://resources.learn.liferay.com/examples/liferay-e5c9.zip -Ounzip liferay-e5c9.zip -
モジュールのルートから、ビルドおよびデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)ヒントこのコマンドは、デプロイされたjarをDockerコンテナ上の
/opt/liferay/osgi/modulesにコピーするのと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.e5c9.impl_1.0.0
便宜上、 ActionExecutor の activate メソッドは、E5C9 Single Approver というワークフロー定義を自動的に読み込みました。 このコードは、ワークフロープロセスビルダーに移動し、ワークフロー定義をアップロードするのと同じことを実現します。 新しいワークフロー定義のアップロードを参照してください。
アクションエグゼキュータをテストする
Acme E5C9 Action Executorを使用するには、ワークフロー定義をブログエントリーで使用するように設定し、管理者ユーザーで新しいブログエントリーを追加します。
-
グローバル メニューの [アプリケーション] タブで、[ワークフロー] → [プロセス ビルダー] に移動します。
-
設定タブで、[E5C9 唯一の承認者]の定義を[ブログのエントリのアセットタイプ]に割り当てる。
-
[保存]をクリックします。
-
デフォルトの管理ユーザー テスト テストを使用して、サイト メニュー → コンテンツ & データ → ブログを開きます。
-
追加 ボタン (
) をクリックします。 -
タイトルとコンテンツのフィールドに何か入力し、 ワークフローに送信をクリックします。
-
メインのBlogsビューに戻り、エントリーが表示され、ステータスが 返答待ちと表示されていることを確認します。
ワークフローフレームワークでは、ステータスを[保留]に設定しています。 これ以降、ステータスの更新はアクションエクゼキュータのロジックを使って行われます。
-
ワークフローでブログエントリを承認します。

唯一の承認者ワークフローをブログエントリに割り当てると、[E5C9 唯一の承認者]と同じように動作することがわかります。
E5C9アクションエグゼキュータを理解する
Acme E5C9実装プロジェクトでは、唯一の承認者定義のワークフロースクリプトのステータス設定ロジックを、E5C9ActionExecutor<0>という1つのJavaクラスに抽出します。
アクション エグゼキュータに加えて、プロジェクトには E5C9 シングル アプルーバと呼ばれるワークフロー定義が含まれており、自動的にロードされます。この定義はデフォルトのシングル アプルーバと同じロジックを持ちますが、ワークフロー定義で直接 Groovy スクリプトを記述するのではなく、アクション エグゼキュータ クラスのロジックを使用します。
<script>
<![CDATA[com.acme.e5c9.internal.workflow.kaleo.runtime.scripting.internal.action.E5C9ActionExecutor]]>
</script>
ActionExecutor は、各遷移の名前に応じてワークフローのステータスを設定します。
if (Objects.equals(
workflowContext.get("transitionName"), "reject")) {
WorkflowStatusManagerUtil.updateStatus(
WorkflowConstants.STATUS_DENIED, workflowContext);
WorkflowStatusManagerUtil.updateStatus(
WorkflowConstants.STATUS_PENDING, workflowContext);
}
else if (Objects.equals(
workflowContext.get("transitionName"), "approve")) {
WorkflowStatusManagerUtil.updateStatus(
WorkflowConstants.STATUS_APPROVED, workflowContext);
}
ActionExecutorの実装
アクション・エグゼキュータ・クラスは、 com.acme.e5c9.internal.workflow.kaleo.runtime.scripting.internal.action.ActionExecutor インターフェースを実装し、単一の execute メソッドをオーバーライドします。 getActionExecutorKey メソッドで、アクションのスクリプト言語を java に設定します。
@Override
public String getActionExecutorKey() {
return "java";
}
execute メソッドは何も返しません。 その代わり、メソッド内で任意にロジックが実行され、XMLの定義に従ってワークフローの処理が継続されます。 アクションの実行中に、ワークフローのステータスが更新されることがよくあります。
execute メソッドは、 KaleoAction と ExecutionContextの2つのパラメータを受け取ります。 ワークフローエンジンは、ワークフロープロセス内のアクションエクゼキュータを呼び出す役割を担っているため、お客様のコードではこれらのオブジェクトのインスタンス化や構築を行う必要はありません。 しかし、そこから有益な情報を得ることができます。 例えば、E5C9アクション・エクゼキュータは、 workflowContext ( Mapタイプ)を ExecutionContextから取得します。
Map<String, Serializable> workflowContext =
executionContext.getWorkflowContext();
workflowContext は、直近に実行されたトランジションを取得するために使用され、条件付きロジックがワークフロー内のアセットに設定するステータスを決定できるようになります。
if (Objects.equals(
workflowContext.get("transitionName"), "reject")) {
WorkflowStatusManagerUtil.updateStatus(
WorkflowConstants.STATUS_DENIED, workflowContext);
WorkflowStatusManagerUtil.updateStatus(
WorkflowConstants.STATUS_PENDING, workflowContext);
}
else if (Objects.equals(
workflowContext.get("transitionName"), "approve")) {
WorkflowStatusManagerUtil.updateStatus(
WorkflowConstants.STATUS_APPROVED, workflowContext);
}
ワークフロー定義内でのActionExecutorの呼び出し
E5C9 単一承認者ワークフロー定義には、状態ノードとタスク ノードにスクリプト要素が含まれています。 これらのスクリプト要素は、アクション実行クラスを宣言します。 定義のアクション(rejectとapprove)には、どちらも同じスクリプトタグが付いています。
<script>
<![CDATA[com.acme.e5c9.internal.workflow.kaleo.runtime.scripting.internal.action.E5C9ActionExecutor]]>
</script>
<script-language>java</script-language>
スクリプト タグは、ワークフロー フレームワークを、ロジックを保持するアクション エグゼキュータにポイントします。
ワークフロー定義の中で呼び出すアクションエクゼキュータは1つだけとは限りません。 例えば、 E5C9ActionExecutor は、ワークフローのステータスを設定する前に、遷移を判断するロジックを持っています。 しかし、ロジックがより複雑な場合は、ワークフローの各アクションを個別の ActionExecutor の実装でバックアップし、これらの実装を他のワークフロー定義で再利用することができます。
関連トピック