工作流引擎可以直接对接程序员的思维模式


anycmd开源权限引擎准备再次创新,将用不绕弯的方式实现个开源工作流引擎,目的是以直接的方式对接程序员的思维方式,信仰这种思维模式是未来的基本技能,未来的人们应具备基本的程序思维。最终出来后会是一个可视化的编程工具,支持n维视图。这个工作流引擎首先会应用在权限引擎上解决数据级权限问题。

workitemSet是什么
所谓workitemSet节点:一个workitem描述的是一件事情,这件事情要么是obj.Property1=value1(读写字段),要么是SystemRoot.WfEngine.CallProcess(context)(调用方法),和程序员书写的“读写对象的字段、调用对象的方法”是一样一样的,只不过workitem是数据记录形式的(对于CLR、JVM来说读写字段调用方法也是记录)。

概念

所有元素都和编程语言有严格对应,但不需要对应编程语言全部的东西,只对应运行时相关的:变量声明和读写、分支、过程调用、传参、栈、闭包等基本结构,给出设计器,业务逻辑通过组合这些基础设施实现。

它是内存中的工作流引擎

流程执行上下文可以被持久化、流程可以被阻塞、唤醒等,但起初只需支持在内存中运行不考虑持久化。 流程执行时会对遇到的东西求值,当值来源是外部输入时或者值来源是自动但从运行时上下文中求不得值时流程就被阻塞了,这个被阻塞的节点其实就是工作流语言中的需要外部系统参与的(人是一种外部系统)“Task”,整个过程和控制台的运行逻辑没有区别。

问题:到时候是直接在流程设计器上搞?需要自己结合业务写对应的扭转代码不呢?
需要开发人员写被流程引擎操作的业务对象,这些业务对象通常只需要有GetValue、SetValue方法就能实现所有需求,如果想搞高级些的话:程序员开发的业务对象上可以有CallProcess(calleeProcessId)方法,这个流程体(把流程设计器中看到的东西称作流程体)中可以默认得到CallProcess方法所依附的业务对象(如果你会类比,这说的正是面向对象方法论中的“方法”、“函数”、“对象”、“消息”)。
它应该具有实现复杂业务的能力,但是最佳的使用场景是用它来编排其它组件。流程引擎弄出来后先用在权限引擎上,目前有了个初级的能可靠运行的东西了。

anycmd工作流引擎直接对接程序员的思维模式

我在zhihu上看到有人描述这样一个问题:activiti工作流引擎中,如何设置全局变量?在设计过程中,我想把一个用户任务定义成多实例,举个例子,审批请假,需要多个经理审核。但是审核完毕之后,我不知道应该怎么通过网关。我设想是 定义一个变量例如 i ,当一个经理选同意时,i++ ,最后用一个网关进行判断,是否审核通过。现在我不知道在哪定义,用什么格式。希望大神指点。我使用的是activiti5.22引擎。
anycmd的工作流引擎就是用来直接对接上面这种程序员思维的。

首先应用在权限引擎上
这个工作流引擎首先用在权限引擎上,基于它实现数据级权限的控制:
public result Permit(subject, action, object){
....// 功能级鉴权
....if(有功能级权限){
........if(systemRoot.WfEngine.Permit(subject, action, object)){
............return 有权;
........}
....}
....return 无权;
}
权限引擎的用户无需学习javascript、xacml等这种语言了,会画工作流程图就行了。
没有了AndSplit如何表达并行?

只要路通(命题为真)就往前走,如果路不通就走不了,没有别的规则和概念;对流程引擎来说不存在并行串行这样的概念,并行串行都是流程引擎的用户定义出的运行景象;

简单描述一下上图的运行时景象,并行已经蕴含其中了。
首先有两个层级的并行:流程实例集内部的并行 和 流程实例内部的并行;
需要指出的是“流程实例集内部的并行 和 流程实例内部的并行”在高一层抽象来说是没有任何区别的只不过是一个是从流程定义的开始节点开始运行的线程一个是从流程定义中间的某个节点开始运行的线程;
1,每一个流程实例都是在独立的线程中运行的(不要纠结细节,线程的生命周期可以比流程实例长,可以有线程池,但是在概念层次不考虑这些,概念层次重要的是理清楚概念);
2,每一个定义时流程在运行时不一定只有一个实例(这是流程实例集内部的并行);
3,每一个运行时的流程实例(本神)不一定只有本神这一个分神(本神可以看作是自己的一个分神)
4,可以认为分神指的是线程,一个分神对应一个线程;
5,同一个运行时流程实例(本神)可以同时分出多个分神,分神和本神的不同是:本神是从开始节点按照流程定义开始运行的,而分神是从中间的某个节点按照流程定义开始运行的;
6,本神什么时候会分神?如果当前节点有两条出口路径(路径就是命题)且这两条路径都是通路的(命题为真)就会分神;如果当前节点只有一个通的出口路径的话就不需要分神;
7,本神也是分神,本神分神没有本质区别,所有的神都是沿着流程定义的路径行走,行走的逻辑非常简单只有3个简单规则:1 只有路通时才往前走,2 只要路通就往前走(如果有两条路通就分神往前走,此为流程实例内部的并行),3 如果路不通就结束;

WorkitemSet这个命名和其它命名不和谐,需要改名成
搬动物件(或者叫“变形空间”)因为流程节点中的WorkitemSet集合表达的事情归根结底就是“分神搬起某个东西,带着这个东西行走到别处,然后放下这个东西;这个“东西”是什么?归根结底是01物理开关,是一串线性空间”,所以计算机中任何运行时景象都是:分神在空间中行走,分神变换空间,分神判断空间的状态(对命题进行求值),被自己变换的空间影响自己后续行走的路径(神不只一个,在同一个空间中行走着的有好多神,这些神可能会试图搬动同一个物件,但原则是一个物件只能被一个神变换),分神在前面步骤变换的空间(可能是自己变换的也可能是别的神变换的)影响自己后面行走的路径此为因果时序,分神也有空间,分神的“行走”也是变换空间,“空间的变换”就是时间;
如果你要说量子随机,随你,反正我不信那一套。因果时序是必定的,随机只是上层观察的现象而已,基于前面的运行时景象可以精确的描述出如何随机,以后描述。

把空间定义为:一簇波,这簇波中的每一条波都相对于其它每一条波具有相对稳定的频差(这个差可以是0也可以是任何数字,只要对于观察者来说这个差不是随机的无法预测的就行),只要两条波的波频差不是随机的而是能够被观察者感受到不变的话那么这两条波中就存在了观察者可以在其中穿行的空间(因为不变的存在,所以观察者可以超越时间预测过去和未来的状态,这种对未来或过去的可预测可能性就是空间,空间是由因发出不经过时间就可以映射到果的存在,这种存在是一种可能性,宏观上是100%的可能性,微观上没能达到100%),空间是不变,只有存在不变才存在空间,只有存在空间才能在其中行走,而观察者自己也是空间,观察者在不变的空间中的行走又是变。

把时间定义为:观察者(观察者是空间,具有一定程度的不变性)作为一级系统空间在二级系统空间中行走,这个行走就是时间。

比如把系统中的User当做是观察者,这个观察者的Id、Name、Gender等字段组合出来的那个体,这个体中的各部分之间就具有稳定的相对位置或者叫频差吧。但是这个体又不是永远不变的,比如它进出系统一次这个体上的计数字段会加1导致这个体的LoginCount位置的01物理开关变换了状态,这就是变;但是这个LoginCount字段的类型是int型的它的空间尺寸一定是int.MaxValue,它一定是只有32个物理开关那么大小,这个32又是不变;因为其中存在不同系统层次的不变所以系统才能行走,才能运行起来,而运行起来又是变。

因为不变的存在,所以观察者可以超越时间预测过去和未来的状态,这种对未来或过去的可预测可能性就是空间,空间是由因发出不经过时间就可以映射到果的存在,这种存在是一种可能性,宏观上是100%的可能性,微观上没能达到100%
就是因为这个没能100%导致了我们在微观上观察到的随机,这个随机一定是可以消掉的,消掉的办法很简单,就是把观察者未归0就可以了,比如牛顿爱因斯坦伽利略秦始皇都已经消掉了,现在还活着的人还没消掉。