アクションエグゼキュータの作成¶
ワークフローノードは、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:7.4.13-u55。
メールアドレス_test@liferay.com_とパスワード_test_を使用して、http://localhost:8080でLiferayにサインインしてください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順に従います。
Acme E5C9 Implementationプロジェクトをダウンロードして解凍します。
curl https://learn.liferay.com/dxp/latest/ja/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を開きます。
追加 ボタン(
)をクリックします。
タイトルとコンテンツの欄に何かを入力し、 公開申請 をクリックします。
メインのBlogsビューに戻り、エントリーが表示され、ステータスが 返答待ち と表示されていることを確認します。
ワークフローフレームワークでは、ステータスを[保留]に設定しています。 これ以降、ステータスの更新はアクションエクゼキュータのロジックを使って行われます。
-
唯一の承認者ワークフローをブログエントリに割り当てると、[E5C9 唯一の承認者]と同じように動作することがわかります。
E5C9アクションエグゼキュータを理解する¶
Acme E5C9実装プロジェクトでは、唯一の承認者定義のワークフロースクリプトのステータス設定ロジックを、E5C9ActionExecutor
という1つのJavaクラスに抽出します。
このプロジェクトでは、アクションエクゼキュータに加えて、E5C9 唯一の承認者と呼ばれるワークフロー定義が含まれ、オートロードされます。このワークフロー定義は、デフォルトの唯一の承認者と同じロジックを持ちますが、ワークフロー定義に直接Groovyスクリプトを使用する代わりに、アクションエクゼキュータクラスのロジックを使用します。
_workflowStatusManager.updateStatus(
WorkflowConstants.STATUS_DENIED, workflowContext);
ActionExecutorの実装¶
アクション・エグゼキュータ・クラスは、 com.acme.e5c9.internal.workflow.kaleo.runtime.scripting.internal.action.ActionExecutor
インターフェースを実装し、単一の execute
メソッドをオーバーライドします。 コンポーネントのプロパティで、アクションのスクリプト言語を java
と設定します。
@Component(
property = "com.liferay.portal.workflow.kaleo.runtime.action.executor.language=java",
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")) {
_workflowStatusManager.updateStatus(
WorkflowConstants.STATUS_DENIED, workflowContext);
_workflowStatusManager.updateStatus(
WorkflowConstants.STATUS_PENDING, workflowContext);
}
else if (Objects.equals(
workflowContext.get("transitionName"), "approve")) {
_workflowStatusManager.updateStatus(
WorkflowConstants.STATUS_APPROVED, workflowContext);
}
ワークフロー定義内でのActionExecutorの呼び出し¶
Acme E5C9実装プロジェクトで自動ロードされるE5C9 唯一の承認者のワークフロー定義は、Liferayに同梱されている唯一の承認者の定義とほぼ同じである。 E5C9の唯一の承認者定義では、すべてのロジックがアクション・エクゼキュータ・クラスにアウトソースされているため、大幅に簡素化されていますが、その違いはステート・ノードとタスク・ノードのスクリプト要素にあります。 定義のアクション(rejectとapprove)には、どちらも同じスクリプトタグが付いています。
<script>
<![CDATA[com.acme.e5c9.internal.kaleo.runtime.action.executor.E5C9ActionExecutor]]>
</script>
<script-language>java</script-language>
scriptタグは引き続き必要ですが、ワークフローフレームワークにロジックを保持するアクションエクゼキュータを指し示します。
ワークフロー定義の中で呼び出すアクションエクゼキュータは1つだけとは限りません。 例えば、 E5C9ActionExecutor
は、ワークフローのステータスを設定する前に、遷移を判断するロジックを持っています。 しかし、ロジックがより複雑な場合は、ワークフローの各アクションを個別の ActionExecutor
の実装でバックアップし、これらの実装を他のワークフロー定義で再利用することができます。