Documentation

新しいディスパッチタスクエグゼキュータの作成

各ディスパッチタスクは、DispatchTaskExecutorインターフェイスを実装することによって作成され、任意のロジックを実行できます。 Liferay DXPは、すぐに使える複数のエグゼキュータを提供しますが、独自のエグゼキュータを作成することもできます。 作成してデプロイしたら、Liferayインスタンスにディスパッチタスクを追加できます。

次の手順に従って、DispatchTaskExecutorインターフェイスの独自の実装を作成します。

  1. OSGIコンポーネント@Componentアノテーションを使用して、OSGiフレームワーク内でモジュールをコンポーネントとして宣言します。

  2. サービス :モジュールを@Componentアノテーション内のDispatchTaskExecutor.classサービスとして識別します。

  3. OSGiプロパティ :次のプロパティを@Componentアノテーションに追加します。

    • dispatch.task.executor.name:ディスパッチUIでエグゼキュータの名前に使用される文字列を定義します。

      注釈

      ディスパッチタスクでローカライズされた名前を使用する場合は、 dispatch.task.executor.nameプロパティの言語キー値をモジュールのresources/content/Language.propertiesファイルに追加します。

    • dispatch.task.executor.type:適切なディスパッチタスクエグゼキュータおよびディスパッチトリガーに一致する一意のtype値を定義します。

      注釈

      正しいエグゼキュータが一致するように、値は一意である必要があります。 値が一意でない場合、ログには起動時にエラーが表示され、同じプロパティ値を持つエグゼキュータが示されます。

  4. DispatchTaskExecutorDispatchTaskExecutorインターフェイスを実装するか、その実装を拡張します(BaseDispatchTaskExecutorなど)。

    重要

    ディスパッチフレームワークはタスクの同時実行を制御するためにこれらのログに依存しているため、 DispatchTaskExecutorインターフェイスの実装はディスパッチタスクのステータスログを処理する必要があります。

    便宜を図るため、Liferayは、ディスパッチタスクのステータスをIN PROGRESSSUCCESSFUL、またはFAILEDとしてログに記録するBaseDispatchTaskExecutor抽象 クラス を提供します。

  5. メソッドDispatchTaskExecutorインターフェイスを直接実装している場合は、execute()メソッドをオーバーライドしてカスタムロジックを実装します。 代わりに、BaseDispatchTaskExecutor抽象クラスを拡張する場合は、そのdoExecute()メソッドをオーバーライドします。

    注釈

    getName()メソッドは廃止予定となり、dispatch.task.executor.nameプロパティに置き換えられました。

    ちなみに

    dispatchTrigger.getDispatchTaskSettings()メソッドを使用して、ディスパッチタスクの設定エディターで設定されたプロパティをフェッチできます。

次のサンプルモジュールは、カスタムのディスパッチタスクエグゼキュータを作成してLiferayインスタンスにデプロイする方法を示しています。

サンプルのディスパッチタスクエグゼキュータのデプロイ

次の手順に従って、サンプルのディスパッチタスクエグゼキュータをダウンロード、ビルドして、新しいDockerコンテナにデプロイします。

  1. 新しいLiferay Dockerコンテナを起動します。

    docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.22-ga22
    
  2. サンプルモジュールをダウンロードして解凍します。

    curl https://learn.liferay.com/docs/dxp/latest/en/building-applications/core-frameworks/dispatch-framework/liferay-s7a3.zip -O
    
    unzip liferay-s7a3.zip -d liferay-s7a3
    
  3. gradlewコマンドを実行してJARファイルをビルドし、それを新しいDockerコンテナにデプロイします。

    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

    JARは、build/libsフォルダ(つまり、s7a3-impl/build/libs/com.acme.s7a3.impl-1.0.0)に生成されます。

  4. モジュールが正常にデプロイされ、コンテナコンソールを介して開始されたことを確認します。

    Processing com.acme.s7a3.impl-1.0.0.jar
    STARTED com.acme.s7a3.impl-1.0.0 [1656]
    
  5. モジュールを使用してLiferayインスタンスに 新しいディスパッチタスクを追加 することにより、モジュールが機能していることを確認します。

    新しいテンプレートを使用して、新しいディスパッチタスクを追加します。

    タスクを作成したら、 [今すぐ実行] をクリックします。

    新しいディスパッチタスクの[今すぐ実行]をクリックします。

    成功すると、実行時に次のメッセージがコンソールに出力されます。

    INFO [liferay/dispatch/executor-2][S7A3DispatchTaskExecutor:30] Invoking #doExecute(DispatchTrigger, DispatchTaskExecutorOutput)
    

    ディスパッチタスクをクリックして [Logs] に移動し、以前のすべての実行のリストを表示することもできます。

    ディスパッチタスクのログを表示および管理します。

サンプルのディスパッチタスクエグゼキュータのコード

@Component(
	property = {
		"dispatch.task.executor.name=s7a3", "dispatch.task.executor.type=s7a3"
	},
	service = DispatchTaskExecutor.class
)
public class S7A3DispatchTaskExecutor extends BaseDispatchTaskExecutor {

	@Override
	public void doExecute(
			DispatchTrigger dispatchTrigger,
			DispatchTaskExecutorOutput dispatchTaskExecutorOutput)
		throws IOException, PortalException {

		if (_log.isInfoEnabled()) {
			_log.info(
				"Invoking #doExecute(DispatchTrigger, " +
					"DispatchTaskExecutorOutput)");
		}
	}

	@Override
	public String getName() {
		return "s7a3";
	}

	private static final Log _log = LogFactoryUtil.getLog(
		S7A3DispatchTaskExecutor.class);

}

モジュールはOSGi @Componentとして宣言され、dispatch.task.executor.namedispatch.task.executor.typeの2つのプロパティを定義します。 その後、モジュールをDispatchTaskExecutor.classサービスとして識別します。

@Componentアノテーションに続いて、モジュールはBaseDispatchTaskExecutor抽象クラスを拡張し、doExecuteメソッドをオーバーライドします。 このメソッドは、LogFactoryUtilを使用して、コンソールのログに通知メッセージを表示します。