定时任务之PowerJob讲解

1 PowerJob

1.1 简介

PowerJob 是基于java开发的企业级的分布式任务调度平台,与 xxl-job 一样,基于web页面实现任务调度配置与记录,使用简单,上手快速
官网文档:http://www.powerjob.tech/
点击此处了解 xxl-job API方式接入 讲解

1.2 特性

主要功能特性如下:

  • 使用简单:提供前端Web界面,允许开发者可视化地完成调度任务的管理(增、删、改、查)、任务运行状态监控和运行日志查看等功能。
  • 定时策略完善:支持 CRON 表达式、固定频率、固定延迟和API四种定时调度策略。
  • 执行模式丰富:支持单机、广播、Map、MapReduce 四种执行模式,其中 Map/MapReduce 处理器能使开发者寥寥数行代码便获得集群分布式计算的能力。
  • 工作流支持:支持在线配置任务依赖关系(DAG),以可视化的方式对任务进行编排,同时还支持上下游任务间的数据传递,以及多种节点类型(判断节点 & 嵌套工作流节点)。
  • 执行器支持广泛:支持 Spring Bean、内置/外置 Java 类,另外可以通过引入官方提供的依赖包,一键集成 Shell、Python、HTTP、SQL 等处理器,应用范围广。
  • 运维便捷:支持在线日志功能,执行器产生的日志可以在前端控制台页面实时显示,降低 debug 成本,极大地提高开发效率。
  • 依赖精简:最小仅依赖关系型数据库(MySQL/PostgreSQL/Oracle/MS SQLServer…)
  • 高可用 & 高性能:调度服务器经过精心设计,一改其他调度框架基于数据库锁的策略,实现了无锁化调度。部署多个调度服务器可以同时实现高可用和性能的提升(支持无限的水平扩展)。
  • 故障转移与恢复:任务执行失败后,可根据配置的重试策略完成重试,只要执行器集群有足够的计算节点,任务就能顺利完成。

相对于其他定时任务框架具有无锁化设计,更强悍的性能支撑,我们通过官网的产品对比可以了解详情:

QuartZ xxl-job SchedulerX 2.0 PowerJob
定时类型 CRON CRON CRON、固定频率、固定延迟、OpenAI CRON、固定频率、固定延迟、OpenAI
任务类型 内置Java 内置Java、Glue Java、Shell、Python等脚本 内置Java、外置Java(FatJar)、Shell、Python等脚本 内置Java、外置Java(容器)、Shell、Python等脚本
分片式任务 静态分片 MapReduce动态分片 MapReduce动态分片
在线治理任务 不支持 支持 支持 支持
日志白屏化 不支持 支持 不支持 支持
调度方式及性能 基于数据库锁,有性能瓶颈 基于数据库锁,有性能瓶颈 无锁化设计,性能强劲无上限
报警监控 邮件 短信 邮件,提供接口允许二次开发
系统依赖 关系型数据库(MySQL、Oracle等) MySQL 不直接依赖于特定的数据库,与其他服务(如DataWorks)结合使用 任务SpringDataJpa支持的关系型数据库(MySQL、Oracle等)
DAG工作流 不支持 不支持 支持 支持

因此,与传统的定时任务框架对比,PowerJob支持更多的定时任务类型:

  • API:通过客户端提供的api接口触发,服务端不会主动调度,适用于与业务服务上下连接或只调度一次的业务场景
  • CRON:通过cron表达式调度,这是多数定时任务框架都支持的
  • 固定频率:每隔多少毫秒执行一次。
  • 固定延迟:延迟多少毫秒执行一次
  • 工作流:配合工作流进行调度,服务端不会主动调度,当工作流节点执行到该任务时运行。

1.3 安装

PowerJob支持两种安装方式,一是通过jar包运行,一是通过docker安装

1.3.1 docker安装

docker可参考官方文档:https://www.yuque.com/powerjob/guidence/docker-compose

1.3.2 jar安装

如何通过jar形式运行的

1.3.2.1 下载源码

在github上下载源码,可以自己编译打包,下载地址:https://github.com/PowerJob/PowerJob

可以在releases中下载指定版本
在这里插入图片描述
IDE 中打开后,powerjob-server就是我们要的服务端源码,可以直接编译,而 powerjob-worker-samples就是springboot下的使用示例

1.3.2.2 创建数据及修改配置文件

在运行编译服务端之前,我们需要先创建数据库,在指定的数据库下创建即可

CREATE DATABASE IF NOT EXISTS `powerjob-daily` DEFAULT CHARSET utf8mb4

然后将 powerjob-server/powerjob-server-starter 下的 application-daily.properties 配置文件中的数据库配置改成修改后的服务器
其中daily,pre,product 表示日常、预生产、生产环境下的配置,与我们常见的dev, test, prod类似,可以根据需要进行调整
在这里插入图片描述
其中还有邮箱及其他配置,如果有需要也可以调整,服务端的参数配置可参考官网文档。

1.3.2.3 启动

本地运行启动类 PowerJobServerApplication一下试试,启动成功后,访问http://localhost:7700,出现登陆页则说明运行成功
在这里插入图片描述

1.3.2.4 注册执行器

注册一个执行器,注意这里的应用名称不能顺便取,下文在客户端的配置的app-name要与该名称保持一致
图片

1.3.2.5 登录执行器

用该执行器名和密码登录
在这里插入图片描述

1.3.2.6 登录

如下,我们就登录成功了
图片

1.3.2.7 发布到服务器

如果需要发布到服务器或虚拟机上运行,可以进行编译打包操作:
点击 mvn install 将依赖包打包到本地仓库

注意,如果这里报错,那么可以将maven的健康检查关闭。

Please refer to /Library/project/study/java/PowerJob-4.3.2/powerjob-server/powerjob-server-starter/target/surefire-reports for the individual test results.

执行mvn package打包项目

powerjob-server-startertarget目录下即可看到打包出来的jar,将其上传到指定服务器,通过java -jar指令即可运行
在这里插入图片描述

1.4 使用

1.4.1 创建项目

1.4.1.1 pom.xml

创建一个 springboot 项目,用于定时任务客户端,引入客户端依赖,如果是spring或其他java项目引入,可参考官网文档:
https://www.yuque.com/powerjob/guidence/ygonln

<dependency>
    <groupId>tech.powerjob</groupId>
    <artifactId>powerjob-worker-spring-boot-starter</artifactId>
    <version>4.3.2</version>
</dependency>

1.4.1.2 配置文件

修改配置文件

powerjob:
  worker:
    enabled: true
    enable-test-mode: false
    # 数据传输端口,默认27777
    port: 27777
    # 应用名称,与服务端创建的应用账号的名称保持一致
    app-name: powerjob-agent-test
    # 服务端地址,多个用,隔开
    server-address: 127.0.0.1:7700
    # 通讯协议,4.3.0之后支持http和akka,4.3.0之前仅支持akka,官方推荐http
    protocol: http
    # 任务返回结果信息的最大长度,超过该值将被截断
    max-result-length: 4096
    # 同时运行的轻量级任务数量上限
    max-lightweight-task-num: 1024
    # 同时运行的重量级任务数量上限
    max-heavy-task-num: 64

1.4.1.3 启动配置

启动类上添加注解 @EnableScheduling

1.4.1.4 任务示例类

通过申明 BasicProcessor接口,实现process方法来书写一个简单的定时任务示例类,注意要声明为bean

package com.example.powerjobdemo.job;
/**
 * @Description 简单任务执行器
 */
@Component
public class SimpleJobServer implements BasicProcessor {

    @Override
    public ProcessResult process(TaskContext taskContext) throws Exception {
        String jobParams = taskContext.getJobParams();
        System.out.println("参数: " + jobParams);

        System.out.println("定时任务执行");

        return new ProcessResult(true, "定时任务执行成功");
    }
}

1.4.1.5 启动项目

启动客户端项目,运行成功后,可以在服务端首页看到机器实例
图片

1.4.2 管理定时任务

1.4.2.1 服务端任务管理

点击新建任务,其中处理器配置是通过书写处理器的全类路径名来声明的,比如这里是com.example.powerjobdemo.job.SimpleJobServer
在这里插入图片描述

1.4.2.2 查看任务

创建成功后,可以在列表看到新建的任务
图片

1.4.2.3 测试定时任务

打开客户端控制台,也能看到输出的参数和执行打印,说明任务执行成功
在这里插入图片描述
同时我们可以在运行记录中看到执行日志
图片
在这里插入图片描述

1.5 任务配置参数详解

创建任务时我们可以看到如下图所示的配置:
图片

1.5.1 定时信息

主要选择定时任务类型,支持 API, CRON,固定频率、固定延迟、工作流、每日固定间隔等几种定时任务类型。

1.5.2 生命周期

这是比其他任务框架更便捷的功能,指定了任务的生命周期,如果该任务是预定某时间段内执行的,可以通过该参数配置

1.5.3 执行配置

执行配置:

  • 执行类型支持单机执行、广播执行、Map执行、MapReduce执行
  • 单机执行表示只需要有一个节点执行任务即可的场景
  • 广播执行表示需要全部节点一同执行的场景,比如清除机器日志、各节点数据统计
  • Map与MapReduce执行都是表示分布式、分批执行,用来拆分计算量、耗时较大的任务,区别在于Map执行是一种简单的数据处理逻辑,特点是将输入数据拆分成多个子块,并交给多个分布式节点同时执行,以提高数据处理效率,适用于简单的数据处理场景
  • MapReduce执行是一种大数据处理框架,处理逻辑是将复杂的数据处理拆分成Map和Reduce阶段进行处理,通过数据分组计算后合并来提供数据处理效率,更适合复杂的大数据场景

1.5.4 运行时配置

支持HEALTH_FIRST和RANDOM,即第一个健康节点和随机,用于选择执行处理器节点的策略。
最大实例数用于控制处理器节点数量,线程并发度用于控制并发,运行时间限制

posted @ 2024-06-09 10:17  上善若泪  阅读(41)  评论(0编辑  收藏  举报