ジョブスケジューラ タスクエクゼキュータの新規作成

ジョブスケジューラ タスクエクゼキュータの新規作成

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

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

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

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

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

    • dispatch.task.executor.name: ジョブスケジューラUIで実行者名に使用される文字列を定義します。

      note

      もし、ジョブスケジューラータスクにローカライズされた名前を使いたい場合は、モジュールの resources/content/Language.properties ファイルに dispatch.task.executor.name 属性の言語キー値を追加してください。

    • dispatch.task.executor.type: 正しいジョブスケジューラタスク実行者とジョブスケジューラトリガーに一致するように、一意の type 値を定義します。

      note

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

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

    important

    DispatchTaskExecutor` インターフェースの実装は、Job Scheduler タスクのステータスログを処理しなければなりません。なぜなら、フレームワークはタスクの同時実行を制御するために、これらのログに依存するからです。

    便宜上、Liferay は BaseDispatchTaskExecutor 抽象 class を提供しており、ジョブスケジューラタスクの状態を IN PROGRESS, SUCCESSFUL, または FAILED としてログに記録します。

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

    note

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

    tip

    ジョブスケジューラタスクのSettingsエディタに設定されているプロパティを取得するには、dispatchTrigger.getDispatchTaskSettings() メソッドを使用します。

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

サンプルジョブスケジューラ タスクエクゼキュータの配備

新しいLiferay インスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.55-ga55。

http://localhost:8080でLiferayへのサインインします。 メールアドレス[email protected]_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。

次に、以下の手順でサンプルの Job Scheduler Task Executor をダウンロードし、ビルドして、新しい Docker コンテナにデプロイします。

  1. サンプルモジュールをダウンロードして解凍します。

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

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

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

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

    Processing com.acme.s7a3.impl-1.0.0.jar
    STARTED com.acme.s7a3.impl-1.0.0 [1656]
    
  4. このモジュールを使って Liferay インスタンスに新しい Job Scheduler Task を追加し、モジュールが動作していることを確認します。

    新しいテンプレートを使って、新しいジョブスケジューラータスクを追加します。

    タスクを作成したら、 [Run Now] をクリックします。

    新しいジョブスケジューラタスクの[今すぐ実行]をクリックします。

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

    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を使用して、コンソールのログに通知メッセージを表示します。

追加情報