定时任务启动
MDP 的定时任务当前主要承担开放平台推送管道的失败重试:事件推送、接口回调投递失败后,由定时任务周期扫描失败任务并按梯度补投(机制见事件回调(平台侧))。同时它也是二开自定义定时任务的执行器。
定时任务链路的角色划分(两种部署形态一致):
| 进程 | 角色 | 端口 | 说明 |
|---|---|---|---|
| PowerJob | 调度中心 | 17700 | 开源项目,自行下载最新源码,独立部署:PowerJob |
| worker-server | 执行器 | 23457 | 全项目唯一的执行器 |
内置的两个重试处理器(worker-server/.../worker/processors/):
| 处理器 | 职责 | 建议 cron |
|---|---|---|
EventPushRetryProcessor | 事件推送重试扫描(EventPushService.retry,单次批量上限 500) | 0 0/8 * * * ?(每 8 分钟) |
NotifyInfoRetryProcessor | 接口回调重试扫描(NotifyInfoService.retry,单次批量上限 500) | 0 0/10 * * * ?(每 10 分钟) |
一、启动调度中心 PowerJob
下载源码:
git clone https://github.com/PowerJob/PowerJob.git修改
powerjob-server-starter/src/main/resources/application-daily.properties:数据库连接、端口(必须是 17700,与 worker-server 的powerjob.worker.server-address一致),其他配置参阅 PowerJob 官方文档。####### Database properties(Configure according to the the environment) ####### spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.core.jdbc-url=jdbc:mysql://<DB_HOST>:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai spring.datasource.core.username=<DB_USERNAME> spring.datasource.core.password=<DB_PASSWORD> ####### Storage properties(Delete if not needed) ####### oms.storage.dfs.mysql_series.driver=com.mysql.cj.jdbc.Driver oms.storage.dfs.mysql_series.url=jdbc:mysql://<DB_HOST>:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai oms.storage.dfs.mysql_series.username=<DB_USERNAME> oms.storage.dfs.mysql_series.password=<DB_PASSWORD> # 必须与 worker-server 的 powerjob.worker.server-address 端口一致 server.port=17700需要单独准备一个 PowerJob 使用的库(示例
powerjob-daily),建表方式和表结构以 PowerJob 官方文档为准。编译源码后启动
PowerJobServerApplication。在 PowerJob 控制台新建应用,名称必须为
MDP(与worker-server/src/main/resources/application.yml里的powerjob.worker.app-name: MDP一致)。这一步不能省
应用未预先注册时 worker 启动会失败——这是 PowerJob 官方 starter 的 fail fast 行为(
PowerJobAutoConfiguration要求appName与提交到 server 的应用名一致),报错信息里会直接点出 appName。
二、启动执行器 worker-server
修改
worker-server/src/main/resources/application-{env}.yml,按「只跑定时任务」配置两个开关:dubbo: # ⭐️ 只跑定时任务、不提供开放接口时关闭(微服务版必须关闭, 单体版需要时可以启用) enabled: false powerjob: worker: # ⭐️ 作为执行器,这里必须是 true(注意 dev 出厂值是 false) enabled: true启动
WorkerServerApplication。
微服务版部署 worker-server 务必关闭 dubbo
微服务版里开放接口应由 api-server 承担,漏掉 dubbo.enabled: false 会让 worker-server 与 api-server 注册成同一批 provider,被 sop-gateway 轮询到,表现为「同样的接口有时通有时不通」。开关原理见架构介绍 3.3 节。
单体版可以一次启动兼任两职
单体版把 dubbo.enabled 和 powerjob.worker.enabled 同时设为 true,worker-server 就同时承接开放接口与定时任务,少起一个进程。
三、创建重试任务
执行器在线后,两个重试处理器不会自动运行——需要在 PowerJob 控制台(应用 MDP 下)各建一个任务:
| 配置项 | 事件推送重试 | 接口回调重试 |
|---|---|---|
| 任务名称 | 事件推送重试扫描(可自定) | 接口回调重试扫描(可自定) |
| 处理器 | top.mddata.worker.processors.EventPushRetryProcessor | top.mddata.worker.processors.NotifyInfoRetryProcessor |
| 执行方式 | 单机执行(STANDALONE) | 单机执行(STANDALONE) |
| 调度(cron) | 0 0/8 * * * ? | 0 0/10 * * * ? |
cron 取自处理器类的注释建议值(沿用平台历史扫描周期),可按业务量自行调密/调疏。
四、验证
- PowerJob 控制台:应用
MDP下能看到在线 worker 实例; - 手动触发一次「事件推送重试扫描」,worker-server 日志应输出「事件推送重试扫描完成」;
- 制造一条失败的推送(如把应用回调地址改成不可达地址后触发事件),等任务执行后查
mdo_event_push_log应有补投记录。
五、常见问题
| 现象 | 原因与处理 |
|---|---|
worker-server 启动报 serverAddress can't be null 或连不上调度中心 | powerjob.worker.enabled 为 true 但没起 PowerJob。不测定时任务就把它设为 false;别用 allow-lazy-connect-server 代替开关 |
| worker 启动失败,报错提到 appName | PowerJob 控制台没有预建应用 MDP(名称必须完全一致) |
| 任务在 PowerJob 上创建了但一直不执行 | 检查应用 MDP 下 worker 是否在线、server-address 端口是否为 17700、任务 cron 是否启用 |
| 推送失败后一直没有补投 | 两个重试任务没建/没启用;或 worker-server 没起(dev 出厂 powerjob.worker.enabled: false) |
| 定时任务日志里出现 Dubbo 注册相关信息 | dubbo.enabled 没关。只跑定时任务时应设为 false,避免多余的注册行为 |