当前位置: 欣欣网 > 码农

项目终于用上了 PowerJob !

2024-06-08码农

👉 欢迎 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 每月赠书

新项目: 仿小红书 (微服务架构)正在更新中... , 全栈前后端分离博客项目 2.0 版本完结啦, 演示链接 http://116.62.199.48/ 。全程手摸手,后端 + 前端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,直到项目上线。 目前已更新了261小节,累计43w+字,讲解图:1806张,还在持续爆肝中.. 后续还会上新更多项目,目标是将Java领域典型的项目都整一波,如秒杀系统, 在线商城, IM即时通讯,Spring Cloud Alibaba 等等,

最近项目中使用了PowerJob做任务调度模块,感觉这个框架真香,今天我们就来深入了解一下新一代的定时任务框架——PowerJob!

简介

PowerJob是基于java开发的企业级的分布式任务调度平台,与xxl-job一样,基于web页面实现任务调度配置与记录,使用简单,上手快速,其主要功能特性如下:

  • 使用简单 :提供前端Web界面,允许开发者可视化地完成调度任务的管理(增、删、改、查)、任务运行状态监控和运行日志查看等功能。

  • 定时策略完善 :支持 CRON 表达式、固定频率、固定延迟和API四种定时调度策略。

  • 执行模式丰富 :支持单机、广播、Map、MapReduce 四种执行模式,其中 Map/MapReduce 处理器能使开发者寥寥数行代码便获得集群分布式计算的能力。

  • 工作流支持 :支持在线配置任务依赖关系(DAG),以可视化的方式对任务进行编排,同时还支持上下游任务间的数据传递,以及多种节点类型(判断节点 & 嵌套工作流节点)。

  • 执行器支持广泛 :支持 Spring Bean、内置/外置 Java 类,另外可以通过引入官方提供的依赖包,一键集成 Shell、Python、HTTP、SQL 等处理器,应用范围广。

  • 运维便捷 :支持在线日志功能,执行器产生的日志可以在前端控制台页面实时显示,降低 debug 成本,极大地提高开发效率。

  • 依赖精简 :最小仅依赖关系型数据库(MySQL/PostgreSQL/Oracle/MS SQLServer…)

  • 高可用 & 高性能 :调度服务器经过精心设计,一改其他调度框架基于数据库锁的策略,实现了无锁化调度。部署多个调度服务器可以同时实现高可用和性能的提升(支持无限的水平扩展)。

  • 故障转移与恢复 :任务执行失败后,可根据配置的重试策略完成重试,只要执行器集群有足够的计算节点,任务就能顺利完成。

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

    图片

    官网文档:http://www.powerjob.tech/

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

  • API : 通过客户端提供的api接口触发,服务端不会主动调度,适用于与业务服务上下连接或只调度一次的业务场景

  • CRON : 通过cron表达式调度,这是多数定时任务框架都支持的

  • 固定频率 :每隔多少毫秒执行一次。

  • 固定延迟 :延迟多少毫秒执行一次

  • 工作流 :配合工作流进行调度,服务端不会主动调度,当工作流节点执行到该任务时运行。

  • 安装

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

    docker的安装较为简单,且官网有详细说明,这里就不单独讲解了,大家可参考官方文档:

    https://www.yuque.com/powerjob/guidence/docker-compose

    如何通过jar形式运行的

    1、首先我们可以在github上下载源码,可以自己编译打包

    https://github.com/PowerJob/PowerJob

    可以在releases中下载指定版本

    2、在IDE中打开后,我们 powerjob-server 就是我们要的服务端源码,可以直接编译,而 powerjob-worker-samples 就是springboot下的使用示例

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

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

    4、然后将 powerjob-server/powerjob-server-starter 下的 application-daily.properties 配置文件中的数据库配置改成你服务器的

    其中daily,pre,product 表示日常、预生产、生产环境下的配置,与我们常见的dev, test, prod类似,可以根据需要进行调整

    图片

    其中还有邮箱及其他配置,如果有需要也可以调整,服务端的参数配置可参考官网文档。

    5、我们先来本地运行启动类PowerJobServerApplication一下试试,启动成功后,访问http://localhost:7700,出现登陆页则说明运行成功

    图片

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

    7、然后用该执行器名和密码登录

    8、如下,我们就登录成功了

    图片

    9、如果需要发布到服务器或虚拟机上运行,可以进行编译打包操作:

    1)点击 mvn install 将依赖包打包到本地仓库

    图片

    注意,如果这里报错

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

    那么可以将maven的健康检查关闭。

    点击如图所示按钮,并且看到test置灰,则表示关闭

    图片

    2)执行mvn package打包项目

    图片

    10、在 powerjob-server-starter 的target目录下即可看到打包出来的jar,将其上传到指定服务器,通过 java -jar 指令即可运行

    图片

    定时任务创建

    1、创建一个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>

    推荐一个开源免费的 Spring Boot 实战项目:

    https://github.com/javastacks/spring-boot-best-practice

    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

    3、启动类上添加注解@EnableScheduling

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

    /**
     * @author benjamin_5
     * @Description 简单任务执行器
     * @date 2023/5/3
     */
    @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"定时任务执行成功");
    }
    }

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

    图片

    6、服务端任务管理点击新建任务

    其中处理器配置是通过书写处理器的全类路径名来声明的,比如我这里是 com.example.powerjobdemo.job.SimpleJobServer

    图片

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

    图片

    8、打开客户端控制台,也能看到输出的参数和执行打印,说明任务执行成功

    图片

    9、同时我们可以在运行记录中看到执行日志

    图片

    图片

    至此,针对powerjob的最简单使用就完成了,接下来我们继续来看关于powjob的配置详解。

    任务配置参数详解

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

    图片

    定时信息:

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

    生命周期:

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

    执行配置:

  • 执行类型支持单机执行、广播执行、Map执行、MapReduce执行

  • 单机执行表示只需要有一个节点执行任务即可的场景

  • 广播执行表示需要全部节点一同执行的场景,比如清除机器日志、各节点数据统计

  • Map与MapReduce执行都是表示分布式、分批执行,用来拆分计算量、耗时较大的任务,区别在于Map执行是一种简单的数据处理逻辑,特点是将输入数据拆分成多个子块,并交给多个分布式节点同时执行,以提高数据处理效率,适用于简单的数据处理场景

  • MapReduce执行是一种大数据处理框架,处理逻辑是将复杂的数据处理拆分成Map和Reduce阶段进行处理,通过数据分组计算后合并来提供数据处理效率,更适合复杂的大数据场景

  • 运行时配置:

  • 支持 HEALTH_FIRST RANDOM ,即第一个健康节点和随机,用于选择执行处理器节点的策略。

  • 最大实例数用于控制处理器节点数量,线程并发度用于控制并发,运行时间限制

  • 更多说明,可在官方文档中查看。

    👉 欢迎 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 每月赠书

    新项目: 仿小红书 (微服务架构)正在更新中... , 全栈前后端分离博客项目 2.0 版本完结啦, 演示链接 http://116.62.199.48/ 。全程手摸手,后端 + 前端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,直到项目上线。 目前已更新了261小节,累计43w+字,讲解图:1806张,还在持续爆肝中.. 后续还会上新更多项目,目标是将Java领域典型的项目都整一波,如秒杀系统, 在线商城, IM即时通讯,Spring Cloud Alibaba 等等,


    1. 

    2. 

    3. 

    4. 

    最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

    获取方式:点「在看」,关注公众号并回复 Java 领取,更多内容陆续奉上。

    PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。

    「在看」支持小哈呀,谢谢啦