【PowerJob语雀转载】 官方处理器

对于一些通用的任务,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);
相关推荐
随风飘的云2 小时前
springboot的启动流程核心原理
后端·面试
skeletron20112 小时前
【PowerJob语雀转载】执行器(powerjob-worker)初始化
后端
Moe4882 小时前
ConcurrentHashMap 重要方法实现原理和源码解析(二)
java·后端
Moe4883 小时前
ConcurrentHashMap 重要方法实现原理和源码解析(一)
java·后端
hweiyu003 小时前
GO的优缺点
开发语言·后端·golang
大橙子打游戏3 小时前
在Xcode里自由使用第三方大模型?这个本地代理工具帮你实现!
后端
h***34633 小时前
Nginx 缓存清理
android·前端·后端
程序员爱钓鱼3 小时前
Python编程实战:用好 pdb 和 logging,程序再也不黑箱运行了
后端·python·trae
程序员爱钓鱼3 小时前
Python编程实战:从 timeit 到 cProfile,一次搞懂代码为什么慢
后端·python·trae