工作流引擎可以直接對接程式設計師的思維模式

anycmd發表於2017-12-22
[img index=1]

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就可以了,比如牛頓愛因斯坦伽利略秦始皇都已經消掉了,現在還活著的人還沒消掉。

相關文章