第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 はカスタムクラスのランタイムデプロイメントをサポートしません。
手順
以下のように、サーバーのタスクの完全修飾名が含まれる
META-INF/services/org.infinispan.tasks.ServerTask
ファイルを追加します。example.HelloTask
- JAR ファイルでサーバータスクの実装をパッケージ化します。
-
JAR ファイルを Data Grid Server インストールの
$RHDG_HOME/server/lib
ディレクトリーにコピーします。 - クラスを 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"; } }