对于一些通用的任务,PowerJob 官方编写了可开箱即用的 Processor 来方便各位使用!您只需要引入以下依赖即可享受所有现成的强大的官方处理器!
最新版本请自行从中央仓库获取:点击直达
xml
<dependency>
<groupId>tech.powerjob</groupId>
<artifactId>powerjob-official-processors</artifactId>
<version>${latest.version}</version>
</dependency>
每个官方处理器的详细使用方法请仔细阅读文档,有任何疑惑建议直接阅读源码!
由于 JSON 内传递许多参数涉及到转义,强烈建议先用 Java 代码生成配置(JSONObject#put),再调用 toJSONString 方法生成参数。
Shell 处理器
全限定类名 tech.powerjob.official.processors.impl.script.ShellProcessor
任务参数
填写需要处理的 Shell 脚本(直接复制文件内容)或脚本下载链接(http://xxx)
示例

Python 处理器
全限定类名 tech.powerjob.official.processors.impl.script.PythonProcessor
注意:Python 处理器会使用机器的 python 命令执行,因此 pyth on 版本 需要与本机 python 环境保持一致!
任务参数
填写需要处理的 Python 脚本(直接复制文件内容)或脚本下载链接(http://xxx)
示例

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> 接收
最简 GET 请求示例

文件清理处理器
注意:文件删除是高危操作,请慎用该处理器。 默认情况下该处理器不可用,需要传入 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 方法生成参数。
示例
脚本清理配置

日志清理配置

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 来实现。
SpringDatasourceSqlProcessor
全限定类名 tech.powerjob.official.processors.impl.sql.SpringDatasourceSqlProcessor
默认情况下在初始化的时候需要至少注入一个数据源,所以必须提前手动初始化并注册到 Spring IOC 容器中,以 SpringBean 的方式进行加载。
允许使用 SpringDatasourceSqlProcessor#registerDataSource 方法注册多个数据源
建议:最好将该 SQL Processor 用的数据库连接池和其他业务模块用的数据库连接池隔离 开 ,不要共用一个连接池!
初始化 SpringDatasourceSqlProcessor 示例代码
arduino
@Configuration
public class SqlProcessorConfiguration {
@Bean
@DependsOn({"initPowerJob"})
public DataSource sqlProcessorDataSource() {
String path = System.getProperty("user.home") + "/test/h2/" + CommonUtils.genUUID() + "/";
String jdbcUrl = String.format("jdbc:h2:file:%spowerjob_sql_processor_db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false", path);
HikariConfig config = new HikariConfig();
config.setDriverClassName(Driver.class.getName());
config.setJdbcUrl(jdbcUrl);
config.setAutoCommit(true);
// 池中最小空闲连接数量
config.setMinimumIdle(1);
// 池中最大连接数量
config.setMaximumPoolSize(10);
return new HikariDataSource(config);
}
@Bean
public SpringDatasourceSqlProcessor simpleSpringSqlProcessor(@Qualifier("sqlProcessorDataSource") DataSource dataSource) {
SpringDatasourceSqlProcessor springDatasourceSqlProcessor = new SpringDatasourceSqlProcessor(dataSource);
// do nothing
springDatasourceSqlProcessor.registerSqlValidator("fakeSqlValidator", sql -> true);
// 排除掉包含 drop 的 SQL
springDatasourceSqlProcessor.registerSqlValidator("interceptDropValidator", sql -> sql.matches("^(?i)((?!drop).)*$"));
// do nothing
springDatasourceSqlProcessor.setSqlParser((sql, taskContext) -> sql);
return springDatasourceSqlProcessor;
}
}
参数配置示例
使用默认数据源,执行 SQL : select 'x' from t_example ,限定超时时间为 10 秒,并且在实例日志中展示结果
json
{
"dataSourceName": "default",
"sql": "select 'x' from t_example",
"timeout": 10,
"showResult": true
}
DynamicDatasourceSqlProcessor
默认情况下该处理器不可用,需要传入 JVM 参数 -Dpowerjob.official-processor.dynamic-datasource.enable=true 开启
全限定类名 tech.powerjob.official.processors.impl.sql.DynamicDatasourceSqlProcessor
支持通过参数动态指定数据源连接,在指定的数据库执行 SQL。
参数配置示例
json
{
"sql": "select 'x' from t_example",
"timeout": 10,
"showResult": true,
"jdbcUrl":"jdbc:mysql://myhost1:3306/db_name?user=root&password=mypass",
}
工作流上下文注入处理器
全限定类名 tech.powerjob.official.processors.impl.context.InjectWorkflowContextProcessor ( since v1.2.0 )
该处理器会从任务参数中加载数据,尝试将其解析成 Map ,如果解析成功,则会将其注入到工作流上下文中。
注意,参数必须是一个HashMap<String, Object>的 JSON 串形式,否则会解析失败。
注意:该 Processor 主要用于一些需要注入固定上下文的工作流场景,作为单个任务执行是没有任何意义的
参数配置示例
json
{
"uid": "powerjob_001",
"createTime": 1662210950000,
}
动态配置处理器
简易版配置中心,适用于没有 nacos 等配置中心时临时需要动态下发配置的场景。
该处理器原理非常简单,将控制台的 jobParams 写入类本身的 static 变量中,这样开发者可直接通过静态方法获取到 Job 的配置(ConfigProcessor#fetchConfig),起到伪配置中心的效果。
全限定类名:tech.powerjob.official.processors.impl.ConfigProcessor
执行模式:广播!!!(需要保证每台机器都下发配置,必须选广播执行!!!)
参数说明:
arduino
public static class Config implements Serializable {
/**
* 原始配置,通过 ConfigProcessor#fetchConfig 真正能获取到的部分
*/
private Map<String, Object> config;
/**
* 持久到本地的全路径名称,空代表不持久化(不需要则留空即可)
*/
private String persistentFileName;
}
最简参数示例:
json
{
"config":{
"keyA":"valueA",
"keyB":"valueB",
"tips":"config内可放置任意层级的 JSON 数据,完全透传"
}
}
以下为控制台完整配置,再次强调
- 执行模式必须选择为:广播执行!!!
- 定时信息:建议选择 1 分钟的 CRON(参数1分钟更新一次),表达式:
0 * * * * ?

使用代码示例(非常简单,通过 ConfigProcessor.fetchConfig()获取到 config):
ini
// 测试配置中心获取数据
Map<String, Object> dynamicConfig = ConfigProcessor.fetchConfig();
Object valueA = dynamicConfig.get("keyA");
logger.info("[Test] dynamicConfig: {}, fetchByKeyA: {}", dynamicConfig, valueA);