第41章 リモートタスクの実行

41.1. リモートタスクの実行

タスクまたはビジネスロジックは直接 JBoss Data Grid サーバーで実行できるため、タスクの実行はデータに近く、クラスターのすべてのノードにあるリソースを使用します。

タスクを Java 実行可能ファイルにバンドルし、プログラミングで実行可能ファイルを実行できるサーバーインスタンスにデプロイすることができます。

41.2. リモートタスクの作成

リモート実行のタスクを作成するには、 org.infinispan.tasks.ServerTask インターフェースを実装するクラスが含まれる .jar ファイルを作成する必要があります。

実装には以下のメソッドが必要になります。

  • void setTaskContext(TaskContext taskContext): タスクコンテキストを設定します。このメソッドを使用して、キャッシュや必要なその他のリソースにアクセスします。
  • String getName(): タスクに一意な名前を提供します。この名前は TaskManager による実行に使用されます。

以下は実装の任意のメソッドになります。

  • TaskExecutionMethod getExecutionMode(): TaskExecutionMode.ONE_NODE のようにタスクが 1 つのノードで実行されるか、または TaskExecutionMode.ALL_NODES のようにすべてのノードで実行されるかを決定します。デフォルトでは 1 つのノードで実行されます。
  • Optional<String> getAllowedRole(): ユーザーがタスクの実行に必要なロールを設定します。デフォルトでは追加のユーザーロールは設定されません。詳細は「リモートタスクの実行」を参照してください。
  • Set<String> getParameters(): タスクに使用する名前付きパラメーターを指定します。

41.3. リモートタスクの例

以下には、org.infinispan.tasks.ServerTask インターフェースを実装するクラスの例が含まれています。

public class HelloTask implements ServerTask<String> {

   private TaskContext ctx;

   //Set the task context.
   @Override
   public void setTaskContext(TaskContext ctx) {
      this.ctx = ctx;
   }

   //Take the name of a person as a parameter.
   //Return a greeting with that person's name.
   @Override
   public String call() throws Exception {
      String name = (String) ctx.getParameters().get().get("name");
      return "Hello " + name;
   }

   //Return a unique name that clients can use to invoke the task.
   @Override
   public String getName() {
      return "hello-task";
   }

}

41.4. リモートタスクのインストール

リモートタスクを作成し、.jar ファイルにバンドルしたら、以下のオプションの 1 つを使用して JBoss Data Grid サーバーインスタンスにデプロイできます。

オプション 1: deployments ディレクトリーへコピーする

  1. .jar ファイルを deployments/ ディレクトリーにコピーします。

    $] cp /path/to/sample_task.jar $JDG_HOME/standalone/deployments/

オプション 2: CLI でコピーする

  1. JBoss Data Grid サーバーに接続します。

    [$JDG_HOME] $ bin/cli.sh --connect --controller=$IP:$PORT
  2. .jar ファイルをデプロイします。

    deploy /path/to/sample_task.jar
    注記

    JBoss Data Grid がドメインモードである場合、--all-server-groups または --server-groups パラメーターを使用してサーバーグループを市営する必要があります。

41.5. リモートタスクの削除

JBoss Data Grid の実行中のインスタンスからリモートタスクを削除するには、以下を行います。

  1. JBoss Data Grid サーバーに接続します。

    [$JDG_HOME] $ bin/cli.sh --connect --controller=$IP:$PORT
  2. undeploy コマンドを実行して .jar ファイルを削除します。

    undeploy /path/to/sample_task.jar
    注記

    JBoss Data Grid がドメインモードである場合、--all-server-groups または --server-groups パラメーターを使用してサーバーグループを市営する必要があります。

41.6. リモートタスクの実行

JBoss Data Grid サーバーで承認が有効になっている場合、 EXEC パーミッションを持つユーザーのみがリモートタスクを実行できます。承認が有効になっていない場合は、すべてのユーザーがリモートタスクを実行できます。

リモートタスクには、getAllowedRole メソッドで指定された追加のユーザーロールを付与することができます。この場合、ユーザーはそのロールに属さないとリモートタスクを実行できません。

以前デプロイしたタスクを実行するには、対象のキャッシュで execute(String taskName, Map parameters) を呼び出します。

以下の例は、sampleTask という名前のタスクを実行する方法を示しています。

import org.infinispan.client.hotrod.*;
import java.util.*;
[...]
String TASK_NAME = "sampleTask";

RemoteCacheManager rcm = new RemoteCacheManager();
RemoteCache remoteCache = rcm.getCache();

// Assume the task takes a single parameter, and will return a result
Map<String, String> params = new HashMap<>();
params.put("name", "James");

String result = (String) remoteCache.execute(TASK_NAME, params);