基于宿主应用的初始化
宿主应用即原有的业务应用,假如需要调度执行的任务与当前业务有较为紧密的联系,建议采取该方式。
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,可以考虑实现),原因如下:
-
powerjob-worker 的日志基于
Slf4J输出,即采用了基于门面设计模式的日志框架,宿主应用无论如何都可以搭起 Slf4J 与实际的日志框架这座桥梁。 -
减轻了部分开发工作量,不再需要实现自己的 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.