第 13 章 在 Data Grid Server 上运行脚本和任务

通过命令行界面(CLI)和 Hot Rod 或 REST 客户端,将任务和脚本添加到 Data Grid 服务器部署中。您可以将任务实施为自定义 Java 类,也可以使用 JavaScript 等语言定义脚本。

13.1. 在 Data Grid 服务器部署中添加任务

将您的自定义服务器任务类添加到 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 配置中的反序列化 allow 列表中。另外,也可使用系统属性设置 allow 列表。

13.1.1. Data Grid Server 任务

Data Grid Server 任务是扩展 org.infinispan.tasks.ServerTask 接口的类,通常包括以下方法调用:

setTaskContext()
允许访问执行上下文信息,包括任务参数、执行任务的缓存引用等。在大多数情况下,实施会在本地存储此信息,并在实际执行任务时使用它。使用 SHARED 实例化模式时,任务应使用 ThreadLocal 来存储 TaskContext 进行并发调用。
getName()
为任务返回唯一名称。客户端使用这些名称调用任务。
getExecutionMode()

返回任务的执行模式。

  • TaskExecutionMode.ONE_NODE 仅处理请求执行脚本的节点。虽然脚本仍然可以调用集群操作。这是默认值。
  • TaskExecutionMode.ALL_NODES 数据网格使用集群执行器在节点间运行脚本。例如,调用流处理的服务器任务需要在单个节点上执行,因为流处理被分发到所有节点。
getInstantiationMode()

返回任务的实例化模式。

  • TaskInstantiationMode.SHARED 创建一个实例,它被重复使用,用于在同一服务器上执行每个任务。这是默认值。
  • TaskInstantiationMode.ISOLATED 会为每个调用创建新实例。
call()
计算结果。此方法在 java.util.concurrent.Callable 接口中定义,并通过 server 任务调用。
重要

服务器任务实施必须遵循服务加载模式要求。例如,实现必须有一个零参数构造器。

以下 HelloTask 类实施提供了一个示例任务,它有一个参数。它还演示了使用 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";
   }

}