一个工作流编排,任务调度引擎
GtiHub地址:https://github.com/xuda783380930/job-dispatcher.git
基本模型:
基于事件或者定时生成一个job,每个job由若干个task组成,task之间存在串行或并行的依赖关系
task的具体实现引由客户端(用户自己编程实现),调度引擎只负责按照拓扑顺序发出HTTP信号触发任务
由客户端发出HTTP通知引擎任务任务的完成状态,调度引擎据此继续发出后续调度信号
使用场景:
任务编排,事件驱动或时间驱动的任务调度,如企业级ETL调度等
特点:
调度引擎只做调度和任务编排,不参与具体任务实现和执行,可看作一个HTTP信号发射和接收器,具有极大的适用性,天生支持异构系统,引擎端和任务实现端彻底的解耦。
job-dispatcher是微服务中的一个独立组件,而非作业平台,因此它并不去实现各类任务的运行环境的适配工作,任何实现了配置中子任务HTTP启动接口的程序都可以作为job-dispatche的客户端,无论是何种语言何种数据库的程序。
相似项目: Linkedin公司推出的Azkaban , 国产软件TASKCTL, 欢迎大家对比提出意见
软件架构说明
1.时间调度引擎:基于Quartz,按时触发对应的Job
2.Job引擎:可注册JobBuilder(包含子任务的依赖关系),Job引擎收到触发信号后,根据builder生成JobBox实例(包含批次时间和任务执行状态) 按照时间顺序JobBox被Put到队列中,队首的JobBox会被消费,即按照拓扑关系依次发出信号,直到所有子任务执行完毕,继续执行下一个 JobBox。
3.使用的框架:JDK1.8,SpringBoot2.0,Quartz,JPA,Echarts,Amazeui,Swagger2
1.修改对应的jdbc数据源配置和pom里面的jdbc驱动依赖
2.基于Springboot,用maven打包成Jar后启动即可
JDK1.8环境,通过默认端口浏览器访问就可以看到主页
通过quartz/registerjob接口,传入Json格式的Job配置文件注册任务即可,具体如下
1.任务端向引擎注册一个定时Job http://ip:port/quartz/register?json={}
//通过下列的json配置样例
{
"jobBoxBuilder": {
"jobCode": "job1", "monitorParas":{mobileNos:[ "18621711111","18616152222"]} //短信收信人 "taskBuilderMap": [ //Job内的task组成列表 { "taskCode": "task1", "adapterPara": "http://172.11.33.44/trigger?jobCode=jos1&taskCode=task1", "upstreamTaskCodes": ["task2"], //依赖task2,task2完成后task1才可执行 "overTime":"60" //超时时间60分钟则报警 }, { "taskCode": "task2", "adapterPara": "http://172.11.33.44/trigger? jobCode=jos2&taskCode=task2" //"upstreamTaskCodes":[] //不依赖任何任务可以不填该字段 //"overTime":"60" //可不填 } ]
},
"jobCronExpression": "0 0/1 11 * * ?", //每天11点每隔一分钟执行一次
"filterCalendarName": "nonTradingDays" //过滤nonTradingDays日历组
}
2.任务端向引擎通知任务执行情况
UNSTART("未开始", 0),TRIGGERED("正在触发", 1),STARTED("正在执行", 2),NEED_RESTART("需重新执行", 3), PAUSED("已暂停", 4),FINISHED("已完毕", 5);
http://ip:port/task/call?jobcode=job1&taskcode=task2&status=0
3.查看job的等待队列的情况,查看正在执行的job的情况(通过前端页面关系图查看)
欢迎加入QQ讨论群:558192118 GtiHub地址:github.com/xuda7833809… GitEE地址:gitee.com/daye_daye/j… 基本模型: 基于事件或者定时生成一个job,每个job由若干个task组成,task之间存在串行或并行的依赖关系 task的具体实现引由客户端(用户自己编程实现),调度引擎只负责按照拓扑顺序发出HTTP信号触发任务 由客户端发出HT
模式 在yarn-session模式下,共享一个dispatcher org.apache.flink.runtime.dispatcher.Dispatcher 这个类,这里接收到客户端传上来的作业图 代码分析 //这里就是分发器接收到作业图 @Override public CompletableFuture<Acknowledge> submitJob(JobGraph jobGrap
mysql突然进不去了,不知道什魔鬼 [root@localhost ~]# systemctl start mysqld.service Job for mysqld.service failed because the control process exited with error code. See "sys t
点击这里查看 Flink 1.13 源码解析 目录汇总 点击查看相关章节:Flink 1.13 源码解析——JobManager启动流程概览 点击查看相关章节:Flink 1.13 源码解析——JobManager启动流程 WebMonitorEndpoint启动 点击查看相关章节:Flink 1.13 源码解析——JobManager启动流程之ResourceManager启动 目录 一、前言
Failed to start LSB: Bring up/down networking 问题 1、执行 service network restart 出现以下错误 Restarting network (via systemctl): Job for network.service failed. See 'systemctl status network.service' and '
springboot:通过http动态操作xxl-job任务 一、maven依赖 <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.8.1</version>
简介 在过去,开发者必须在服务器上为每个任务生成单独的 Cron 项目。而令人头疼的是任务调度不受源代码控制,而且必须通过 SSH 连接到服务器上来增加 Cron 项目。 Laravel 的命令调度程序允许你在 Laravel 中对命令调度进行清晰流畅的定义。并且在使用调度程序时,只需要在服务器上增加一条 Cron 项目即可。调度是在 app/Console/Kernel.php 文件的 sche
基本任务调度 方案1: 通过 @Cron 注解,这个需要依赖 cron4j 框架: //1分钟执行一次 @Cron("*/1 * * * *") public class MyTask implements Runnable { @Override public void run() { System.out.println("task running...");
我有一些任务的持续时间是已知的整数长度。任务之间也有依赖关系。我也有任意数量的员工可以安排这些任务。 我想为他们找到一个最佳的时间表,首先我要最小化所有任务执行的总长度,其次我想在一个之前运行过大多数依赖项的工作人员身上安排任务,第三我想最小化所需的工作人员数量。 因此,如果任务具有依赖项A、B和C,并且worker1运行A和B,worker2运行C,那么我更希望将新任务添加到worker1。 我
我在Openshift集群上安装了一个Spring Cloud数据流。我尝试注册一个应用程序,然后创建一个任务,一切都很好,但当我试图安排任务时,我遇到了以下异常: 我不知道这是什么意思,我是Dataflow的新手。我不明白为什么他试图使用Maven而不是kubernetes部署器,也不明白为什么我会出现这个错误。有人能再给我解释一下吗? 顺便说一句,我将这些应用程序注册为docker容器。
我正在研究一个需要工作流/流程引擎的解决方案。我的工作流包含一些基于Java的进程(类)和一些Linux Shell脚本。流程不会是静态的,每个流程的执行取决于前一个流程的状态/结果,将有多条路径,路径将由前一个流程的状态确定。 我尝试查看jBPM,但没有找到合适的支持来调用shell脚本。请根据我的要求为我推荐一个合适的替代方案。 非常感谢。
我使用的是Activti版本6.0.0。 我想同步执行活动中的任务,但我有一个长时间运行的任务,可能需要20分钟来执行。我想在我的控制器中快速获得过程实例ID,而不考虑在bpmn中完成任务,所以我在bpmn文件中添加了一个中间计时器事件“0分钟”。 我已经开始执行一个进程,比如说processInstanceid p1。当时只有我再次启动这个进程,比如说使用processInstanceid p2