elsa工作流-调度(安排后台作业)
前言
elsa内部很多地方都会用到后台作业,也就是在后台线程中执行一堆任务,这与我们通常理解的后台作业没有区别。
elsa将后台作业也称为调度Schedul,相关功能由Elsa.Scheduling模块提供。
典型的应用是触发器调度和书签调度时会用到后台作业,但后台作业也可以用在其它地方,比如自定义的Actiity,若其内部也需要执行后台任务,可以直接用elsa提供的后台作业接口。
后台作业可以安排在一个Task中,也可以委派给Hangfire、Quartz.net这种三方后台作业框架。
架构图
下面深入浅出说明各个组件。
要在后台执行的具体任务ITask
它表示一个需要在后台执行的具体逻辑,默认情况下有如下3个实现:
- DelegateTask 代表一个普通的委托
- ResumeWorkflowTask 代表让某个工作流实例恢复继续执行
- RunWorkflowTask 执行一个指定类型的工作流,它会产生一个新的工作流实例
已调度的任务IScheduledTask
表示一个已经开始执行调度的任务,在实例化它的某个实现类时,要指定需要执行的ITask,它内部开启线程,根据具体实现类的规则执行,
比如:
ScheduledRecurringTask是IScheduledTask,它的构造函数需要指定ITask,间隔时间等,构造函数种会开启线程,安装固定周期时间自动执行ITask的逻辑。
它还有两个默认实现,ScheduledCronTask表示基于cron表达式的方式执行,ScheduledSpecificInstantTask开启线程,等到指定时间点时自动执行。
ISchedule(IScheduledTask的抽象工厂)
它是用来创建IScheduledTask的,针对IScheduledTask不同实现,都配有一个对应的工厂类,这些工厂类都实现ISchedule,内部实现就返回对应类型的IScheduledTask。
- CronSchedule:创建基于cron表达式的任务ScheduledCronTask的工厂类
- RecurringSchedule:创建周期性任务ScheduledRecurringTask的工厂类
- SpecificInstantSchedule:创建指定时间点执行 任务ScheduledSpecificInstantTask的工厂类
IScheduler调度器(IScheduledTask任务容器)
创建出来的任务应该被管理,以便根据需要注销任务,可以把它看成任务IScheduledTask容器,默认实现是LocalScheduler,它创建任务后将任务存储在内存字典中,任务名称必须是全局唯一的,作为key,IScheduledTask实例作为值。
值得注意的是,它并不直接用依赖注入注入IScheduleI,因为ISchedule是抽象工厂,所以它是创建任务时,由调用方传入具体的ITask实现和对应的工厂具体类,比如要创建一个周期的任务,应该在调用方new一个具体ITask实现类,和一个具体的IScheduleI实现类,然后调用IScheduler的ScheduleAsync方法,这样内部的LocalScheduler就会安排好任务,并引用此任务。
后续根据需要,你可以调用IScheduler的ClearScheduleAsync方法来移除指定任务
本地任务调度小节
前面部分讲的基本上都是本地进程内调度,elsa引擎会使用它,你对elsa进行扩展也可以使用它,比如你自定义的Activity内部需要做任务调度时,可以注入IScheduler进行使用。下面部分是说专门针对工作流的调度器,它的默认实现会使用本地任务调度器。
IWorkflowScheduler工作流调度器
所谓的工作流调度器是指,在后台任务中,安排某个工作流在啥时候执行,有两个方面,
- 一个是可以恢复某个工作流实例执行,这个流程实例是之前执行卡住的,比如等待某个人审核,若超过3天没审核则自动继续执行。
- 另一个方面是指,是等待到指定时间点后执行?还是周期性的每隔多长时间自动执行?还是指定一个cron表达式,按此规则自动执行?
都是在后台安排工作流执行,可以用现有的三方框架来实现,比如:hangfire、quartz,本篇执行讲elsa调度的执行原理,所以这两种实现不做分析,另外elsa也定义了默认实现DefaultWorkflowScheduler。它内部使用前面说的本地任务框架来安排任务。
这里以其中的,按指定时间点执行新流程和恢复之前的流程实例为例:
public class DefaultWorkflowScheduler(IScheduler scheduler) : IWorkflowScheduler
{
/// 执行一个全新流程
public async ValueTask ScheduleAtAsync(string taskName, ScheduleNewWorkflowInstanceRequest request, DateTimeOffset at, CancellationToken cancellationToken = default)
{
await scheduler.ScheduleAsync(taskName, new RunWorkflowTask(request), new SpecificInstantSchedule(at), cancellationToken);
}
///恢复之前的流程实例继续执行
public async ValueTask ScheduleAtAsync(string taskName, ScheduleExistingWorkflowInstanceRequest request, DateTimeOffset at, CancellationToken cancellationToken = default)
{
var task = new ResumeWorkflowTask(request);
var schedule = new SpecificInstantSchedule(at);
await scheduler.ScheduleAsync(taskName, task, schedule, cancellationToken);
}
可以看到,它首先创建ITask的实例,表示将来要执行的具体逻辑,上面代码中的RunWorkflowTask表示执行一个全新流程的任务,ResumeWorkflowTask表示恢复以前的指定流程实例执行。
然后创建一个具体的ISchedule的工厂类,在指定时间点执行任务的工厂类就是SpecificInstantSchedule。
最后调用调度器(也是任务容器)scheduler进行任务安排。
剩下的两组方法分别是按周期性执行和根据cron方式安排流程执行,其原理类似。
IBookmarkScheduler和ITriggerScheduler
针对周期性、cron表达式和指定时间点这几种情况,都有对应的触发器类型,针对这几种触发器内部会使用IWorkflowScheduler,进行流程任务安排,具体说明将在书签和触发器的专门章节说明。
总结
elsa中,后台安排任务有:周期性、cron表达式和指定时间点三种时间方式,安排的任务有两种类型,一种是恢复之前的指定流程实例恢复执行,另一种是安排某个类型的流程全新执行(产生新的流程实例)
流程安排是通过IWorkflowScheduler实现的,它有默认实现(基于进程内的本地任务调度器)、基于hangfire的实现和基于Quartz的实现。
默认流程调度器DefaultWorkflowScheduler使用基于进程内的本地任务调度器实现,这个调度器也可以用于我们自定义的Activity或其它代码,并不是仅用于流程任务安排。
elsa工作流-调度(安排后台作业)的更多相关文章
- 工作流调度引擎---Oozie
Oozie使用教程 一. Oozie简介 Apache Oozie是用于Hadoop平台的一种工作流调度引擎. 作用 - 统一调度hadoop系统中常见的mr任务启动hdfs操作.shell调度. ...
- 工作流调度器azkaban(以及各种工作流调度器比对)
1:工作流调度系统的作用: (1):一个完整的数据分析系统通常都是由大量任务单元组成:比如,shell脚本程序,java程序,mapreduce程序.hive脚本等:(2):各任务单元之间存在时间先后 ...
- Azkaban工作流调度器
Azkaban工作流调度器 在Hadoop领域常用的工作流调度系统 Oozie,Azkaban,Cascading,Hamake等等. 性能对比: 安装: 创建ssl配置 keytool -keyst ...
- azkaban工作流调度器及相关工具对比
本文转载自:工作流调度器azkaban,主要用于架构选型,安装请参考:Azkaban安装与简介,azkaban的简单使用 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成: ...
- 工作流调度器azkaban
为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 各任务单元之间存在时间先后及前后依赖关系 为了很 ...
- 工作流调度器azkaban2.5.0的安装和使用
为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 各任务单元之间存在时间先后及前后依赖关系 为了很 ...
- Azkaban 工作流调度器
Azkaban 工作流调度器 1 概述 1.1 为什么需要工作流调度系统 a)一个完整的数据分析系统通常都是由大量任务单元组成,shell脚本程序,java程序,mapreduce程序.hive脚本等 ...
- 工作流调度系统Azkaban的简介和使用
1 概述 1.1 为什么需要工作流调度系统 l 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 l 各任务单元之间存在时间 ...
- 工作流调度器之Azkaban
Azkaban 1. 工作流调度器概述 1.1. 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序.hive脚本等 ...
- hadoop工作流调度系统
常见工作流调度系统 Oozie, Azkaban, Cascading, Hamake 各种调度工具特性对比 特性 Hamake Oozie Azkaban Cascading 工作流描述语言 XML ...
随机推荐
- JS 本地存储 localStorage 操作总结
现在前端做数据存储,跨页面传值,localStorage是一个很好的方式,以键值对的方式存储,也方便取值赋值,下面说一说使用方法和一些常见的使用技巧. 1.存值共有3种方式,localStorage相 ...
- 如果让你处理hbase 怎么保证数据的安全性可靠性 不需要具体的设置 要一套方案
有关数据安全及可靠我们认为大体上分为存储安全和使用安全 1 数据存储安全 hbase是基于hdfs的一种数据存储解决方案,所以有关数据的安全性可靠性可以利用hdfs自身的副本机制保障.另外原生的hba ...
- 2个月搞定计算机二级C语言——真题(7)解析
1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题7 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> int fun(char* s, ...
- 对背包dp的再探究:以 采药 和 疯狂的采药 为例
题目链接: 01背包:采药 完全背包:疯狂的采药 关于 "总体积刚好是 V " 和 "总体积 \(\le\) V " 正常的背包推导的都是 "总体积刚 ...
- mysql skip-name-resolve 的解释
PHP交流群 717902309 为PHP广大爱好者提供技术交流,有问必答,相互学习相互进步! mysql连接很慢,登陆到服务器上查看mysql日志:IP address 'XX.XX.XX.XX' ...
- 终于搞全了:GPIO/ADC/LED/I2C/SPI/USB…
合宙低功耗4G模组经典型号Air780E,支持两种软件开发方式: 一种是传统的AT指令:一种是基于模组做Open开发. 传统AT指令的开发方式,合宙模组与行业内其它模组品牌在软件上区别不大,在硬件功耗 ...
- Python 在PDF中绘制线条、矩形、椭圆形
在PDF中绘制图形可以增强文档的视觉效果.通过添加不同类型的形状,如实线.虚线.矩形.圆形等,可以使文档更加生动有趣,提高读者的阅读兴趣.这对于制作报告.演示文稿或是教材特别有用.本文将通过以下几个示 ...
- Django之model外键
外键和表关系 外键: 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因 ...
- Linux系统之Ubuntu
常用命令: #查看安装包 dpkg -l 1)切换镜像源 本身的镜像都是国外的,下载依赖包太慢, 需要替换成国内镜像地址 国内镜像源推荐阿里 OPSX 源: https://opsx.alibaba. ...
- 编写kickstart脚本,执行时遇到的问题
KickStart脚本 #!/bin/bash #declare var yum_ins="yum -y install" sys_res="systemctl rest ...