【PowerJob语雀转载】执行器(powerjob-worker)初始化

基于宿主应用的初始化

宿主应用即原有的业务应用,假如需要调度执行的任务与当前业务有较为紧密的联系,建议采取该方式。

SpringBoot 应用接入方式

⚠️:如果 SpringBoot 存在版本兼容性问题导致无法顺利初始化,可使用代码手动初始化JavaBean的方式:LINK

首先,添加相关的依赖,最新依赖版本请参考 maven 中央仓库:推荐地址 & 备用地址

xml 复制代码
<dependency>
    <groupId>tech.powerjob</groupId>
    <artifactId>powerjob-worker-spring-boot-starter</artifactId>
    <version>${latest.powerjob.version}</version>
</dependency>

随后,在 SpringBoot 配置文件(application.yml/properties)中添加相关的配置项。

ini 复制代码
# akka 工作端口,可选,默认 27777
powerjob.worker.akka-port=27777
# 接入应用名称,用于分组隔离,推荐填写 本 Java 项目名称
powerjob.worker.app-name=my-powerjob-worker
# 调度服务器地址,IP:Port 或 域名,多值逗号分隔
powerjob.worker.server-address=127.0.0.1:7700,127.0.0.1:7701
# 通讯协议,4.3.0 开始支持 HTTP 和 AKKA 两种协议,官方推荐使用 HTTP 协议(注意 server 和 worker 都要开放相应端口)
powerjob.worker.protocol=http
# 持久化方式,可选,默认 disk
powerjob.worker.store-strategy=disk
# 任务返回结果信息的最大长度,超过这个长度的信息会被截断,默认值 8192
powerjob.worker.max-result-length=4096
# 单个任务追加的工作流上下文最大长度,超过这个长度的会被直接丢弃,默认值 8192
powerjob.worker.max-appended-wf-context-length=4096
# 同时运行的轻量级任务数量上限
powerjob.worker.max-lightweight-task-num=1024
# 同时运行的重量级任务数量上限
powerjob.worker.max-heavy-task-num=64

最后,为了更好的观察 powerjob-worker 的运行情况,建议为 powerjob-worker 单独配置日志输出,详细教程见 日志单独配置

普通应用接入方式 (Spring 或 普通 Java 项目)

首先,添加相关的依赖,最新依赖版本请参考maven中央仓库:推荐地址 & 备用地址****

xml 复制代码
<dependency>
  <groupId>tech.powerjob</groupId>
  <artifactId>powerjob-worker</artifactId>
  <version>${latest.powerjob.version}</version>
</dependency>

随后,手动初始化 PowerJobWorker 对象。PowerJobWorker 对象的初始化依赖于配置类 PowerJobWorkerConfig,各参数说明如下表所示:

属性名称 含义 默认值
appName 宿主应用名称,需要提前在控制台完成注册 无,必填项,否则启动报错
port Worker 工作端口 27777,不推荐修改
serverAddress 调度中心(powerjob-server)地址列表 无,必填项,否则启动报错
storeStrategy 本地存储策略,枚举值磁盘/内存,大型MapReduce 等会产生大量 Task 的任务推荐使用磁盘降低内存压力,否则建议使用内存加速计算 StoreStrategy.DISK(磁盘)
protocol 与 server 的通讯协议 出于兼容性考虑仍未 AKKA,但建议手动改为 HTTP
maxResultLength 每个Task返回结果的默认长度,超长将被截断,过长可能导致网络拥塞 8096
userContext 用户自定义上下文对象,该值会被透传到 TaskContext#userContext 属性(可选参数) null
allowLazyConnectServer 是否允许延迟连接 server。启用后无需Server也能顺利启动PowerJobWorker,用于本地无 server 启动等场景 false
maxAppendedWfContextLength 单个任务向工作流上下文中追加数据的最大长度,超过这个长度会被直接丢弃 8192
maxLightweightTaskNum 同时运行的轻量级任务数量上限 1024
maxHeavyweightTaskNum 同时运行的重量级任务数量上限 64
healthReportInterval worker 健康状态上报的间隔(秒) 10
processorFactoryList 处理器工厂,允许自己定制处理器加载逻辑来支持丰富的扩展需求 null

最后,初始化客户端,完成执行器的启动,代码示例如下:

  • Spring 用户请使用 PowerJobSpringWorker

  • 非 Spring 用户请使用 PowerJobWorker

arduino 复制代码
@Configuration
public class PowerJobWorkerConfiguration {

    @Bean
    public PowerJobSpringWorker initPowerJobWorker() throws Exception {

        // 1. 创建配置文件
        PowerJobWorkerConfig config = new PowerJobWorkerConfig();
        config.setPort(28888);
        config.setAppName("my-java-application");
        config.setServerAddress(Lists.newArrayList("127.0.0.1:7700", "127.0.0.1:7701"));
        // 如果没有大型 Map/MapReduce 的需求,建议使用内存来加速计算
        config.setStoreStrategy(StoreStrategy.DISK);

        // 2. 创建 Worker 对象,设置配置文件(注意 Spring 用户需要使用 PowerJobSpringWorker,而不是 PowerJobWorker)
        PowerJobSpringWorker worker = new PowerJobSpringWorker(config);
        return worker;
    }
}

非 Spring 应用程序在创建 PowerJobWorker 对象后手动调用 powerJobWorker.init() 方法完成初始化即可。


日志单独配置

目前,powerjob-worker 并没有实现自己的 LogFactory(如果有需求的话请提 ISSUE,可以考虑实现),原因如下:

  1. powerjob-worker 的日志基于 Slf4J 输出,即采用了基于门面设计模式的日志框架,宿主应用无论如何都可以搭起 Slf4J 与实际的日志框架这座桥梁。

  2. 减轻了部分开发工作量,不再需要实现自己的 LogFactory。

为此,为了顺利且友好地输出日志,请在日志配置文件(logback.xml/log4j2.xml/...)中为 powerjob-worker 单独进行日志配置,比如(logback 示例):

xml 复制代码
<appender name="POWERJOB_WORKER_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH}/powerjob-worker.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>${LOG_PATH}/powerjob-worker.%d{yyyy-MM-dd}.log</FileNamePattern>
        <MaxHistory>7</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <append>true</append>
</appender>

<logger name="tech.powerjob" level="INFO" additivity="false">
    <appender-ref ref="POWERJOB_WORKER_APPENDER" />
</logger>

无论如何,powerjob-worker 启动时都会打印 Banner(如下所示),您可以通过 Banner 来判断日志配置是否成功。

复制代码
 ███████                                          ██          ██
░██░░░░██                                        ░██         ░██
░██   ░██  ██████  ███     ██  █████  ██████     ░██  ██████ ░██
░███████  ██░░░░██░░██  █ ░██ ██░░░██░░██░░█     ░██ ██░░░░██░██████
░██░░░░  ░██   ░██ ░██ ███░██░███████ ░██ ░      ░██░██   ░██░██░░░██
░██      ░██   ░██ ░████░████░██░░░░  ░██    ██  ░██░██   ░██░██  ░██
░██      ░░██████  ███░ ░░░██░░██████░███   ░░█████ ░░██████ ░██████
░░        ░░░░░░  ░░░    ░░░  ░░░░░░ ░░░     ░░░░░   ░░░░░░  ░░░░░

基于代理应用(powerjob-agent)的初始化

agent 是一个仅集成了官方处理器的执行器(其实就是为 worker 加了一个 main 方法),如果常见需求为脚本的调度执行,可以考虑直接部署 agent,简单快捷方便~

推荐直接使用 Docker 部署: powerjob-agent

与 server 一样,启动参数通过环境变量-e PARAMS传入,全部参数请见底部。

bash 复制代码
docker run -d 
-e PARAMS="--app powerjob-agent-test --server 192.168.1.1:7700,192.168.1.2:7700"
-p 27777:27777 --name powerjob-agent
-v ~/docker/powerjob-agent:/root powerjob/powerjob-agent:$version

或直接启动 agent 的jar包:java -jar powerjob-worker-agent-3.1.0.jar -a my-agent -s 127.0.0.1:7700

xml 复制代码
Usage: PowerJobAgent [-hV] -a=<appName> [-e=<storeStrategy>] [-l=<length>]
                     [-o=<protocol>] [-p=<port>] -s=<server> [-t=<tag>]
powerjob-worker agent
  -a, --app=<appName>     worker-agent's name
  -e, --persistence=<storeStrategy>
                          storage strategy, DISK or MEMORY
  -h, --help              Show this help message and exit.
  -l, --length=<length>   ProcessResult#msg max length
  -o, --protocol=<protocol>
                          transporter protocol, AKKA or HTTP
  -p, --port=<port>       transporter working port, not recommended to change
  -s, --server=<server>   oms-server's address, IP:Port OR domain
  -t, --tag=<tag>         worker-agent's tag
  -V, --version           Print version information and exit.
相关推荐
随风飘的云2 小时前
springboot的启动流程核心原理
后端·面试
Moe4882 小时前
ConcurrentHashMap 重要方法实现原理和源码解析(二)
java·后端
skeletron20112 小时前
【PowerJob语雀转载】 官方处理器
后端
Moe4883 小时前
ConcurrentHashMap 重要方法实现原理和源码解析(一)
java·后端
hweiyu003 小时前
GO的优缺点
开发语言·后端·golang
大橙子打游戏3 小时前
在Xcode里自由使用第三方大模型?这个本地代理工具帮你实现!
后端
h***34633 小时前
Nginx 缓存清理
android·前端·后端
程序员爱钓鱼3 小时前
Python编程实战:用好 pdb 和 logging,程序再也不黑箱运行了
后端·python·trae
程序员爱钓鱼3 小时前
Python编程实战:从 timeit 到 cProfile,一次搞懂代码为什么慢
后端·python·trae