Menu Close
Settings Close

Language and Page Formatting Options

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

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

13.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 設定のデシリアライズ許可リストに追加します。または、システムプロパティーを使用して許可リストを設定します。

13.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";
   }

}