アクションエグゼキュータの作成
ワークフローノードは、Groovyスクリプトを介してカスタムロジックを実行する<action>
要素を含むことができます。
<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>
Groovyアクションロジックをワークフロー定義の <script>
要素に直接記述する代わりに、 ActionExecutor
インターフェースを実装することで、Javaロジックを実行することができます。
- Javaの実装を書きます。
- ワークフロー定義XMLファイルからJavaクラスを呼び出します。
まず、 ActionExecutor
をデプロイし、動作を確認します。
アクション・エクゼキュータの配置
新しいLiferay DXPインスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/dxp:2024.q2.11。
メールアドレス test@liferay.com とパスワード test を使用して、http://localhost:8080でLiferayにサインインしてください。 プロンプトが表示されたら、パスワードを learn に変更します。
次に、以下の手順を実行します。
-
Acme E5C9実装プロジェクトをダウンロードして解凍する。
curl https://resources.learn.liferay.com/dxp/latest/en/process-automation/workflow/developer-guide/liferay-e5c9.zip -O
unzip liferay-e5c9.zip
-
モジュールのルートから、ビルドおよびデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
Tipこのコマンドは、デプロイされた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 唯一の承認者]の定義を[ブログのエントリのアセットタイプ]に割り当てる。
-
[保存] をクリックします。
-
デフォルトの管理者であるUser Test Testを使って、サイトメニューの → Content & Data → Blogsを開きます。
-
追加 ボタン()をクリックします。
-
タイトルと内容フィールドに何かを入力し、 Submit for Workflow をクリックします。
-
メインのBlogsビューに戻り、エントリーが表示され、ステータスが 返答待ち と表示されていることを確認します。
ワークフローフレームワークでは、ステータスを[保留]に設定しています。 これ以降、ステータスの更新はアクションエクゼキュータのロジックを使って行われます。
唯一の承認者ワークフローをブログエントリに割り当てると、[E5C9 唯一の承認者]と同じように動作することがわwかります。
E5C9アクションエグゼキュータを理解する
Acme E5C9実装プロジェクトでは、唯一の承認者定義のワークフロースクリプトのステータス設定ロジックを、E5C9ActionExecutor
という1つのJavaクラスに抽出します。
これは、デフォルトのシング ルアプルーバーと同じロジックを持つが、ワークフロー定義に直接 Groovy スクリプトを記述する代わ りに、アクションエグゼキュータークラスのロジックを使用する。
WorkflowStatusManagerUtil.updateStatus(
WorkflowConstants.STATUS_DENIED, workflowContext);
ActionExecutorの実装
アクション・エグゼキュータ・クラスは、 com.acme.e5c9.internal.workflow.kaleo.runtime.scripting.internal.action.ActionExecutor
インターフェースを実装し、単一の execute
メソッドをオーバーライドします。 コンポーネントのプロパティで、アクションのスクリプト言語を java
と設定します。
@Component(
immediate = true,
service = ActionExecutor.class
)
public class E5C9ActionExecutor implements ActionExecutor {
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の呼び出し
Acme E5C9実装プロジェクトで自動ロードされるE5C9 唯一の承認者のワークフロー定義は、Liferayに同梱されている唯一の承認者の定義とほぼ同じである。 E5C9の唯一の承認者定義では、すべてのロジックがアクション・エクゼキュータ・クラスにアウトソースされているため、大幅に簡素化されていますが、その違いはステート・ノードとタスク・ノードのスクリプト要素にあります。 定義のアクション(rejectとapprove)には、どちらも同じスクリプトタグが付いています。
<script>
<![CDATA[com.acme.e5c9.internal.workflow.kaleo.runtime.scripting.internal.action.E5C9ActionExecutor]]>
</script>
<script-language>java</script-language>
scriptタグは引き続き必要ですが、ワークフローフレームワークにロジックを保持するアクションエクゼキュータを指し示します。
ワークフロー定義の中で呼び出すアクションエクゼキュータは1つだけとは限りません。 例えば、 E5C9ActionExecutor
は、ワークフローのステータスを設定する前に、遷移を判断するロジックを持っています。 しかし、ロジックがより複雑な場合は、ワークフローの各アクションを個別の ActionExecutor
の実装でバックアップし、これらの実装を他のワークフロー定義で再利用することができます。