java timer.schedule如何控制执行次数_Java 分布式任务调度平台:PowerJob 快速开始+配置详解...

news/2024/7/4 7:39:45

本文适合有 Java 基础知识的人群

6ba5868ca71bb874f8658a4a13ff0c8f.png

作者:HelloGitHub-Salieri

引言

HelloGitHub 推出的《讲解开源项目》[1]系列。

项目地址:

https://github.com/KFCFans/PowerJob

PowerJob 的设计目标为企业级的分布式任务调度平台,即成为公司内部的调度中间件。整个公司统一部署调度中心 powerjob-server,旗下所有业务线应用只需要依赖 'powerjob-worker' 即可接入获取任务调度与分布式计算能力。

因此,PowerJob 由调度服务器(powerjob-server)和执行器(powerjob-worker)两部分组成,powerjob-server 负责提供 Web 服务和完成任务的调度,powerjob-worker 则负责执行用户所编写的任务代码,同时提供分布式计算能力。

以下为在本地开发环境快速搭建并试用 PowerJob 的教程。

一、STEP1: 初始化项目

  1. git clone https://github.com/KFCFans/PowerJob.git

  2. 导入 IDE,源码结构如下,我们需要启动调度服务器(powerjob-server),同时在 samples 工程中编写自己的处理器代码

    470d05656e13ade8e3ec9541620c4803.png

二、STEP2: 启动调度服务器

  1. 创建数据库(不需要建表,只需要创建数据库)powerjob-daily

  2. 修改配置文件,配置文件的说明官方文档[2]写的非常详细,此处不再赘述。由于是在本地 IDE 搭建测试环境,因此我们选择使用开发环境的配置文件 application-daily.properties 来修改并使用。需要修改的地方为数据库配置:

  • spring.datasource.core.jdbc-url
  • spring.datasource.core.username
  • spring.datasource.core.password
  • 当然,有 mongoDB 的同学也可以修改 spring.data.mongodb.uri 以获取完全版体验。

完成配置文件的修改后,可以直接通过启动类 OhMyApplication 启动调度服务器,观察启动日志,查看是否启动成功~启动成功后,访问 http://127.0.0.1:7700/ ,如果能顺利出现 Web 界面,则说明调度服务器启动成功!

注册应用:点击主页应用注册按钮,填入 powerjob-agent-test 和控制台密码(用于进入控制台),注册示例应用(当然你也可以注册其他的 appName,只是别忘记在示例程序中同步修改~)

2509b9ff86002fab618859f554a8d46c.png

三、STEP3: 编写示例代码

进入示例工程(powerjob-worker-samples),修改配置文件连接 powerjob-server 并编写自己的处理器代码。

  1. 修改 powerjob-worker-samples 的启动配置类 OhMySchedulerConfig将  appName 修改为刚刚在控制台注册的名称

  2. 编写自己的处理器:在示例工程中新建一个类,继承你想要使用的处理器(各个处理器的介绍可见官方文档[2]),这里为了简单演示,选择使用单机处理器 BasicProcessor ,以下代码示例演示了在线日志功能的使用。

    @Slf4j@Componentpublic class StandaloneProcessorDemo implements BasicProcessor {    @Override    public ProcessResult process(TaskContext context) throws Exception {        OmsLogger omsLogger = context.getOmsLogger();        omsLogger.info("start process,context is {}.", context);        System.out.println("jobParams is " + context.getJobParams());                return new ProcessResult(true, "process successfully~");    }}
  3. 启动示例程序,即直接运行主类 SampleApplication,观察控制台输出信息,判断是否启动成功。

四、STEP4: 任务的配置与运行

调度服务器与示例工程都启动完毕后,再次前往 Web 页面( http://127.0.0.1:7700/ ),进行任务的配置与运行。

  1. 在首页输入框输入配置的应用名称,成功操作后会正式进入前端管理界面。
2ef84a3bf23b16687e00b00b8caa8e09.png
  1. 点击任务管理 -> 新建任务(右上角),开始创建任务。
816d4fe1f89300b099471c0ccbea26fb.png
  1. 完成任务创建后,即可在控制台看到刚才创建的任务,如果觉得等待调度太过于漫长,可以直接点击运行按钮,立即运行本任务。

    87c15a8d6491558f19773318e29b85ba.png
  2. 前往任务示例边栏,查看任务的运行状态和在线日志

    8d6d3cde480b62b1b545205f284dfb41.png

4.1 基本配置

  • 任务名称:名称
  • 任务描述:描述
  • 任务参数:任务处理时能够获取到的参数(即各个 Processor的process 方法入参 TaskContext 对象的 jobParams 属性)(进行一次处理器开发就能理解了)
  • 定时信息:该任务的触发方式,由下拉框和输入框组成
  • API -> 不需要填写任何参数,表明该任务由 OpenAPI 触发
  • CRON -> 填写 CRON 表达式(在线生成网站[3])
  • 固定频率 -> 填写整数,单位毫秒
  • 固定延迟 -> 填写整数,单位毫秒
  • 工作流 -> 不需要填写任何参数,表明该任务由工作流(workflow)触发

4.2 执行配置

由执行类型(单机、广播和 MapReduce)、处理器类型和处理器参数组成,后两项相互关联。

  • 内置 Java 处理器 -> 填写该处理器的全限定类名(eg,com.github.kfcfans.oms.processors.demo.MapReduceProcessorDemo)
  • Java(容器) -> 填写容器ID#处理器全限定类名(eg,18#com.github.kfcfans.oms.container.DemoProcessor)
  • SHELL -> 填写需要处理的脚本(直接复制文件内容)或脚本下载链接(http://xxx)
  • PYTHON -> 填写完整的 python 脚本或下载链接(http://xxx)

4.3 运行配置

  • 最大实例数:该任务同时执行的数量
  • 单机线程并发数:该实例执行过程中每个 Worker 使用的线程数量(MapReduce 任务生效,其余无论填什么,都只会使用必要的线程数...)
  • 运行时间限制:限定任务的最大运行时间,超时则视为失败,单位毫秒,0 代表不限制超时时间(不建议不限制超时时间)。

4.4 重试配置

  • Instance 重试次数:实例级别,失败了整个任务实例重试,会更换 TaskTracker(本次任务实例的Master节点),代价较大,大型 Map/MapReduce 慎用。
  • Task重试次数:Task 级别,每个子 Task 失败后单独重试,会更换 ProcessorTracker(本次任务实际执行的 Worker 节点),代价较小,推荐使用。
  • 注:请注意同时配置任务重试次数和子任务重试次数之后的重试放大,比如对于单机任务来说,假如任务重试次数和子任务重试次数都配置了 1 且都执行失败,实际执行次数会变成 4 次!推荐任务实例重试配置为 0,子任务重试次数根据实际情况配置。

4.5 机器配置

用来标明允许执行任务的机器状态,避开那些摇摇欲坠的机器,0 代表无任何限制。

  • 最低 CPU 核心数:填写浮点数,CPU 可用核心数小于该值的 Worker 将不会执行该任务。
  • 最低内存(GB):填写浮点数,可用内存小于该值的 Worker 将不会执行该任务。
  • 最低磁盘(GB):填写浮点数,可用磁盘空间小于该值的 Worker 将不会执行该任务。

4.6 集群配置

  • 执行机器地址:指定集群中的某几台机器执行任务(debug 的好帮手),多值英文逗号分割,如192.168.1.1:27777,192.168.1.2:27777
  • 最大执行机器数量:限定调动执行的机器数量

4.7 报警配置

选择任务执行失败后报警通知的对象,需要事先录入。

基础的教程到这里也就结束了~更多功能示例可见官方文档[2],工作流、MapReduce、容器等高级特性等你来探索!

五、总结与预告

本章详细介绍了 PowerJob 的快速入门,根据本文能够快速搭建起本地开发/测试环境。下一章节,我将会对 PowerJob 整体的架构做一个介绍,为后面的技术剖析做准备。

那我们下期再见喽~

作者游记

c779ab66dd6404daced4d1455a33a87f.png

“常在河边走,哪有不湿鞋”,然而,这句话在茶卡盐湖却属于奢望。

稍有不慎,隐秘的盐窟便对你敞开怀抱,瞬间将你吞噬~

盐湖如此,人生亦是如此。

难免不幸时,也要对着美好的明天微笑~

参考资料

[1]

《讲解开源项目》: https://github.com/HelloGitHub-Team/Article

[2]

官方文档: https://www.yuque.com/powerjob/guidence

[3]

在线生成网站: https://cron.qqe2.com/

3efad4d04c5f401db23746b046f0d589.png

关注公众号加入交流群(作者在 Java 群)

『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎联系我(微信:xueweihan,备注:讲解)加入我们,让更多人爱上开源、贡献开源~

获取更多信息、“在看”让本文被更多人看到、“赞赏”支持我们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/15028.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

kali linux samba,Kali Linux 渗透测试:SMB、SMTP扫描工具(14)

一、SMB扫描工具SMB(Server Message Block)协议,服务消息块协议。最开始是用于微软的一种消息传输协议,因为颇受欢迎,现在已经成为跨平台的一种消息传输协议。同时也是微软历史上出现安全问题最多的协议。它的实现复杂,并且默认在…

.net new一个类为什么报空指针_谈谈.NET对象生命周期

不用程序员操心的堆 — 托管堆程序在计算机上跑着,就难免会占用内存资源来存储在程序运行过程中的数据,我们按照内存资源的存取方式将内存划分为堆内存和栈内存。栈内存通常使用的场景是:对存取速度要求较高且数据量不大。典型的栈内存使用的…

kvm上添加万兆网卡_部署kvm(二)

6.管理KVM虚拟机virsh list//查看 正在运行virsh list --all//查看所有id 名称 状态centos7.3 runningvirsh start 名字 //启动virsh shutdown 名字 //关机virsh destroy 名字 //强制关机virsh autostart 名字 //自动启动virsh suspend 名字 //挂起virsh resume 名字 //恢复vir…

python包 wget_Python数据科学“冷门”库

原标题 | Lesser Known Python Libraries for Data Science作者 | Parul Pandey译者 | CONFIDANT(福建师范大学)、Seabiscuit、唐里、david95(研发工程师)Python是一门神奇的语言。事实上,它是世界上发展最快的编程语言…

第十二周 11.15-11.21

11.15 补个BC。 HDU 5565 Clarke and baton 没太懂题解怎么搞。反正挺暴力过了。 1 #include <iostream>2 #include <cstdio>3 #include <map>4 #include <vector>5 #include <algorithm>6 using namespace std;7 typedef long long LL;8 const …

android 设置setmultichoiceitems设置初始化勾选_阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?...

集合是Java开发日常开发中经常会使用到的&#xff0c;而作为一种典型的K-V结构的数据结构&#xff0c;HashMap对于Java开发者一定不陌生。关于HashMap&#xff0c;很多人都对他有一些基本的了解&#xff0c;比如他和hashtable之间的区别、他和concurrentHashMap之间的区别等。这…

w ndows连接USB不正常,Raspberry Pi Zero W 连接电脑 – 针对Windows 10 缺少RNDIS驱动

在网上有很多关于Raspberry Pi Zero连接电脑的帖子&#xff0c;但是发现在windows 10 系统上发现没有发现RNDIS 驱动&#xff0c;这个驱动在其他系统上会自动安装&#xff0c;但是在windows 10 上显示的是一个串口&#xff0c;并不是RNDIS 设备&#xff0c;RNDIS是一个通过USB的…

android 封装的popwindow,Android UI开发 popupwindow介绍以及代码实例

PopupWindow在android.widget包下&#xff0c;弹出窗口的形式展示。官方文档对该控件的描述是&#xff1a;“一个弹出窗口控件&#xff0c;可以用来显示任意视图(View)&#xff0c;而且会浮动在当前 活动(activity)的顶部”。PopupWindow可以让我们实现多种自定义控件&#xff…