分布式任务调度:PowerJob 高级特性

一、容器

1.介绍

PowerJob 的容器技术允许开发者开发独立于 Worker 项目之外 Java 处理器,简单来说,就是以 Maven 工程项目的维度去组织一堆 Java 文件(开发者开发的众多脚本处理器),进而兼具开发效率和可维护性。

该容器为 JVM 级容器,而不是操作系统级容器(Docker)。

2.用途举例

●比如,突然出现了某个数据库数据清理任务,与主业务无关,写进原本的项目工程中不太优雅,这时候就可以单独创建一个用于数据操作的容器,在里面完成处理器的开发,通过 PowerJob 的容器部署技术在 Worker 集群上被加载执行。

●比如,常见的日志清理啊,机器状态上报啊,对于广大 Java 程序员来说,也许并不是很会写 shell 脚本,此时也可以借用 agent+容器 技术,利用 Java 完成各项原本需要通过脚本进行的操作。

(感觉例子举的都不是很好…这个东西嘛,只可意会不可言传,大家努力理解一下吧~超好用哦~)

二、OpenAPI

OpenAPI 允许开发者通过接口来完成手工的操作,让系统整体变得更加灵活。开发者可以基于 API 便捷地扩展PowerJob 原有的功能,比如,全面定制自己的任务调度策略。

换句话说,通过 OpenAPI,可以让接入方自己实现 PowerJob 的整个任务管理与调度模块。

1.依赖

最新依赖版本请参考 Maven 中央仓库:推荐地址 & 备用地址

<dependency>

  <groupId>tech.powerjob</groupId>

  <artifactId>powerjob-client</artifactId>

  <version>${latest.powerjob.version}</version>

</dependency>

2.简单示例

通过 OpenAPI 停止某个任务实例。

// 初始化 client,需要server地址和应用名称作为参数

PowerJobClient client = new PowerJobClient("127.0.0.1:7700", "oms-test", "password");

// 调用相关的API

client.stopInstance(1586855173043L)

三、工作流(workflow)

1.什么是工作流?

工作流描述了任务与任务之间的依赖关系,比如我现在有 A、B、C、D 四个任务,我希望 A 任务运行完毕后才开始运行 B、C 任务,最后再运行 D 任务。这就形成了一个依赖关系,可以通过有向无环图(DAG)来描述这个关系,如下图所示。

image.png

四、处理器

对于一些通用的任务,PowerJob 官方编写了可开箱即用的 Processor 来方便各位使用!您只需要引入以下依赖即可享受所有现成的强大的官方处理器!

最新版本请自行从中央仓库获取:点击直达

<dependency><groupId>tech.powerjob</groupId><artifactId>powerjob-official-processors</artifactId><version>${latest.version}</version>

</dependency>

每个官方处理器的详细使用方法请仔细阅读文档,有任何疑惑建议直接阅读源码

由于 JSON 内传递许多参数涉及到转义,强烈建议先用 Java 代码生成配置(JSONObject#put),再调用 toJSONString 方法生成参数。

1. Shell 处理器

全限定类名 tech.powerjob.official.processors.impl.script.ShellProcessor

任务参数:填写需要处理的 Shell 脚本(直接复制文件内容)或脚本下载链接(http://xxx)

2.Python 处理器

全限定类名 tech.powerjob.official.processors.impl.script.PythonProcessor

注意:Python 处理器会使用机器的 python 命令执行,因此 python 版本需要与本机 python 环境保持一致!

任务参数:填写需要处理的 Python 脚本(直接复制文件内容)或脚本下载链接(http://xxx)

3.HTTP 处理器

全限定类名 tech.powerjob.official.processors.impl.HttpProcessor

任务参数(JSON):

  • method必填字段】:GET / POST / DELETE / PUT
  • url必填字段】:请求地址
  • timeout【可选字段】:超时时间,单位为秒
  • mediaType【可选字段】:使用非 GET 请求时,需要传递的数据类型,如 *application/json*
  • body【可选字段】:使用非 GET 请求时的 body 内容,后端使用 String 接收,如果为 JSON 请注意转义
  • headers【可选字段】:请求头,后端使用 Map<String, String> 接收

4.文件清理处理器

**注意:文件删除是高危操作,请慎用该处理器。**默认情况下该处理器不可用,需要传入 JVM 参数

-Dpowerjob.official-processor.file-cleanup.enable=true 开启

全限定类名 tech.powerjob.official.processors.impl.FileCleanupProcessor

任务参数(JSONArray):整体参数为 array,array 中的每个元素为 JSON,描述需要清理的资源,每个节点的参数如下:

  • dirPath:待删除文件的文件夹目录(会递归查找该目录下所有符合要求的文件)
  • filePattern:待删除文件名称的 Java 版正则表达式
  • retentionTime:待删除文件的保留时间,单位为小时(当前时间 - 待删除文件上次编辑时间 > retentionTime 的文件才会被删除),用于保留某些滚动日志,0 代表忽略该规则

由于 JSON 内传递正则表达式需要转义,强烈建议先用 Java 代码生成配置(JSONObject#put, JSONArray#add),再调用 toJSONString 方法生成参数。

5.SQL 处理器

目前内置了两款 SQL 处理器,均支持自定义 SQL 的校验、解析逻辑,主要区别在于数据源连接的获取方式不同。

任务参数(JSON)

  • dataSourceName:数据源名称,仅对 SpringDatasourceSqlProcesssor 生效,非必填,默认使用 default 数据源
  • sql:需要执行的 SQL 语句,必填
  • timeout:SQL 超时时间(秒),非必填,默认值 60
  • jdbcUrl:jdbc 数据库连接,仅对 DynamicDatasourceSqlProcessor 生效,必填
  • showResult:布尔值,是否在实例日志中展示 SQL 执行结果,非必填,默认值 false

建议生产环境使用 AbstractSqlProcessor#registerSqlValidator 方法至少注册一个 SQL 校验器拦截掉非法 SQL,比如 truncate、drop 此类危险操作,或者在数据库账号的权限上做管控。如果需要自定义 SQL 解析逻辑,比如 宏变量替换,参数替换 等,则可以通过指定 AbstractSqlProcessor.SqlParser 来实现。

5.1 SpringDatasourceSqlProcessor

全限定类名 tech.powerjob.official.processors.impl.sql.SpringDatasourceSqlProcessor

默认情况下在初始化的时候需要至少注入一个数据源,所以必须提前手动初始化并注册到 Spring IOC 容器中,以 SpringBean 的方式进行加载。

允许使用 SpringDatasourceSqlProcessor#registerDataSource 方法注册多个数据源

建议:最好将该 SQL Processor 用的数据库连接池和其他业务模块用的数据库连接池隔离开**,不要共用一个连接池!**

5.2DynamicDatasourceSqlProcessor

默认情况下该处理器不可用,需要传入 JVM 参数 -Dpowerjob.official-processor.dynamic-datasource.enable=true 开启

全限定类名 tech.powerjob.official.processors.impl.sql.DynamicDatasourceSqlProcessor

支持通过参数动态指定数据源连接,在指定的数据库执行 SQL。

6.工作流上下文注入处理器

全限定类名 tech.powerjob.official.processors.impl.context.InjectWorkflowContextProcessor ( since v1.2.0 )

该处理器会从任务参数中加载数据,尝试将其解析成 Map ,如果解析成功,则会将其注入到工作流上下文中。

注意,参数必须是一个HashMap<String, Object>的 JSON 串形式,否则会解析失败。

注意:该 Processor 主要用于一些需要注入固定上下文的工作流场景,作为单个任务执行是没有任何意义的

猜你喜欢

转载自blog.csdn.net/zhanggqianglovec/article/details/131501272