第 13 章 在 Data Grid Server 上运行脚本和任务
通过命令行界面(CLI)和 Hot Rod 或 REST 客户端,将任务和脚本添加到 Data Grid 服务器部署中。您可以将任务实施为自定义 Java 类,也可以使用 JavaScript 等语言定义脚本。
13.1. 在 Data Grid 服务器部署中添加任务
将您的自定义服务器任务类添加到 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 配置中的反序列化 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"; } }