第14章 Data Grid Server でのスクリプトおよびタスクの実行


コマンドラインインターフェイス (CLI) および Hot Rod または REST クライアントから、リモート実行用の Data Grid Server デプロイメントにタスクおよびスクリプトを追加します。カスタム Java クラスとしてタスクを実装するか、JavaScript などの言語でスクリプトを定義することができます。

14.1. Data Grid Server デプロイメントへのタスクの追加

カスタムサーバータスククラスを Data Grid Server に追加します。

前提条件

  • Data Grid Server が実行している場合は停止します。

    Data Grid Server はカスタムクラスのランタイムデプロイメントをサポートしません。

手順

  1. 以下のように、サーバーのタスクの完全修飾名が含まれる META-INF/services/org.infinispan.tasks.ServerTask ファイルを追加します。

    example.HelloTask
  2. JAR ファイルでサーバータスクの実装をパッケージ化します。
  3. JAR ファイルを Data Grid Server インストールの $RHDG_HOME/server/lib ディレクトリーにコピーします。
  4. クラスを Data Grid 設定のデシリアライズ許可リストに追加します。または、システムプロパティーを使用して許可リストを設定します。

14.1.1. Data Grid Server タスク

Data Grid Server のタスクは、org.infinispan.tasks.ServerTask インターフェイスを拡張するクラスで、通常以下のメソッド呼び出しが含まれます。

setTaskContext()
タスクパラメーター、タスクが実行されるキャッシュ参照などを含む実行コンテキスト情報へのアクセスを許可します。ほとんどの場合、実装はこの情報をローカルに保存し、タスクが実際に実行したときに使用します。SHARED インスタンス化モードを使用する場合、タスクは同時呼び出しのために TaskContext を格納するために ThreadLocal を使用する必要があります。
getName()
タスクの一意の名前を返します。クライアントはこれらの名前でタスクを呼び出します。
getExecutionMode()

タスクの実行モードを返します。

  • TaskExecutionMode.ONE_NODE は、要求を処理するノードのみがスクリプトを実行します。ただし、スクリプトはクラスター化された操作を引き続き呼び出すことができます。これはデフォルトになります。
  • TaskExecutionMode.ALL_NODES Data Grid は、クラスター化されたエグゼキューターを使用してノード間でスクリプトを実行します。たとえば、ストリーム処理はすべてのノードに分散されるため、ストリーム処理を呼び出したサーバータスクを 1 つのノードで実行する必要があります。
getInstantiationMode()

タスクのインスタンス化モードを返します。

  • TaskInstantiationMode.SHARED は、同じサーバーでのすべてのタスク実行に再利用される単一のインスタンスを作成します。これはデフォルトになります。
  • TaskInstantiationMode.ISOLATED は、呼び出しごとに新しいインスタンスを作成します。
call()
結果を計算します。このメソッドは java.util.concurrent.Callable インターフェイス内で定義され、サーバータスクにより呼び出されます。
重要

サーバータスクの実装は、サービスローダーパターンの要件に準拠する必要があります。たとえば、実装にはゼロ引数のコンストラクターが必要です。

以下の HelloTask クラス実装は、1 つのパラメーターを持つタスクの例を提供します。また、ThreadLocal を使用して、同時呼び出し用の TaskContext を格納する方法も示しています。

package example;

import org.infinispan.tasks.ServerTask;
import org.infinispan.tasks.TaskContext;

public class HelloTask implements ServerTask<String> {

   private static final ThreadLocal<TaskContext> taskContext = new ThreadLocal<>();

   @Override
   public void setTaskContext(TaskContext ctx) {
      taskContext.set(ctx);
   }

   @Override
   public String call() throws Exception {
      TaskContext ctx = taskContext.get();
      String name = (String) ctx.getParameters().get().get("name");
      return "Hello " + name;
   }

   @Override
   public String getName() {
      return "hello-task";
   }

}
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.