欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)及其方法

文檔序號(hào):6335291閱讀:509來源:國知局
專利名稱:實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)及其方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)軟件領(lǐng)域,特別涉及支持以圖形為基礎(chǔ)的流程運(yùn)行的基礎(chǔ)設(shè)施 技術(shù)領(lǐng)域,具體是指一種實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)及其方法。
背景技術(shù)
隨著現(xiàn)代社會(huì)科學(xué)技術(shù)的發(fā)展,計(jì)算機(jī)軟件得到了越來越廣泛的應(yīng)用。早期的計(jì) 算機(jī)軟件中的計(jì)算流程全部是使用代碼編寫的,相對(duì)而言,代碼比較晦澀難懂,不便于維護(hù) 和業(yè)務(wù)重構(gòu),運(yùn)營成本很高。隨著計(jì)算機(jī)硬件的計(jì)算速度的快速提高以及計(jì)算機(jī)軟件業(yè)的 飛速發(fā)展,可視化的流程在計(jì)算流程中發(fā)揮著越來越重要的作用,替代了一部分以前通過 代碼才能實(shí)現(xiàn)的業(yè)務(wù)流轉(zhuǎn)機(jī)制,流程可以大致分為以下幾類(1)工作流(WorkfloW)工作流是最早得到廣泛應(yīng)用的流程形式,目前在OA領(lǐng)域以及應(yīng)用內(nèi)的流程控制 中在繼續(xù)發(fā)揮著主導(dǎo)作用。工作流管理聯(lián)盟(WfMC)組織定義了完整的工作流體系結(jié)構(gòu),人 們通過流程定義工具以圖形化方式定義流程;通過流程引擎運(yùn)轉(zhuǎn)來推進(jìn)和協(xié)調(diào)企業(yè)不同崗 位的工作,并可以和企業(yè)的自動(dòng)業(yè)務(wù)邏輯進(jìn)行交互。(2)業(yè)務(wù)流程管理(BPM)在業(yè)務(wù)流程重組(BPR)過程中,人們借助BPM工具來搭建企業(yè)流程。與傳統(tǒng)工作 流相比,BPM具備更多面向業(yè)務(wù)方面的能力,同時(shí)也具備更多的應(yīng)用集成能力。BPM側(cè)重點(diǎn) 不在進(jìn)行應(yīng)用內(nèi)的人工工作協(xié)調(diào),它強(qiáng)調(diào)系統(tǒng)之間的交互,強(qiáng)調(diào)流程管理帶來的投資回報(bào) (ROI)。BPM 相關(guān)協(xié)議包含 BPMN、XPDL, BPEL, WSFL 等。(3)頁面流(PageFlow)目前基于B/S結(jié)構(gòu)的企業(yè)應(yīng)用大部分采用MVC的方式來開發(fā),頁面流是作為控制 層經(jīng)常被采用的實(shí)現(xiàn)方式之一。頁面流中的活動(dòng)包括頁面和自動(dòng)業(yè)務(wù)邏輯,頁面流控制機(jī) 制協(xié)調(diào)用戶在應(yīng)用中多個(gè)頁面的切換。(4)業(yè)務(wù)流、規(guī)則流等業(yè)務(wù)流以及規(guī)則流是對(duì)一次計(jì)算的流程化展示。業(yè)務(wù)流把執(zhí)行中的多個(gè)活動(dòng)按照 一定的順序串聯(lián)起來,產(chǎn)生特定的業(yè)務(wù)操作結(jié)果;規(guī)則流通過比較一系列的規(guī)則變量,得到 一個(gè)判定結(jié)果。目前,已經(jīng)有不少流程產(chǎn)品可以用來支撐各種類別流程的建模和執(zhí)行,給業(yè)務(wù)用 戶和技術(shù)開發(fā)用戶提供了不少便利。但總體而言,流程應(yīng)用的規(guī)模還不大,流程在企業(yè)活動(dòng) 中還有很大的發(fā)展空間。流程引擎是流程應(yīng)用的核心功能,但是成功的流程引擎本身的研發(fā)一直是復(fù)雜 的、高難度的。這是因?yàn)榱鞒桃姹旧淼难邪l(fā)涉及串行、選擇、歸并、循環(huán)等多種復(fù)雜的流程 模式的實(shí)現(xiàn),還涉及各種類型流程環(huán)節(jié)相關(guān)的復(fù)雜的規(guī)則和算法,并且還要應(yīng)對(duì)流程引擎 作為系統(tǒng)的核心調(diào)度機(jī)制所必須具備的高可靠性要求。流程引擎研發(fā)中實(shí)際困難具體體 現(xiàn)
(1)由于流程引擎的各種調(diào)度機(jī)制之間高度耦合,所以往往是只有少量能力強(qiáng)的 工程師復(fù)可參與,難以實(shí)現(xiàn)多開發(fā)人員并行工作,開發(fā)周期長。(2)流程引擎的功能修改困難,功能的擴(kuò)展往往需要修改已有的功能,往往一點(diǎn)點(diǎn) 修改或者擴(kuò)展就造成全局性的影響。(3)由于邏輯復(fù)雜,源程序代碼難以閱讀和理解,代碼移交困難??傊?,目前業(yè)界對(duì)于流程引擎的研發(fā)存在較大瓶頸,需要有一種更好機(jī)制來避免 流程引擎研發(fā)的問題,提高研發(fā)效率。

發(fā)明內(nèi)容
本發(fā)明的目的是克服了上述現(xiàn)有技術(shù)中的缺點(diǎn),提供一種能夠有效提高流程產(chǎn)品 的松耦合能力和可擴(kuò)展能力、提高開發(fā)效率、增強(qiáng)系統(tǒng)穩(wěn)定可靠性、適用范圍較為廣泛的實(shí) 現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)及其方法。為了實(shí)現(xiàn)上述的目的,本發(fā)明的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)及 其方法如下該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng),其主要特點(diǎn)是,所述的系統(tǒng)包 括外觀控制器,負(fù)責(zé)圖形執(zhí)行虛擬機(jī)的啟動(dòng)、加載和停止,并接收外部請(qǐng)求的響應(yīng), 調(diào)用其他部件處理請(qǐng)求;上下文容器,維護(hù)節(jié)點(diǎn)行為處理過程中可以訪問的上下文,確保用戶獲取到當(dāng)前 的執(zhí)行單元、以及當(dāng)前的執(zhí)行隊(duì)列;節(jié)點(diǎn)行為注冊(cè)器,維護(hù)一個(gè)不同類型節(jié)點(diǎn)行為的注冊(cè)表;核心調(diào)度器,分別與所述的外觀控制器和上下文容器相連接,對(duì)所述的外觀控制 器傳遞過來的每一個(gè)請(qǐng)求分配一個(gè)線程進(jìn)行調(diào)度;單元調(diào)度器,分別與所述的上下文容器、節(jié)點(diǎn)行為注冊(cè)器、核心調(diào)度器相連接,接 收所述的核心調(diào)度器的請(qǐng)求,進(jìn)行一次執(zhí)行。其中每一次執(zhí)行,先從所述的節(jié)點(diǎn)行為注冊(cè)器 中獲取對(duì)應(yīng)的節(jié)點(diǎn)的行為實(shí)現(xiàn)類,再從所述的上下文容器中獲取對(duì)應(yīng)的上下文,并傳入上 下文調(diào)用節(jié)點(diǎn)行為的對(duì)應(yīng)方法。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)中的核心調(diào)度器包括核心調(diào)度線程池,用于容納該核心調(diào)度器所分配的線程;執(zhí)行隊(duì)列處理器,分別與所述的核心調(diào)度線程池和單元調(diào)度器相連接,對(duì)應(yīng)一個(gè) 線程的實(shí)現(xiàn),從執(zhí)行上下文獲取執(zhí)行隊(duì)列,并依次處理該執(zhí)行隊(duì)列中的每一個(gè)執(zhí)行單元,對(duì) 于每一個(gè)執(zhí)行單元,該執(zhí)行隊(duì)列處理器調(diào)用所述的單元調(diào)度器進(jìn)行處理。該基于上述的系統(tǒng)實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其主要特點(diǎn) 是,所述的方法包括圖形執(zhí)行虛擬機(jī)啟動(dòng)操作、圖形執(zhí)行虛擬機(jī)請(qǐng)求處理操作和圖形執(zhí)行 虛擬機(jī)停止操作,所述的圖形執(zhí)行虛擬機(jī)啟動(dòng)操作,包括以下步驟(11)所述的外觀控制器檢查系統(tǒng)引擎的狀態(tài),并對(duì)系統(tǒng)引擎的啟動(dòng)過程進(jìn)行加 鎖;(12)所述的外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器,并調(diào)用節(jié)點(diǎn)注冊(cè)器的初始化;(13)所述的外觀控制器創(chuàng)建上下文容器;
(14)所述的外觀控制器創(chuàng)建單元調(diào)度器;(15)所述的外觀控制器創(chuàng)建核心調(diào)度器,并調(diào)用核心調(diào)度器的初始化;(16)解鎖并標(biāo)記該圖形執(zhí)行虛擬機(jī)啟動(dòng)完成,系統(tǒng)可接收外部請(qǐng)求;所述的圖形執(zhí)行虛擬機(jī)請(qǐng)求處理操作,包括以下步驟(21)所述的外觀控制器從外部請(qǐng)求中獲取IGraph參數(shù)、INode參數(shù)、處理階段參 數(shù),并組裝成指令對(duì)象;(22)所述的外觀控制器調(diào)用該核心調(diào)度器對(duì)該外部請(qǐng)求進(jìn)行處理;所述的圖形執(zhí)行虛擬機(jī)停止操作,包括以下步驟(31)校驗(yàn)系統(tǒng)引擎的狀態(tài),對(duì)該系統(tǒng)引擎的停止過程進(jìn)行加鎖;(32)所述的外觀控制器調(diào)用該核心調(diào)度器的停止動(dòng)作;(33)取消所述的節(jié)點(diǎn)行為注冊(cè)器中各個(gè)已注冊(cè)的節(jié)點(diǎn)行為;(34)所述的外觀控制器調(diào)用清空所述的上下文容器中當(dāng)前的上下文;(35)標(biāo)記該系統(tǒng)引擎狀態(tài)為已停止。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的外觀控制器創(chuàng)建節(jié)點(diǎn)行 為注冊(cè)器并調(diào)用節(jié)點(diǎn)注冊(cè)器的初始化,包括以下步驟(121)所述的外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器對(duì)象;(122)所述的節(jié)點(diǎn)行為注冊(cè)器創(chuàng)建節(jié)點(diǎn)行為緩存映射結(jié)構(gòu);(123)所述的節(jié)點(diǎn)行為注冊(cè)器從配置文件獲取各類型節(jié)點(diǎn)行為實(shí)現(xiàn)類,創(chuàng)建類的 實(shí)例,并加載到緩存映射結(jié)構(gòu)當(dāng)中。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的外觀控制器創(chuàng)建核心調(diào) 度器并調(diào)用核心調(diào)度器的初始化,包括以下步驟(151)所述的外觀控制器創(chuàng)建所述的核心調(diào)度器;(152)所述的核心調(diào)度器創(chuàng)建核心調(diào)度線程池;(153)所述的核心調(diào)度器從該外觀控制器獲取并設(shè)置好對(duì)應(yīng)的上下文容器;(154)所述的核心調(diào)度器啟動(dòng)對(duì)應(yīng)的核心調(diào)度線程池,準(zhǔn)備好接收外部請(qǐng)求。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的外觀控制器調(diào)用該核心 調(diào)度器對(duì)該外部請(qǐng)求進(jìn)行處理,包括以下步驟(221)所述的核心調(diào)度器調(diào)用所述的上下文容器的創(chuàng)建方法,創(chuàng)建請(qǐng)求上下文;(222)所述的核心調(diào)度器把上下文編號(hào)ID傳遞給核心調(diào)度線程池,所述的核心調(diào) 度線程池選擇一個(gè)線程執(zhí)行該外部請(qǐng)求。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的核心調(diào)度線程池中被選 擇的線程為處理線程,所述的線程的執(zhí)行該外部請(qǐng)求,包括以下步驟(41)所述的處理線程從所述的上下文容器獲取到對(duì)應(yīng)的上下文,作為當(dāng)前上下 文;(42)所述的處理線程判斷當(dāng)前上下文是否還有更多的指令;(43)如果是,則調(diào)用所述的單元調(diào)度器的處理過程,并傳入上下文ID ;(44)如果否,則對(duì)該外部請(qǐng)求的處理已經(jīng)完成,并退出;(45)重復(fù)上述步驟(42)。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的調(diào)用單元調(diào)度器的處理過程并傳入上下文ID,包括以下步驟(431)所述的單元調(diào)度器從該上下文容器中獲取到對(duì)應(yīng)的上下文;(432)所述的單元調(diào)度器從步驟(431)中獲取到的上下文中獲取下一個(gè)指令,作 為當(dāng)前指令;(433)所述的單元調(diào)度器判斷當(dāng)前的指令的類型;(434)如果該可執(zhí)行請(qǐng)求是Perform類型,則所述的單元調(diào)度器運(yùn)行自己的執(zhí)行 過程;(435)如果該可執(zhí)行請(qǐng)求是Transmit類型,則所述的單元調(diào)度器執(zhí)行自己的傳送 過程。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的單元調(diào)度器運(yùn)行自己的 執(zhí)行過程,包括以下步驟(4341)所述的單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取到適合于當(dāng)前處理指令的節(jié)點(diǎn)行為 實(shí)現(xiàn)對(duì)象,作為當(dāng)前節(jié)點(diǎn)行為;(4342)所述的單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的執(zhí)行前方法,觸發(fā)對(duì)應(yīng)的用戶 定制行為,并傳入當(dāng)前上下文;(4343)所述的單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的執(zhí)行方法,觸發(fā)用戶定義的節(jié) 點(diǎn)動(dòng)作,并傳入當(dāng)前上下文;(4344)所述的單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的執(zhí)行后行為,觸發(fā)對(duì)應(yīng)的用戶 定制行為,并傳入當(dāng)前上下文;(4345)所述的單元調(diào)度器獲取執(zhí)行上下文的“是否繼續(xù)”屬性;(4346)如果該屬性為“不繼續(xù)”,則直接退出,并返回步驟(45);(4347)如果該屬性為“繼續(xù)”,則調(diào)用當(dāng)前節(jié)點(diǎn)行為的獲取后繼方法,獲取到后續(xù)節(jié)點(diǎn)。(4348)所述的單元調(diào)度器記錄當(dāng)前可執(zhí)行請(qǐng)求處理完成的日志。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的步驟(4347)之后還包括 以下處理步驟(a)循環(huán)為獲取到的后續(xù)節(jié)點(diǎn)產(chǎn)生遷移類型的指令,并追加到當(dāng)前上下文的執(zhí)行 隊(duì)列當(dāng)中。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的單元調(diào)度器執(zhí)行自己的 傳送過程,包括以下步驟(4351)所述的單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取適合于當(dāng)前處理指令的節(jié)點(diǎn)行為實(shí) 現(xiàn)對(duì)象,作為當(dāng)前節(jié)點(diǎn)行為;(4352)所述的單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的遷移前方法,觸發(fā)對(duì)應(yīng)的 用戶定制行為;(4353)所述的單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象遷移傳送動(dòng)作,獲取到后續(xù) 節(jié)點(diǎn)列表,并判斷是否能夠獲取到;(4354)如果否,則當(dāng)前節(jié)點(diǎn)是圖中最后一個(gè)節(jié)點(diǎn),也即結(jié)束節(jié)點(diǎn),查找該節(jié)點(diǎn)的父 節(jié)點(diǎn),且該單元調(diào)度器為父節(jié)點(diǎn)產(chǎn)生一個(gè)新的指令,加入到當(dāng)前上下文的執(zhí)行隊(duì)列當(dāng)中,指 定執(zhí)行階段為結(jié)束;
(4355)如果是,則當(dāng)前節(jié)點(diǎn)是一個(gè)中間節(jié)點(diǎn),所述的單元調(diào)度器順次為后續(xù)節(jié)點(diǎn) 創(chuàng)建新的指令,加入到當(dāng)前上下文的執(zhí)行隊(duì)列當(dāng)中;(4356)所述的單元調(diào)度器記錄當(dāng)前指令處理完成的日志。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的節(jié)點(diǎn)行為為分階段節(jié)點(diǎn) 行為,所述的單元調(diào)度器運(yùn)行自己的執(zhí)行過程,包括以下步驟(51)所述的分階段節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到 執(zhí)行階段信息;(52)如果執(zhí)行階段是開始,則進(jìn)行開始階段操作處理;(53)如果執(zhí)行階段是指令,則進(jìn)行指令階段操作處理;(54)如果執(zhí)行階段是結(jié)束,則進(jìn)行結(jié)束階段操作處理。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的進(jìn)行開始階段操作處理, 包括以下步驟(521)所述的分階段節(jié)點(diǎn)行為設(shè)定指令上下文ExecutionContext的繼續(xù)運(yùn)行屬 性為真;(522)所述的分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)開始動(dòng)作;(523)所述的單元調(diào)度器判斷是否繼續(xù);(524)如果是,則設(shè)定下一個(gè)命令為執(zhí)行,并繼續(xù)回到開始的判斷;如果否,則退
出ο該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的進(jìn)行指令階段操作處理, 包括以下步驟(531)所述的分階段節(jié)點(diǎn)行為設(shè)定指令上下文ExecutionContext繼續(xù)運(yùn)行屬性 為真;(532)所述的分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)執(zhí)行動(dòng)作;(533)所述的單元調(diào)度器判斷是否繼續(xù);(534)如果是,則設(shè)定下一個(gè)命令為結(jié)束,繼續(xù)回到開始的判斷;如果否,則退出。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的結(jié)束階段操作處理,包括 以下步驟(541)所述的分階段節(jié)點(diǎn)行為設(shè)定指令上下文ExecutionContext繼續(xù)運(yùn)行屬性 為真;(542)所述的分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)完成動(dòng)作;(543)結(jié)束階段處理完畢,退出執(zhí)行。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的節(jié)點(diǎn)行為為塊節(jié)點(diǎn)行為, 所述的塊節(jié)點(diǎn)行為的父類為分階段節(jié)點(diǎn)行為,所述的單元調(diào)度器運(yùn)行自己的執(zhí)行過程,包 括以下步驟(61)所述的塊節(jié)點(diǎn)行為調(diào)用分階段節(jié)點(diǎn)行為的步驟(51)至(54);(62)所述的塊節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到執(zhí)行 階段信息;(63)如果該執(zhí)行階段信息不是執(zhí)行,則直接退出;(64)如果該執(zhí)行階段信息是執(zhí)行,則所述的塊節(jié)點(diǎn)行為獲取已經(jīng)設(shè)定的開始節(jié)點(diǎn);
(65)所述的塊節(jié)點(diǎn)行為對(duì)獲取到的開始節(jié)點(diǎn)創(chuàng)建新的執(zhí)行單元指令;(66)所述的塊節(jié)點(diǎn)行為把新創(chuàng)建的指令加入到當(dāng)前執(zhí)行上下文的執(zhí)行隊(duì)列當(dāng)中, 并完成。該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的外觀控制器調(diào)用核心調(diào) 度器的停止動(dòng)作,包括以下步驟(321)所述的核心調(diào)度器給核心調(diào)度線程池發(fā)送中斷信號(hào),停止各線程工作;(322)所述的核心調(diào)度器銷毀該核心調(diào)度線程池對(duì)象。采用了該發(fā)明的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)及其方法,由于其 中對(duì)基于圖形的流程產(chǎn)品的引擎進(jìn)行了抽象,提取出了圖形調(diào)度機(jī)制,實(shí)現(xiàn)了圖形執(zhí)行虛 擬機(jī)GEVM,該圖形執(zhí)行虛擬機(jī)GEVM可以提高流程產(chǎn)品的松耦合能力和可擴(kuò)展能力,有助于 快速開發(fā)出穩(wěn)定可靠的流程引擎產(chǎn)品,從軟件技術(shù)上抽象出了可供多種流程實(shí)現(xiàn)的基礎(chǔ)調(diào) 度公共機(jī)制,減少了流程引擎開發(fā)的工作量,提高了軟件重用度,節(jié)省了工作量;同時(shí)通過 GEVM主動(dòng)加載各種節(jié)點(diǎn)插件行為的方法,各種節(jié)點(diǎn)行為之間開發(fā)不存在任何必然依賴性, 流程引擎的各個(gè)部分可以交給不同技能的人去實(shí)現(xiàn),降低了流程引擎的實(shí)現(xiàn)門檻,降低了 模塊耦合度,提高并行開發(fā)能力;而且基于GEVM可以以開發(fā)擴(kuò)展“插件”的形式擴(kuò)充引擎 的能力;對(duì)于新增節(jié)點(diǎn)功能只需要實(shí)現(xiàn)一些新的擴(kuò)展插件即可,提高了流程引擎的擴(kuò)展性; 不僅如此,一般的功能的變更只局限在特定的節(jié)點(diǎn)插件當(dāng)中,有效避免了少量變動(dòng)引起整 個(gè)流程引擎的不穩(wěn)定,提高了流程引擎的穩(wěn)定性和易維護(hù)性,降低了維護(hù)成本,適用范圍較 為廣泛。


圖1為本發(fā)明的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)中的基于流程執(zhí) 行框架GEVM的流程引擎的結(jié)構(gòu)示意圖。圖2為本發(fā)明的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)中的GEVM框架的 各主要組成部分以及各部分之間的關(guān)系示意圖。圖3為本發(fā)明的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中基于GEVM抽 象的各類節(jié)點(diǎn)、各類節(jié)點(diǎn)之間的行為以及關(guān)系。圖4為本發(fā)明的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的塊活動(dòng)示 意圖。圖5為本發(fā)明的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法中的GEVM框架 主要概念類圖。
具體實(shí)施例方式為了能夠更清楚地理解本發(fā)明的技術(shù)內(nèi)容,特舉以下實(shí)施例詳細(xì)說明。請(qǐng)參閱圖1和圖2所示,該實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng),其中包 括外觀控制器,負(fù)責(zé)圖形執(zhí)行虛擬機(jī)的啟動(dòng)、加載和停止,并接收外部請(qǐng)求的響應(yīng), 調(diào)用其他部件處理請(qǐng)求;
上下文容器,維護(hù)節(jié)點(diǎn)行為處理過程中可以訪問的上下文,確保用戶獲取到當(dāng)前 的執(zhí)行單元、以及當(dāng)前的執(zhí)行隊(duì)列;節(jié)點(diǎn)行為注冊(cè)器,維護(hù)一個(gè)不同類型節(jié)點(diǎn)行為的注冊(cè)表;核心調(diào)度器,分別與所述的外觀控制器和上下文容器相連接,對(duì)所述的外觀控制 器傳遞過來的每一個(gè)請(qǐng)求分配一個(gè)線程進(jìn)行調(diào)度;其中包括 核心調(diào)度線程池,用于容納該核心調(diào)度器所分配的線程; 執(zhí)行隊(duì)列處理器,分別與所述的核心調(diào)度線程池和單元調(diào)度器相連接,對(duì)應(yīng)一 個(gè)線程的實(shí)現(xiàn),從執(zhí)行上下文獲取執(zhí)行隊(duì)列,并依次處理該執(zhí)行隊(duì)列中的每一個(gè)執(zhí)行單元, 對(duì)于每一個(gè)執(zhí)行單元,該執(zhí)行隊(duì)列處理器調(diào)用所述的單元調(diào)度器進(jìn)行處理。單元調(diào)度器,分別與所述的上下文容器、節(jié)點(diǎn)行為注冊(cè)器、核心調(diào)度器相連接,接 收所述的核心調(diào)度器的請(qǐng)求,進(jìn)行一次執(zhí)行,其中每一次執(zhí)行,先從所述的節(jié)點(diǎn)行為注冊(cè)器 中獲取對(duì)應(yīng)的節(jié)點(diǎn)的行為實(shí)現(xiàn)類,再從所述的上下文容器中獲取對(duì)應(yīng)的上下文,并傳入上 下文調(diào)用節(jié)點(diǎn)行為的對(duì)應(yīng)方法。在實(shí)際使用當(dāng)中,針對(duì)現(xiàn)有技術(shù)中的流程引擎研發(fā)中的各種問題和困難,其中的 關(guān)鍵點(diǎn)在于沒有把“流程圖運(yùn)轉(zhuǎn)”本身的控制邏輯與“流程環(huán)節(jié)的具體業(yè)務(wù)內(nèi)涵”處理區(qū)分 開來。因此,針對(duì)所有以“圖形運(yùn)轉(zhuǎn)”為基礎(chǔ)的流程系統(tǒng),本發(fā)明的基本思想是一種可用于支 撐多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)(Graph Execution Virtual Machine,下文簡稱GEVM) 的實(shí)現(xiàn)方法,具體的流程實(shí)現(xiàn)可以通過擴(kuò)展的方式把流程的業(yè)務(wù)行為擴(kuò)展到GEVM中,通過 二者結(jié)合完成完整的流程調(diào)度目標(biāo)。對(duì)于GEVM為何可降低流程引擎實(shí)現(xiàn)的復(fù)雜度和風(fēng)險(xiǎn),請(qǐng)參閱圖1所示。GEVM作 為“圖形”執(zhí)行的基礎(chǔ)設(shè)施,提供擴(kuò)展接口供具體的節(jié)點(diǎn)做擴(kuò)展。通過GEVM,各個(gè)環(huán)節(jié)以相 對(duì)獨(dú)立的方式實(shí)現(xiàn)自己的職責(zé),針對(duì)背景技術(shù)中描述的幾個(gè)問題,解決的情況如下(1)各種活動(dòng)插件都依賴于GEVM,避免了各種活動(dòng)實(shí)現(xiàn)之間的強(qiáng)依賴性,有效解 決了流程引擎各個(gè)部分緊密耦合的問題,有利于實(shí)現(xiàn)并行開發(fā)。各種活動(dòng)的調(diào)度分別可以 安排不同的開發(fā)人員獨(dú)立研發(fā)。同時(shí),GEVM本身的可重用性也可節(jié)省一部分工作量。(2)如果流程需要有功能修改,只需要修改單個(gè)“活動(dòng)擴(kuò)展插件”即可,不會(huì)造成全 局影響;如果需要增加一些活動(dòng)類型的支持,只需要要增加和注冊(cè)對(duì)應(yīng)的插件即可。(3)由于GEVM的作用,各種類型的環(huán)境的行為機(jī)制相互獨(dú)立,減輕了代碼的耦合 度,代碼易讀易維護(hù)。GEVM作為圖形處理虛擬機(jī),其中定義了一些抽象的模型,分別表示節(jié)點(diǎn)、分階段節(jié) 點(diǎn)、塊節(jié)點(diǎn)、圖等基本數(shù)據(jù)結(jié)構(gòu)。另外包含若干基本部件,這些部件基于這些數(shù)據(jù)結(jié)構(gòu)相互 協(xié)作推進(jìn)各個(gè)節(jié)點(diǎn)的執(zhí)行。下面先描述基本工作原理;再描述主要部件;然后描述各部件 的工作過程。GEVM基本工作原理如下無論是哪一種流程,只要是以圖為基礎(chǔ)的流程,都符合圖執(zhí)行的基本原則。圖的基 本組成單位是節(jié)點(diǎn);由于圖中的節(jié)點(diǎn)也可能是塊(塊包含一到多個(gè)節(jié)點(diǎn)),所以GEVM中塊 節(jié)點(diǎn)也是一種特殊的節(jié)點(diǎn);圖可以看作不屬于任何上級(jí)圖的塊節(jié)點(diǎn),所以在GEVM中圖也是 為一種特殊的節(jié)點(diǎn)。(具體請(qǐng)參閱圖1所示)本發(fā)明的GEVM的具體實(shí)施方案中用到的基礎(chǔ)數(shù)據(jù)概念如下
節(jié)點(diǎn)(Node)節(jié)點(diǎn)是GEVM調(diào)度的基本單位,也就是說GEVM調(diào)度的對(duì)象是節(jié)點(diǎn)。節(jié) 點(diǎn)是分類型的,各類型節(jié)點(diǎn)提供其對(duì)應(yīng)的行為接口,環(huán)節(jié)擴(kuò)展插件都擴(kuò)展節(jié)點(diǎn)提供的接口。 在業(yè)務(wù)流程領(lǐng)域,節(jié)點(diǎn)對(duì)應(yīng)一種活動(dòng),比如“人工活動(dòng)”。分階段節(jié)點(diǎn)(StagedNode)分階段節(jié)點(diǎn)是一種特殊的節(jié)點(diǎn),支持在節(jié)點(diǎn)運(yùn)行期間 進(jìn)行中斷,然后在適當(dāng)?shù)臅r(shí)機(jī)繼續(xù)運(yùn)行。分階段節(jié)點(diǎn)可以分為開始、執(zhí)行、完成三個(gè)階段。人 工環(huán)節(jié)是一種典型的分階段節(jié)點(diǎn),人工任務(wù)創(chuàng)建完畢以后流程即暫停,等待任務(wù)處理完畢 以后再通知流程繼續(xù)執(zhí)行。塊節(jié)點(diǎn)(BlockNode)塊節(jié)點(diǎn)是一種特殊的“分階段節(jié)點(diǎn)”。塊節(jié)點(diǎn)在運(yùn)行的時(shí)候 暫停自己的工作,轉(zhuǎn)而去執(zhí)行塊中的節(jié)點(diǎn)。等塊中包含的節(jié)點(diǎn)(可以內(nèi)嵌子流程)全部運(yùn) 行完畢以后,再推動(dòng)塊節(jié)點(diǎn)繼續(xù)執(zhí)行后續(xù)節(jié)點(diǎn)。塊節(jié)點(diǎn)可以包含其他節(jié)點(diǎn),包含的節(jié)點(diǎn)也可 以是塊節(jié)點(diǎn)。在業(yè)務(wù)流程領(lǐng)域,塊節(jié)點(diǎn)對(duì)應(yīng)塊活動(dòng)(或稱為內(nèi)嵌子流程)圖(Graph)圖也是一種節(jié)點(diǎn),并且是一種特殊的塊節(jié)點(diǎn)。圖中可以包含各種類型 的節(jié)點(diǎn)。在業(yè)務(wù)流程領(lǐng)域,圖對(duì)應(yīng)到一個(gè)完整的流程。執(zhí)行單元(Execution)執(zhí)行單元代表GEVM的一個(gè)基本處理單位,一個(gè)節(jié)點(diǎn)的處 理會(huì)產(chǎn)生兩個(gè)執(zhí)行單元,分別是類型為Perform類型和Transmit類型。Perform類型的 Execution負(fù)責(zé)處理節(jié)點(diǎn)本身的業(yè)務(wù)職能(比如發(fā)送一個(gè)消息),Transmit類型負(fù)責(zé)計(jì)算 節(jié)點(diǎn)將要遷移到的后續(xù)節(jié)點(diǎn)。執(zhí)行隊(duì)列(ExecutionQueue)執(zhí)行隊(duì)列是執(zhí)行單元(Execution)組成的一個(gè)隊(duì) 列,節(jié)點(diǎn)擴(kuò)展插件在工作過程中可以從執(zhí)行上下文中獲取到執(zhí)行隊(duì)列,并可對(duì)往執(zhí)行隊(duì)列 中加入新的執(zhí)行單元(Execution)。GEVM會(huì)獲取到新增的Execution,并依次進(jìn)行處理。以上各概念的類圖請(qǐng)參閱圖5所示。GEVM提供一種可擴(kuò)展性的框架,用戶可以基于該框架進(jìn)行擴(kuò)展,用戶擴(kuò)展的實(shí)現(xiàn) 方式針對(duì)不同類型的節(jié)點(diǎn)擴(kuò)展不同的節(jié)點(diǎn)行為。下面為節(jié)點(diǎn)行為的種類。(具體請(qǐng)參閱圖 3所示)1、基本節(jié)點(diǎn)行為(INodeBehavior)圖的執(zhí)行是令牌順著有向圖的正向路徑依次傳遞的過程,這便決定了圖中節(jié)點(diǎn)的 基本行為是“執(zhí)行(perform)”和“轉(zhuǎn)移(transmit)”。(1) “執(zhí)行”完成節(jié)點(diǎn)自身的行為,比如“調(diào)用一個(gè)TOB服務(wù)”、“創(chuàng)建子流程”、“創(chuàng)
建人工任務(wù)——等待任務(wù)執(zhí)行——完成”。(2) “轉(zhuǎn)移”過程中,節(jié)點(diǎn)會(huì)提供轉(zhuǎn)移的目標(biāo)(后續(xù)活動(dòng)),框架支持對(duì)后續(xù)活動(dòng)的 運(yùn)行。2、分階段節(jié)點(diǎn)行為(StagedNodeBehavior)很多情況下,節(jié)點(diǎn)的“操作”行為是分階段進(jìn)行的,節(jié)點(diǎn)可能在運(yùn)行過程中暫停,過 一段時(shí)間再繼續(xù)。為了應(yīng)對(duì)這種情況,引入“分階段節(jié)點(diǎn)行為”。每一個(gè)階段運(yùn)行完畢以后 都可以暫?;蚶^續(xù),整個(gè)活動(dòng)可能持續(xù)很長一段時(shí)間。在業(yè)務(wù)流程中執(zhí)行的階段包括“啟動(dòng) (start)”、“執(zhí)行(execute)”、“完成(finish),,。(1) “啟動(dòng)”過程一般可完成對(duì)實(shí)例的創(chuàng)建和激活等動(dòng)作。啟動(dòng)以后可暫停等待, 也可直接運(yùn)行。(2) “執(zhí)行”過程中實(shí)例進(jìn)入運(yùn)行狀態(tài),并執(zhí)行對(duì)應(yīng)的業(yè)務(wù)動(dòng)作。運(yùn)行以后可暫停等待,也可直接進(jìn)入“完成”。(3) “完成”以后實(shí)例進(jìn)入完成狀態(tài)。完成以后可直接開始“轉(zhuǎn)移”也可暫停等待。GEVM框架就是按照以上的節(jié)點(diǎn)行為特點(diǎn),按照拓?fù)漤樞蛘{(diào)用每一個(gè)節(jié)點(diǎn)的行為, 從而達(dá)到推進(jìn)圖的執(zhí)行的目的。3、±夬節(jié)點(diǎn)行為(BlockNodeBehavior)塊節(jié)點(diǎn)有其特殊性,塊節(jié)點(diǎn)運(yùn)行到的時(shí)候,不會(huì)立即運(yùn)行到后續(xù)活動(dòng),而是去執(zhí)行 塊內(nèi)的活動(dòng),所以塊節(jié)點(diǎn)行為是一種特殊的分階段節(jié)點(diǎn)行為,并且在執(zhí)行過程中需要提供 需要從塊中哪一個(gè)節(jié)點(diǎn)開始運(yùn)行。(參見圖3)構(gòu)成GEVM的主要部件如下(1)外觀控制器(Enginelnstance)外觀控制器負(fù)責(zé)GEVM的啟動(dòng)、加載和停止,并 接收外部請(qǐng)求的響應(yīng),并調(diào)用其他部件處理請(qǐng)求。在外部調(diào)用者看來,外觀控制器代表GEVM 引擎。(該部件之所以叫做“外觀控制器”是因?yàn)檫@里采用了 Facade設(shè)計(jì)模式,外觀控制器 對(duì)外代表引擎)(2)核心調(diào)度器(KernelProcessor)核心調(diào)度器維護(hù)一個(gè)線程池,對(duì)“外觀控制 器”傳遞過來的每一個(gè)請(qǐng)求分配一個(gè)線程進(jìn)行調(diào)度。線程池中每一個(gè)線程的實(shí)現(xiàn),都是一個(gè) 執(zhí)行隊(duì)列處理器,從執(zhí)行上下文獲取執(zhí)行隊(duì)列,并依次處理隊(duì)列中的每一個(gè)執(zhí)行單元。對(duì)與 每一個(gè)執(zhí)行單元,執(zhí)行隊(duì)列處理器會(huì)調(diào)用單元調(diào)度器進(jìn)行處理。(3)單元調(diào)度器(ExecutionHandler)單元調(diào)度器接收核心調(diào)度器的請(qǐng)求,進(jìn)行 一次執(zhí)行。單元調(diào)度器的每一次執(zhí)行,先從節(jié)點(diǎn)注冊(cè)器獲取對(duì)應(yīng)的節(jié)點(diǎn)的行為實(shí)現(xiàn)類,再從 上下文容器中獲取對(duì)應(yīng)的上下文容器,然后傳入上下文調(diào)用節(jié)點(diǎn)行為的對(duì)應(yīng)方法。(4)上下文容器(ExecutionContext)上下文容器維護(hù)節(jié)點(diǎn)行為處理過程中可以 訪問的上下文(Context),用戶可以從ExecutionContext中獲取到當(dāng)前的執(zhí)行單元,以及 當(dāng)前的執(zhí)行隊(duì)列。(5)節(jié)點(diǎn)注冊(cè)器(BehaviorRegistry):節(jié)點(diǎn)注冊(cè)器維護(hù)一個(gè)不同類型節(jié)點(diǎn)行為的 注冊(cè)表,單元調(diào)度器每一次調(diào)度都首先從這里獲取對(duì)應(yīng)的節(jié)點(diǎn)實(shí)現(xiàn)類。以上各部件及其關(guān)系請(qǐng)參閱圖2所示。再請(qǐng)參閱圖3至圖5所示,該基于上述的系統(tǒng)實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行 虛擬機(jī)的方法,其主要特點(diǎn)是,所述的方法包括圖形執(zhí)行虛擬機(jī)啟動(dòng)操作、圖形執(zhí)行虛擬機(jī) 請(qǐng)求處理操作和圖形執(zhí)行虛擬機(jī)停止操作,所述的圖形執(zhí)行虛擬機(jī)啟動(dòng)操作,包括以下步 驟(11)所述的外觀控制器檢查系統(tǒng)引擎的狀態(tài),并對(duì)系統(tǒng)引擎的啟動(dòng)過程進(jìn)行加 鎖;(12)所述的外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器,并調(diào)用節(jié)點(diǎn)注冊(cè)器的初始化,包括 以下步驟(a)所述的外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器對(duì)象;(b)所述的節(jié)點(diǎn)行為注冊(cè)器創(chuàng)建節(jié)點(diǎn)行為緩存映射結(jié)構(gòu);(c)所述的節(jié)點(diǎn)行為注冊(cè)器從配置文件獲取各類型節(jié)點(diǎn)行為實(shí)現(xiàn)類,創(chuàng)建類的實(shí) 例,并加載到緩存映射結(jié)構(gòu)當(dāng)中;(13)所述的外觀控制器創(chuàng)建上下文容器;
(14)所述的外觀控制器創(chuàng)建單元調(diào)度器;(15)所述的外觀控制器創(chuàng)建核心調(diào)度器,并調(diào)用核心調(diào)度器的初始化,包括以下 步驟(a)所述的外觀控制器創(chuàng)建所述的核心調(diào)度器;(b)所述的核心調(diào)度器創(chuàng)建核心調(diào)度線程池;(c)所述的核心調(diào)度器從該外觀控制器獲取并設(shè)置好對(duì)應(yīng)的上下文容器;(d)所述的核心調(diào)度器啟動(dòng)對(duì)應(yīng)的核心調(diào)度線程池,準(zhǔn)備好接收外部請(qǐng)求;(16)解鎖并標(biāo)記該圖形執(zhí)行虛擬機(jī)啟動(dòng)完成,系統(tǒng)可接收外部請(qǐng)求;所述的圖形執(zhí)行虛擬機(jī)請(qǐng)求處理操作,包括以下步驟(21)所述的外觀控制器從外部請(qǐng)求中獲取IGraph參數(shù)、INode參數(shù)、處理階段參 數(shù),并組裝成指令對(duì)象;(22)所述的外觀控制器調(diào)用該核心調(diào)度器對(duì)該外部請(qǐng)求進(jìn)行處理,包括以下步 驟(a)所述的核心調(diào)度器調(diào)用所述的上下文容器的創(chuàng)建方法,創(chuàng)建請(qǐng)求上下文;(b)所述的核心調(diào)度器把上下文編號(hào)ID傳遞給核心調(diào)度線程池,所述的核心調(diào)度 線程池選擇一個(gè)線程執(zhí)行該外部請(qǐng)求;該核心調(diào)度線程池中被選擇的線程為處理線程,所 述的線程的執(zhí)行該外部請(qǐng)求,包括以下步驟(i)所述的處理線程從所述的上下文容器獲取到對(duì)應(yīng)的上下文,作為當(dāng)前上下 文;(ii)所述的處理線程判斷當(dāng)前上下文是否還有更多的指令;(iii)如果是,則調(diào)用所述的單元調(diào)度器的處理過程,并傳入上下文ID,包括以下 步驟(A)所述的單元調(diào)度器從該上下文容器中獲取到對(duì)應(yīng)的上下文;(B)所述的單元調(diào)度器從步驟(A)中獲取到的上下文中獲取下一個(gè)指令,作為當(dāng) 前指令;(C)所述的單元調(diào)度器判斷當(dāng)前的指令的類型;(D)如果該可執(zhí)行請(qǐng)求是Perform類型,則所述的單元調(diào)度器運(yùn)行自己的執(zhí)行過 程,包括以下步驟(aa)所述的單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取到適合于當(dāng)前處理指令的節(jié)點(diǎn)行為實(shí) 現(xiàn)對(duì)象,作為當(dāng)前節(jié)點(diǎn)行為;(bb)所述的單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的執(zhí)行前方法,觸發(fā)對(duì)應(yīng)的用戶定 制行為,并傳入當(dāng)前上下文;(CC)所述的單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的執(zhí)行方法,觸發(fā)用戶定義的節(jié)點(diǎn) 動(dòng)作,并傳入當(dāng)前上下文;(dd)所述的單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的執(zhí)行后行為,觸發(fā)對(duì)應(yīng)的用戶定 制行為,并傳入當(dāng)前上下文;(ee)所述的單元調(diào)度器獲取執(zhí)行上下文的“是否繼續(xù)”屬性;(ff)如果該屬性為“不繼續(xù)”,則直接退出,并返回步驟(45);(gg)如果該屬性為“繼續(xù)”,則調(diào)用當(dāng)前節(jié)點(diǎn)行為的獲取后繼方法,獲取到后續(xù)節(jié)點(diǎn)(hh)循環(huán)為獲取到的后續(xù)節(jié)點(diǎn)產(chǎn)生遷移類型的指令,并追加到當(dāng)前上下文的執(zhí)行 隊(duì)列當(dāng)中;(jj)所述的單元調(diào)度器記錄當(dāng)前可執(zhí)行請(qǐng)求處理完成的日志;(E)如果該可執(zhí)行請(qǐng)求是Transmit類型,則所述的單元調(diào)度器執(zhí)行自己的傳送過 程,包括以下步驟(aa)所述的單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取適合于當(dāng)前處理指令的節(jié)點(diǎn)行為實(shí)現(xiàn) 對(duì)象,作為當(dāng)前節(jié)點(diǎn)行為;(bb)所述的單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的遷移前方法,觸發(fā)對(duì)應(yīng)的用 戶定制行為;(CC)所述的單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象遷移傳送動(dòng)作,獲取到后續(xù)節(jié) 點(diǎn)列表,并判斷是否能夠獲取到;(dd)如果否,則當(dāng)前節(jié)點(diǎn)是圖中最后一個(gè)節(jié)點(diǎn),也即結(jié)束節(jié)點(diǎn),查找該節(jié)點(diǎn)的父節(jié) 點(diǎn),且該單元調(diào)度器為父節(jié)點(diǎn)產(chǎn)生一個(gè)新的指令,加入到當(dāng)前上下文的執(zhí)行隊(duì)列當(dāng)中,指定 執(zhí)行階段為結(jié)束;(ee)如果是,則當(dāng)前節(jié)點(diǎn)是一個(gè)中間節(jié)點(diǎn),所述的單元調(diào)度器順次為后續(xù)節(jié)點(diǎn)創(chuàng) 建新的指令,加入到當(dāng)前上下文的執(zhí)行隊(duì)列當(dāng)中;(ff)所述的單元調(diào)度器記錄當(dāng)前指令處理完成的日志;(iv)如果否,則對(duì)該外部請(qǐng)求的處理已經(jīng)完成,并退出;(ν)重復(fù)上述步驟(ii);所述的圖形執(zhí)行虛擬機(jī)停止操作,包括以下步驟(31)校驗(yàn)系統(tǒng)引擎的狀態(tài),對(duì)該系統(tǒng)引擎的停止過程進(jìn)行加鎖;(32)所述的外觀控制器調(diào)用該核心調(diào)度器的停止動(dòng)作,包括以下步驟(a)所述的核心調(diào)度器給核心調(diào)度線程池發(fā)送中斷信號(hào),停止各線程工作;(b)所述的核心調(diào)度器銷毀該核心調(diào)度線程池對(duì)象;(33)取消所述的節(jié)點(diǎn)行為注冊(cè)器中各個(gè)已注冊(cè)的節(jié)點(diǎn)行為;(34)所述的外觀控制器調(diào)用清空所述的上下文容器中當(dāng)前的上下文;(35)標(biāo)記該系統(tǒng)引擎狀態(tài)為已停止。不僅如此,當(dāng)所述的節(jié)點(diǎn)行為為分階段節(jié)點(diǎn)行為時(shí),所述的單元調(diào)度器運(yùn)行自己 的執(zhí)行過程,包括以下步驟(51)所述的分階段節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到 執(zhí)行階段信息;(52)如果執(zhí)行階段是開始,則進(jìn)行開始階段操作處理,包括以下步驟(a)所述的分階段節(jié)點(diǎn)行為設(shè)定指令上下文ExecutionContext的繼續(xù)運(yùn)行屬性 為真;(b)所述的分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)開始動(dòng)作;(c)所述的單元調(diào)度器判斷是否繼續(xù);(d)如果是,則設(shè)定下一個(gè)命令為執(zhí)行,并繼續(xù)回到開始的判斷;如果否,則退出;(53)如果執(zhí)行階段是指令,則進(jìn)行指令階段操作處理,包括以下步驟
(a)所述的分階段節(jié)點(diǎn)行為設(shè)定指令上下文ExecutionContext繼續(xù)運(yùn)行屬性為 真;(b)所述的分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)執(zhí)行動(dòng)作;(c)所述的單元調(diào)度器判斷是否繼續(xù);(d)如果是,則設(shè)定下一個(gè)命令為結(jié)束,繼續(xù)回到開始的判斷;如果否,則退出;(54)如果執(zhí)行階段是結(jié)束,則進(jìn)行結(jié)束階段操作處理,包括以下步驟(a)所述的分階段節(jié)點(diǎn)行為設(shè)定指令上下文ExecutionContext繼續(xù)運(yùn)行屬性為 真;(b)所述的分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)完成動(dòng)作;(c)結(jié)束階段處理完畢,退出執(zhí)行。同時(shí),當(dāng)所述的節(jié)點(diǎn)行為為塊節(jié)點(diǎn)行為,所述的塊節(jié)點(diǎn)行為的父類為分階段節(jié)點(diǎn) 行為,所述的單元調(diào)度器運(yùn)行自己的執(zhí)行過程,包括以下步驟(61)所述的塊節(jié)點(diǎn)行為調(diào)用分階段節(jié)點(diǎn)行為的上述步驟(51)至(54);(62)所述的塊節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到執(zhí)行 階段信息;(63)如果該執(zhí)行階段信息不是執(zhí)行,則直接退出;(64)如果該執(zhí)行階段信息是執(zhí)行,則所述的塊節(jié)點(diǎn)行為獲取已經(jīng)設(shè)定的開始節(jié)
點(diǎn);(65)所述的塊節(jié)點(diǎn)行為對(duì)獲取到的開始節(jié)點(diǎn)創(chuàng)建新的執(zhí)行單元指令;(66)所述的塊節(jié)點(diǎn)行為把新創(chuàng)建的指令加入到當(dāng)前執(zhí)行上下文的執(zhí)行隊(duì)列當(dāng)中, 并完成。在實(shí)際使用當(dāng)中,本發(fā)明的圖形執(zhí)行虛擬機(jī)GEVM的總體包括啟動(dòng)、處理請(qǐng)求、停 止三個(gè)主要過程。三個(gè)過程都以外觀控制器為開始點(diǎn),各過程分別描述如下過程一 GEVM啟動(dòng)過程如下(1)外觀控制器檢查引擎狀態(tài),并對(duì)引擎的啟動(dòng)過程進(jìn)行加鎖。(2)外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器,并調(diào)用節(jié)點(diǎn)注冊(cè)器的初始化。(3)外觀控制器創(chuàng)建上下文容器。(4)外觀控制器創(chuàng)建單元調(diào)度器。(5)外觀控制器創(chuàng)建核心調(diào)度器,并調(diào)用核心調(diào)度器的初始化。(6)解鎖并標(biāo)記GEVM啟動(dòng)完成,系統(tǒng)可接收外部請(qǐng)求。所述的“外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器,并調(diào)用節(jié)點(diǎn)注冊(cè)器的初始化”包括以下 步驟(1)外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器對(duì)象。(2)節(jié)點(diǎn)行為注冊(cè)器創(chuàng)建節(jié)點(diǎn)行為緩存映射結(jié)構(gòu)。(3)節(jié)點(diǎn)行為注冊(cè)器從配置文件獲取各類型節(jié)點(diǎn)行為實(shí)現(xiàn)類,創(chuàng)建類的實(shí)例,并加 載到緩存映射結(jié)構(gòu)當(dāng)中。所述的“外觀控制器創(chuàng)建核心調(diào)度器,并調(diào)用核心調(diào)度器的初始化”包括以下步 驟(1)外觀控制器創(chuàng)建核心調(diào)度器。
(2)核心調(diào)度器創(chuàng)建核心調(diào)度線程池。(3)核心調(diào)度器從外觀控制器獲取并設(shè)置好對(duì)應(yīng)的上下文容器。(4)核心調(diào)度器啟動(dòng)應(yīng)線程池,準(zhǔn)備好接收外部請(qǐng)求。過程二 GEVM處理請(qǐng)求過程如下(1)外觀控制器從外部請(qǐng)求中獲取IGraph參數(shù)、INode參數(shù)、處理階段(Stage)參 數(shù),并組裝成Execution對(duì)象。(2)外觀控制器調(diào)用核心調(diào)度器的process方法,對(duì)該請(qǐng)求進(jìn)行處理。所述的“外觀控制器調(diào)用核心調(diào)度器的process方法,對(duì)該請(qǐng)求進(jìn)行處理”包括以 下步驟(1)核心調(diào)度器調(diào)用上下文容器的“創(chuàng)建”方法,創(chuàng)建請(qǐng)求上下文。(2)核心調(diào)度器把上下文編號(hào)(ID)傳遞給線程池,線程池選擇一個(gè)線程執(zhí)行該請(qǐng) 求。所述的“核心調(diào)度器把上下文編號(hào)傳遞給線程池,線程池選擇一個(gè)線程執(zhí)行該請(qǐng) 求”中,線程池中線程的處理過程如下(命名線程池中被選中的線程為“處理線程”)(1)處理線程從上下文容器獲取到對(duì)應(yīng)的上下文,作為當(dāng)前上下文。(2)處理線程判斷當(dāng)前上下文是否還有更多的Execution。(3)如果步驟(2)的判斷結(jié)果是“有”,則處理如下(a)調(diào)用單元調(diào)度器的處理過程,傳入上下文ID ;(4)如果步驟(2)的判斷結(jié)果是“沒有”,則表示對(duì)當(dāng)前請(qǐng)求的處理已經(jīng)完成,退出 循環(huán)。(5)處理線程循環(huán)進(jìn)行(2)的判斷。所述的“調(diào)用單元調(diào)度器的處理過程,傳入上下文ID”中,包括以下步驟(步驟序 列A)(1)單元調(diào)度器從上下文容器中獲取到對(duì)應(yīng)的上下文。(2)單元調(diào)度器從(1)中獲取到的上下文獲取下一個(gè)Execution,作為當(dāng)前 Execution。(3)單元調(diào)度器判斷當(dāng)前Execution類型,并根據(jù)類型走(4)或者(5)。(4)如果步驟(3)判斷結(jié)果是Perform類型,則處理如下(a)調(diào)度器執(zhí)行自己的Perform過程;(5)如果步驟(3)判斷結(jié)果是Transmit類型,則處理如下(a)單元調(diào)度器執(zhí)行自己的Transmit過程。所述的“單元調(diào)度器執(zhí)行自己的Perform過程”過程包括以下步驟(步驟序列B)(1)單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取到適合于當(dāng)前處理Execution的節(jié)點(diǎn)行為實(shí)現(xiàn) 對(duì)象,作為當(dāng)前節(jié)點(diǎn)行為。(2)單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的“執(zhí)行前”方法,觸發(fā)對(duì)應(yīng)的用戶定制行 為,并傳入當(dāng)前上下文。(3)單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的“執(zhí)行(Perform) ”方法,觸發(fā)用戶定義 的節(jié)點(diǎn)動(dòng)作,并傳入當(dāng)前上下文。(4)單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的“執(zhí)行后”行為,觸發(fā)對(duì)應(yīng)的用戶定制行為,并傳入當(dāng)前上下文。(5)單元調(diào)度器獲取執(zhí)行上下文的“是否繼續(xù)”屬性。(6)如果步驟(5)的獲取結(jié)果是“不繼續(xù)”,則退出本過程序列,忽略后續(xù)步驟。(7)如果步驟(5)的獲取結(jié)果是“繼續(xù)”,則調(diào)用當(dāng)前節(jié)點(diǎn)行為的“獲取后繼”方法, 獲取到后續(xù)節(jié)點(diǎn)。并處理子過程(a)循環(huán)為獲取到的后續(xù)節(jié)點(diǎn)產(chǎn)生遷移類型的指令(Execution),并追加到當(dāng)前 上下文的執(zhí)行隊(duì)列當(dāng)中。(8)單元調(diào)度器記錄當(dāng)前Execution處理完成的日志。步驟序列A所述的“單元調(diào)度器執(zhí)行自己的Transmit過程”,包括以下步驟(1)單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取適合于當(dāng)前處理Execution的節(jié)點(diǎn)行為實(shí)現(xiàn)對(duì) 象,作為當(dāng)前節(jié)點(diǎn)行為。(2)單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的“遷移前”方法,觸發(fā)對(duì)應(yīng)的用戶定 制行為。(3)單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象“遷移Transmit動(dòng)作”,獲取到后續(xù)節(jié) 點(diǎn)列表。(4)如果步驟(3)獲取的結(jié)果為空,則說明當(dāng)前節(jié)點(diǎn)是圖中最后一個(gè)節(jié)點(diǎn)(結(jié)束節(jié) 點(diǎn)),查找該節(jié)點(diǎn)的父節(jié)點(diǎn),并執(zhí)行以下子過程(a)單元調(diào)度器為父節(jié)點(diǎn)產(chǎn)生一個(gè)新的Execution,加入到當(dāng)前上下文的執(zhí)行隊(duì) 列當(dāng)中,指定執(zhí)行階段為finish ;(5)如果步驟(3)獲取的結(jié)果不為空,則說明當(dāng)前節(jié)點(diǎn)是一個(gè)中間節(jié)點(diǎn)。執(zhí)行如下 子過程(a)單元調(diào)度器順次為后續(xù)節(jié)點(diǎn)創(chuàng)建新的Execution,加入到當(dāng)前上下文的執(zhí)行 隊(duì)列當(dāng)中;(6)單元調(diào)度器記錄當(dāng)前Execution處理完成的日志。下面將描述分階段節(jié)點(diǎn)行為和塊活動(dòng)節(jié)點(diǎn)行為的Perform過程,針對(duì)這二者和前 述過程的關(guān)系,說明如下根據(jù)前文原理中所述,用戶是“通過實(shí)現(xiàn)節(jié)點(diǎn)行為接口”來實(shí)現(xiàn)對(duì)GEVM的擴(kuò)展的。 對(duì)于普通節(jié)點(diǎn)(比如BPM中調(diào)用自動(dòng)服務(wù)的節(jié)點(diǎn)),用戶直接實(shí)現(xiàn)節(jié)點(diǎn)行為接口即可,對(duì)于 分階段節(jié)點(diǎn)行為(比如,人工處理環(huán)節(jié)),用戶可通過繼承“分階段節(jié)點(diǎn)行為”抽象類來更方 便的進(jìn)行實(shí)現(xiàn);同樣的,對(duì)于塊活動(dòng)節(jié)點(diǎn),用戶可繼承“塊活動(dòng)節(jié)點(diǎn)行為”抽象類來更方便的 實(shí)現(xiàn)。所以,分段節(jié)點(diǎn)perform方法的處理過程、塊活動(dòng)節(jié)點(diǎn)的peform方法并非獨(dú)立的 過程,如果用戶繼承了對(duì)應(yīng)的抽象基類來實(shí)現(xiàn)節(jié)點(diǎn)行為擴(kuò)展,則在步驟序列B-3中就完成 了這些過程。分階段節(jié)點(diǎn)行為是一種特殊的節(jié)點(diǎn)行為,重載了節(jié)點(diǎn)行為的perform方法,分段 節(jié)點(diǎn)perform方法的處理過程如下(1)分階段節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到執(zhí)行階 段。(2)如果執(zhí)行階段是START,則
(a)分階段節(jié)點(diǎn)行為設(shè)定ExecutionContext繼續(xù)運(yùn)行屬性為true。(b)分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)開始動(dòng)作。(c)判斷是否繼續(xù),如果繼續(xù)則設(shè)定下一個(gè)命令為EXECUTE,繼續(xù)回到開始的判 斷,否則退出;(3)如果執(zhí)行階段是EXECUTE,則(a)分階段節(jié)點(diǎn)行為設(shè)定ExecutionContext繼續(xù)運(yùn)行屬性為true。(b)分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)執(zhí)行動(dòng)作。(c)判斷是否繼續(xù),如果繼續(xù)則設(shè)定下一個(gè)命令為FINISH,繼續(xù)回到開始的判斷, 否則退出;(4)如果執(zhí)行階段為FINISH,則(a)分階段節(jié)點(diǎn)行為設(shè)定ExecutionContext繼續(xù)運(yùn)行屬性為true。(b)分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)完成動(dòng)作。(C)Finish處理完畢,退出執(zhí)行。塊活動(dòng)行為節(jié)點(diǎn)是一種特殊的分階段行為節(jié)點(diǎn),其實(shí)現(xiàn)了器perform方法,塊活 動(dòng)節(jié)點(diǎn)的Perform方法處過程如下(1)塊節(jié)點(diǎn)行為調(diào)用父類(分階段節(jié)點(diǎn)行為)實(shí)現(xiàn)的perform方法。(2)塊節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到執(zhí)行階段。(3)如果不是EXECUTE,則直接退出。(4)如果是EXE⑶TE,則塊節(jié)點(diǎn)行為獲取已經(jīng)設(shè)定的開始節(jié)點(diǎn),并繼續(xù)下面的操作。(5)塊節(jié)點(diǎn)行為對(duì)獲取到的開始節(jié)點(diǎn)創(chuàng)建新的執(zhí)行單元Execution。(6)塊節(jié)點(diǎn)行為把新創(chuàng)建的Execution加入到當(dāng)前執(zhí)行上下文的執(zhí)行隊(duì)列當(dāng)中, 完成。過程三GEVM停止過程如下(1)校驗(yàn)引擎狀態(tài),對(duì)引擎的停止過程進(jìn)行加鎖。(2)外觀控制器調(diào)用核心調(diào)度器的停止動(dòng)作。(3)取消節(jié)點(diǎn)行為注冊(cè)器中各個(gè)已注冊(cè)的節(jié)點(diǎn)行為。(4)外觀控制器調(diào)用清空上下文容器中當(dāng)前的上下文。(5)標(biāo)記引擎狀態(tài)為已停止。所述的“外觀控制器調(diào)用核心調(diào)度器的停止動(dòng)作”包含以下步驟(1)核心調(diào)度器給線程池發(fā)送中斷信號(hào),停止各線程工作。(2)核心調(diào)度器銷毀線程池對(duì)象。以下實(shí)施例總采用JDK 1.5為基礎(chǔ)環(huán)境。GEVM啟動(dòng)過程如下(1)外觀控制器檢查引擎狀態(tài),并對(duì)引擎的啟動(dòng)過程進(jìn)行加鎖。包括以下步驟(a)外觀控制器判斷引擎狀態(tài),如果狀態(tài)為1,啟動(dòng)失敗。i.說明引擎狀態(tài)類型為整數(shù),可選值包括0 非活動(dòng)狀態(tài)1 活動(dòng)狀態(tài) 說明對(duì)引擎加鎖和修改引擎狀態(tài)的操作下同,碰到不再詳述(b)對(duì)外觀控制器中的lock對(duì)象實(shí)施synchronize操作。
(2)外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器,并調(diào)用節(jié)點(diǎn)注冊(cè)器的初始化。(3)外觀控制器創(chuàng)建上下文容器。(4)外觀控制器創(chuàng)建單元調(diào)度器。(5)外觀控制器創(chuàng)建核心調(diào)度器,并調(diào)用核心調(diào)度器的初始化。(6)解鎖并標(biāo)記GEVM啟動(dòng)完成,系統(tǒng)可接收外部請(qǐng)求。包括以下步驟(a)修改引擎狀態(tài)為1(b)退出 synchronize 鎖定狀態(tài)所述的“外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器,并調(diào)用節(jié)點(diǎn)注冊(cè)器的初始化”包括以下 步驟(1)外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器對(duì)象。(2)節(jié)點(diǎn)行為注冊(cè)器創(chuàng)建節(jié)點(diǎn)行為緩存映射結(jié)構(gòu)。(3)節(jié)點(diǎn)行為注冊(cè)器從配置文件獲取各類型節(jié)點(diǎn)行為實(shí)現(xiàn)類,創(chuàng)建類的實(shí)例,并加 載到緩存映射結(jié)構(gòu)當(dāng)中。包括以下步驟(a)從當(dāng)前目錄獲取GEVM-plugins. xml,從中獲取所有的插件行為類,并分別創(chuàng) 建實(shí)例(b)把創(chuàng)建的節(jié)點(diǎn)行為插件實(shí)例增加到節(jié)點(diǎn)行為注冊(cè)表中i.說明節(jié)點(diǎn)行為插件配置文件GEVM-plugins. xml文件結(jié)構(gòu)如下為< ? xml version = " 1.0〃 encoding = " utf-8" ? ><root><behaviornodeType =" manual" >gevm. nodebehavior. ManualTaskBehavior</behavior><behaviornodeType = " service " >gevm. nodeBehavior. ServiceTaskBehavior</ behavior>......</root>(c)分別調(diào)用每個(gè)節(jié)點(diǎn)行為插件的start方法所述的“外觀控制器創(chuàng)建核心調(diào)度器,并調(diào)用核心調(diào)度器的初始化”包括以下步 驟(1)外觀控制器創(chuàng)建核心調(diào)度器。(2)核心調(diào)度器創(chuàng)建核心調(diào)度線程池。(a)線程池使用 JDK1. 5 中 java. util. concurrent. ThreadPoolExecutor。采用如 下構(gòu)造函數(shù)構(gòu)造public ThreadPoolExecutor (int corePoolSize,//線禾呈數(shù)int maximumPoolSize,//最/J、線程數(shù)long ke印AliveTime,//線程保持活躍時(shí)間TimeUnit unit,//時(shí)間的單元BlockingQueue<Runnable>workQueue)// 消息隊(duì)列 (3)核心調(diào)度器從外觀控制器獲取并設(shè)置好對(duì)應(yīng)的上下文容器。
(4)核心調(diào)度器啟動(dòng)應(yīng)線程池,準(zhǔn)備好接收外部請(qǐng)求。GEVM處理外部請(qǐng)求的過程如下(1)外觀控制器從外部請(qǐng)求中獲取IGraph參數(shù)、INode參數(shù)、處理階段(Stage)參 數(shù),并組裝成Execution對(duì)象。(2)外觀控制器調(diào)用核心調(diào)度器的process方法,對(duì)該請(qǐng)求進(jìn)行處理。所述的“外觀控制器調(diào)用核心調(diào)度器的process方法,對(duì)該請(qǐng)求進(jìn)行處理”包括以 下步驟(1)核心調(diào)度器調(diào)用上下文容器的“創(chuàng)建”方法,創(chuàng)建請(qǐng)求上下文。包括以下步驟(a)上下文容器創(chuàng)建一個(gè)新的執(zhí)行上下文ExecutionContext,并初始化其執(zhí)行隊(duì) 列ExecutionQueue為空隊(duì)列。(b)ExecutionQueue 的當(dāng)前 Excution 指針指向空(null)。(c)上下文容器把當(dāng)前Execution放入該ExecutionContext的執(zhí)行上隊(duì)列當(dāng)中, 作為該隊(duì)列的第一個(gè)Execution。(d)ExecutionQueue 的當(dāng)前 Excution 指針指向新力口入的 Execution。(e)上下文容器產(chǎn)生一個(gè)新的上下文ID,把以此ID為key,把新創(chuàng)建的 ExecutionContext放入容器當(dāng)中。備注上下文容器的Mapping 結(jié)構(gòu)采用 JDK1. 5 的 java. util. concurrent. ConcurrentHashMap 類。(2)核心調(diào)度器把上下文編號(hào)(ID)傳遞給線程池,線程池選擇一個(gè)線程執(zhí)行該請(qǐng) 求。說明調(diào)用的方法為 ThreadPoolExecutor 類的“public void execute (Runnable command),,方法。所述的“核心調(diào)度器把上下文編號(hào)傳遞給線程池,線程池選擇一個(gè)線程執(zhí)行該請(qǐng) 求”中,線程池中線程的處理過程如下(命名線程池中被選中的線程為“處理線程”)(1)處理線程從上下文容器獲取到對(duì)應(yīng)的上下文,作為當(dāng)前上下文。(2)處理線程判斷當(dāng)前上下文是否還有更多的Execution(3)如果步驟(2)的判斷結(jié)果是“有”,則處理如下(a)調(diào)用單元調(diào)度器的處理過程,傳入上下文ID。(4)如果步驟(2)的判斷結(jié)果是“沒有”,則表示對(duì)當(dāng)前請(qǐng)求的處理已經(jīng)完成,退出 循環(huán)。(5)處理線程繼續(xù)進(jìn)行(2)的判斷。所述的“調(diào)用單元調(diào)度器的處理過程,傳入上下文ID”中,包括以下步驟(步驟序 列A)(1)單元調(diào)度器從上下文容器中獲取到對(duì)應(yīng)的上下文。(2)單元調(diào)度器從(1)中獲取到的上下文獲取下一個(gè)Execution,作為當(dāng)前 Execution。(3)單元調(diào)度器判斷當(dāng)前Execution類型,并根據(jù)類型走(4)或者(5)。(4)如果步驟(3)判斷結(jié)果是Perform類型,則處理如下(a)單元調(diào)度器執(zhí)行自己的Perform過程。
(5)如果步驟(3)判斷結(jié)果是Transmit類型,則處理如下(a)單元調(diào)度器執(zhí)行自己的Transmit過程。所述的“單元調(diào)度器執(zhí)行自己的Perform過程”過程包括以下步驟(步驟序列B)(1)單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取到適合于當(dāng)前處理Execution的節(jié)點(diǎn)行為實(shí)現(xiàn) 對(duì)象,作為當(dāng)前節(jié)點(diǎn)行為。包括以下步驟(a)單元調(diào)度器獲取當(dāng)前的Executioni. IitIX^Iir Execution 白勺ctx. getCurrentExecution 0 , ctx 夕卜力夕去 調(diào)用傳入的參數(shù)。(b)單元調(diào)度器從當(dāng)前的Execution,進(jìn)而獲取到當(dāng)前節(jié)點(diǎn)(INode)的類型。(c)單元調(diào)度器從節(jié)點(diǎn)注冊(cè)表(nodeRegistry)當(dāng)中獲取到對(duì)應(yīng)的節(jié)點(diǎn)行為對(duì)象。 (如果獲取到空,該調(diào)度異常結(jié)束)(2)單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的“執(zhí)行前”方法,觸發(fā)對(duì)應(yīng)的用戶定制行 為,并傳入當(dāng)前上下文。包括如下步驟(a)調(diào)用監(jiān)聽器的onBeforePerform方法,觸發(fā)“行為將要發(fā)生”的信號(hào)。(b)從上下文(ExecutionContext)中判斷是否繼續(xù),如果不繼續(xù),則退出。(3)單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的“執(zhí)行(Perform) ”方法,觸發(fā)用戶定義 的節(jié)點(diǎn)動(dòng)作,并傳入當(dāng)前上下文。(4)單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的“執(zhí)行后”行為,觸發(fā)對(duì)應(yīng)的用戶定制行 為,并傳入當(dāng)前上下文。(5)單元調(diào)度器獲取執(zhí)行上下文的“是否繼續(xù)”屬性。(6)如果步驟(5)的獲取結(jié)果是“不繼續(xù)”,則退出本過程序列,忽略后續(xù)步驟。(7)如果步驟(5)的獲取結(jié)果是“繼續(xù)”,則調(diào)用當(dāng)前節(jié)點(diǎn)行為的“獲取后繼”方法, 獲取到后續(xù)節(jié)點(diǎn)。并處理子過程(a)循環(huán)為獲取到的后續(xù)節(jié)點(diǎn)產(chǎn)生遷移類型的指令(Execution),并追加到當(dāng)前 上下文的執(zhí)行隊(duì)列當(dāng)中。(8)單元調(diào)度器記錄當(dāng)前Execution處理完成的日志。以上“單元調(diào)度器執(zhí)行自己的Perform過程”,示例代碼如下public void perform(ExecutionContext ctx){H步驟1 單元調(diào)度器獲取到適合于當(dāng)前處理Execution的節(jié)點(diǎn)處理器Execution param = ctx. getCurrentExecution();INode nd = param. getCurrentNode ();String nt = nd. getNodeType ();INodeBehaviornodeBehavior =nodeBehaviorRegistry. getNodeBehavior (nt);if (nodeBehavior == null)throw new RuntimeException ( " Can ' t find the node behavior " +nt);Il步驟2 觸發(fā)其注冊(cè)的節(jié)點(diǎn)行為監(jiān)聽器的"執(zhí)行前"行為通知節(jié)點(diǎn)行為 監(jiān)聽器
listener. onBeforePerform(ctx);if( ! ctx. isContinueO)return ;H步驟3 單元調(diào)度器調(diào)用該節(jié)點(diǎn)行為對(duì)象的執(zhí)行(Perform)行為nodeBehavior. perform (ctx);H步驟4 單元調(diào)度器通過觸發(fā)其注冊(cè)的節(jié)點(diǎn)行為監(jiān)聽器的"執(zhí)行后"行 為通知listener. onAfterPerform(ctx);H步驟5 單元調(diào)度器獲取執(zhí)行上下文的是否繼續(xù)屬性if( ! ctx. isContinueO)//步驟6 不繼續(xù)則返回return ;else {H步驟7 針對(duì)當(dāng)前運(yùn)行的環(huán)節(jié)產(chǎn)生遷移類型的指令(Execution),并加 入到執(zhí)行隊(duì)列當(dāng)中ctx. getExecutionQueue (). insertExecution (ExecutionFactory. createExecution(ExecutionType. TRANSIMIT,param. getCurrentGraph (), param. getCurrentNode (),...);}//步驟8:記錄日志EngineInstanceLogger. log (ctx);}步驟序列A所述的“單元調(diào)度器執(zhí)行自己的Transmit過程”,包括以下步驟(1)單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取適合于當(dāng)前處理Execution的節(jié)點(diǎn)行為實(shí)現(xiàn)對(duì) 象,作為當(dāng)前節(jié)點(diǎn)行為。(2)單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的“遷移前”方法,觸發(fā)對(duì)應(yīng)的用戶定 制行為。(3)單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象“遷移Transmit動(dòng)作”,獲取到后續(xù)節(jié) 點(diǎn)列表。(4)如果步驟(3)獲取的結(jié)果為空,則說明當(dāng)前節(jié)點(diǎn)是圖中最后一個(gè)節(jié)點(diǎn)(結(jié)束節(jié) 點(diǎn)),查找該節(jié)點(diǎn)的父節(jié)點(diǎn),并執(zhí)行以下子過程(a)單元調(diào)度器為父節(jié)點(diǎn)產(chǎn)生一個(gè)新的Execution,加入到當(dāng)前上下文的執(zhí)行隊(duì) 列當(dāng)中,指定執(zhí)行階段為finish。(5)如果步驟(3)獲取的結(jié)果不為空,則說明當(dāng)前節(jié)點(diǎn)是一個(gè)中間節(jié)點(diǎn)。執(zhí)行如下 子過程(a)單元調(diào)度器順次為后續(xù)節(jié)點(diǎn)創(chuàng)建新的Execution,加入到當(dāng)前上下文的執(zhí)行 隊(duì)列當(dāng)中。(6)單元調(diào)度器記錄當(dāng)前Execution處理完成的日志。
分階段節(jié)點(diǎn)行為是一種特殊的節(jié)點(diǎn)行為,重載了節(jié)點(diǎn)行為的perform方法,分段 節(jié)點(diǎn)perform方法的處理過程如下(1)分階段節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到執(zhí)行階 段。(2)如果執(zhí)行階段是START,則(a)分階段節(jié)點(diǎn)行為設(shè)定ExecutionContext繼續(xù)運(yùn)行屬性為true。(b)分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)開始動(dòng)作。(c)判斷是否繼續(xù),如果繼續(xù)則設(shè)定下一個(gè)命令為EXECUTE,繼續(xù)回到開始的判 斷,否則退出。(3)如果執(zhí)行階段是EXECUTE,則(a)分階段節(jié)點(diǎn)行為設(shè)定ExecutionContext繼續(xù)運(yùn)行屬性為true。(b)分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)執(zhí)行動(dòng)作。(c)判斷是否繼續(xù),如果繼續(xù)則設(shè)定下一個(gè)命令為FINISH,繼續(xù)回到開始的判斷, 否則退出;(4)如果執(zhí)行階段為FINISH,則(a)分階段節(jié)點(diǎn)行為設(shè)定ExecutionContext繼續(xù)運(yùn)行屬性為true。(b)分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)完成動(dòng)作。(C)Finish處理完畢,退出執(zhí)行。針對(duì)以上分階段節(jié)點(diǎn)的perform方法,使用Java代碼描述如下public void perform(IExecutionContext ctx) {H步驟1 分階段節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元, 并獲取到執(zhí)行階段PerformStagecommand =ctx. getCurrentExecution(). getPerformStage ();while (command ! = null) {switch (command) {case START // 步驟 2 對(duì) Start 的處理ctx. setContinue (true);startNode (ctx);if (ctx. isContinueO) {command = PerformStage. EXECUTE ;ctx. getCurrentExecution ().setPerformStage(PerformStage. EXECUTE);{else command = null ;break ;case EXECUTE // 步驟 3 對(duì) Execute 的處理ctx. setContinue (true);executeNode(ctx);
if (ctx. isContinue ()) {command = PerformStage. FINI SH ;ctx. getCurrentExecution ().setPerformStage(PerformStage. FINISH);{else command = null ;break ;case FINISH // 步驟 4 對(duì) FINISH 的處理ctx. setContinue (true);finishNode(ctx);command = null ;break ;}}塊活動(dòng)行為節(jié)點(diǎn)是一種特殊的分階段行為節(jié)點(diǎn),其實(shí)現(xiàn)了其perform方法,塊活 動(dòng)節(jié)點(diǎn)的Perform方法處過程如下(1)塊節(jié)點(diǎn)行為調(diào)用父類(分階段節(jié)點(diǎn)行為)實(shí)現(xiàn)的perform方法。(2)塊節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到執(zhí)行階段。(3)如果不是EXECUTE,則直接退出。(4)如果是EXE⑶TE,則塊節(jié)點(diǎn)行為獲取已經(jīng)設(shè)定的開始節(jié)點(diǎn),并繼續(xù)下面的操作。(5)塊節(jié)點(diǎn)行為對(duì)獲取到的開始節(jié)點(diǎn)創(chuàng)建新的執(zhí)行單元Execution。(6)塊節(jié)點(diǎn)行為把新創(chuàng)建的Execution加入到當(dāng)前執(zhí)行上下文的執(zhí)行隊(duì)列當(dāng)中, 完成。GEVM停止過程如下(1)校驗(yàn)引擎狀態(tài),對(duì)引擎的停止過程進(jìn)行加鎖。(2)外觀控制器調(diào)用核心調(diào)度器的停止動(dòng)作。(3)取消節(jié)點(diǎn)行為注冊(cè)器中各個(gè)已注冊(cè)的節(jié)點(diǎn)行為。(4)外觀控制器調(diào)用清空上下文容器中當(dāng)前的上下文。(5)標(biāo)記引擎狀態(tài)為已停止。備注引擎停止的狀態(tài)標(biāo)記為0所述的“外觀控制器調(diào)用核心調(diào)度器的停止動(dòng)作”包含以下步驟(1)核心調(diào)度器給線程池發(fā)送中斷信號(hào),停止各線程工作。說明調(diào)用線程池ThreadPooIExecutor 類的 shutdown 方法。(2)核心調(diào)度器銷毀線程池對(duì)象。說明設(shè)置線程池對(duì)象為null。采用了本發(fā)明所提出的流程執(zhí)行的基礎(chǔ)框架(GEVM),由于其技術(shù)特點(diǎn),必然具備 以下幾方面的優(yōu)勢(shì)(1)提高軟件重用度,節(jié)省工作量。
從軟件技術(shù)上來說,抽象出了可供多種流程實(shí)現(xiàn)的基礎(chǔ)調(diào)度公共機(jī)制,減少了流 程引擎開發(fā)的工作量。(2)降低模塊耦合度,提高并行開發(fā)能力。通過GEVM主動(dòng)加載各種節(jié)點(diǎn)插件行為的方法,各種節(jié)點(diǎn)行為之間開發(fā)不存在任 何必然依賴性,流程引擎的各個(gè)部分可以交給不同技能的人去實(shí)現(xiàn),降低了流程引擎的實(shí) 現(xiàn)門檻。(3)提高流程引擎的擴(kuò)展性?;贕EVM可以以開發(fā)擴(kuò)展“插件”的形式擴(kuò)充引擎的能力;對(duì)于新增節(jié)點(diǎn)功能只 需要實(shí)現(xiàn)一些新的擴(kuò)展插件即可,提高了流程引擎的擴(kuò)展性。(4)提高流程引擎的穩(wěn)定性和易維護(hù)性。一般的功能的變更只局限在特定的節(jié)點(diǎn)插件當(dāng)中,可有效避免少量變動(dòng)引起整個(gè) 流程引擎的不穩(wěn)定,提高了流程引擎的穩(wěn)定性和易維護(hù)性,降低維護(hù)成本。采用了上述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)及其方法,由于其中 對(duì)基于圖形的流程產(chǎn)品的引擎進(jìn)行了抽象,提取出了圖形調(diào)度機(jī)制,實(shí)現(xiàn)了圖形執(zhí)行虛擬 機(jī)GEVM,該圖形執(zhí)行虛擬機(jī)GEVM可以提高流程產(chǎn)品的松耦合能力和可擴(kuò)展能力,有助于 快速開發(fā)出穩(wěn)定可靠的流程引擎產(chǎn)品,從軟件技術(shù)上抽象出了可供多種流程實(shí)現(xiàn)的基礎(chǔ)調(diào) 度公共機(jī)制,減少了流程引擎開發(fā)的工作量,提高了軟件重用度,節(jié)省了工作量;同時(shí)通過 GEVM主動(dòng)加載各種節(jié)點(diǎn)插件行為的方法,各種節(jié)點(diǎn)行為之間開發(fā)不存在任何必然依賴性, 流程引擎的各個(gè)部分可以交給不同技能的人去實(shí)現(xiàn),降低了流程引擎的實(shí)現(xiàn)門檻,降低了 模塊耦合度,提高并行開發(fā)能力;而且基于GEVM可以以開發(fā)擴(kuò)展“插件”的形式擴(kuò)充引擎 的能力;對(duì)于新增節(jié)點(diǎn)功能只需要實(shí)現(xiàn)一些新的擴(kuò)展插件即可,提高了流程引擎的擴(kuò)展性; 不僅如此,一般的功能的變更只局限在特定的節(jié)點(diǎn)插件當(dāng)中,有效避免了少量變動(dòng)引起整 個(gè)流程引擎的不穩(wěn)定,提高了流程引擎的穩(wěn)定性和易維護(hù)性,降低了維護(hù)成本,適用范圍較 為廣泛。在此說明書中,本發(fā)明已參照其特定的實(shí)施例作了描述。但是,很顯然仍可以作出 各種修改和變換而不背離本發(fā)明的精神和范圍。因此,說明書和附圖應(yīng)被認(rèn)為是說明性的 而非限制性的。
權(quán)利要求
一種實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng),其特征在于,所述的系統(tǒng)包括外觀控制器,負(fù)責(zé)圖形執(zhí)行虛擬機(jī)的啟動(dòng)、加載和停止,并接收外部請(qǐng)求的響應(yīng),調(diào)用其他部件處理請(qǐng)求;上下文容器,維護(hù)節(jié)點(diǎn)行為處理過程中可以訪問的上下文,確保用戶獲取到當(dāng)前的執(zhí)行單元、以及當(dāng)前的執(zhí)行隊(duì)列;節(jié)點(diǎn)行為注冊(cè)器,維護(hù)一個(gè)不同類型節(jié)點(diǎn)行為的注冊(cè)表;核心調(diào)度器,分別與所述的外觀控制器和上下文容器相連接,對(duì)所述的外觀控制器傳遞過來的每一個(gè)請(qǐng)求分配一個(gè)線程進(jìn)行調(diào)度;單元調(diào)度器,分別與所述的上下文容器、節(jié)點(diǎn)行為注冊(cè)器、核心調(diào)度器相連接,接收所述的核心調(diào)度器的請(qǐng)求,進(jìn)行一次執(zhí)行,其中每一次執(zhí)行,先從所述的節(jié)點(diǎn)行為注冊(cè)器中獲取對(duì)應(yīng)的節(jié)點(diǎn)的行為實(shí)現(xiàn)類,再從所述的上下文容器中獲取對(duì)應(yīng)的上下文,并傳入上下文調(diào)用節(jié)點(diǎn)行為的對(duì)應(yīng)方法。
2.根據(jù)權(quán)利要求1所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng),其特征在 于,所述的核心調(diào)度器包括核心調(diào)度線程池,用于容納該核心調(diào)度器所分配的線程;執(zhí)行隊(duì)列處理器,分別與所述的核心調(diào)度線程池和單元調(diào)度器相連接,對(duì)應(yīng)一個(gè)線程 的實(shí)現(xiàn),從執(zhí)行上下文獲取執(zhí)行隊(duì)列,并依次處理該執(zhí)行隊(duì)列中的每一個(gè)執(zhí)行單元,對(duì)于每 一個(gè)執(zhí)行單元,該執(zhí)行隊(duì)列處理器調(diào)用所述的單元調(diào)度器進(jìn)行處理。
3.一種基于權(quán)利要求1所述的系統(tǒng)實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法, 其特征在于,所述的方法包括圖形執(zhí)行虛擬機(jī)啟動(dòng)操作、圖形執(zhí)行虛擬機(jī)請(qǐng)求處理操作和 圖形執(zhí)行虛擬機(jī)停止操作,所述的圖形執(zhí)行虛擬機(jī)啟動(dòng)操作,包括以下步驟(11)所述的外觀控制器檢查系統(tǒng)引擎的狀態(tài),并對(duì)系統(tǒng)引擎的啟動(dòng)過程進(jìn)行加鎖;(12)所述的外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器,并調(diào)用節(jié)點(diǎn)注冊(cè)器的初始化;(13)所述的外觀控制器創(chuàng)建上下文容器;(14)所述的外觀控制器創(chuàng)建單元調(diào)度器;(15)所述的外觀控制器創(chuàng)建核心調(diào)度器,并調(diào)用核心調(diào)度器的初始化;(16)解鎖并標(biāo)記該圖形執(zhí)行虛擬機(jī)啟動(dòng)完成,系統(tǒng)可接收外部請(qǐng)求;所述的圖形執(zhí)行虛擬機(jī)請(qǐng)求處理操作,包括以下步驟(21)所述的外觀控制器從外部請(qǐng)求中獲取IGraph參數(shù)、INode參數(shù)、處理階段參數(shù),并 組裝成指令對(duì)象;(22)所述的外觀控制器調(diào)用該核心調(diào)度器對(duì)該外部請(qǐng)求進(jìn)行處理;所述的圖形執(zhí)行虛擬機(jī)停止操作,包括以下步驟(31)校驗(yàn)系統(tǒng)引擎的狀態(tài),對(duì)該系統(tǒng)引擎的停止過程進(jìn)行加鎖;(32)所述的外觀控制器調(diào)用該核心調(diào)度器的停止動(dòng)作;(33)取消所述的節(jié)點(diǎn)行為注冊(cè)器中各個(gè)已注冊(cè)的節(jié)點(diǎn)行為;(34)所述的外觀控制器調(diào)用清空所述的上下文容器中當(dāng)前的上下文;(35)標(biāo)記該系統(tǒng)引擎狀態(tài)為已停止。
4.根據(jù)權(quán)利要求3所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征在于,所述的外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器并調(diào)用節(jié)點(diǎn)注冊(cè)器的初始化,包括以下步驟(121)所述的外觀控制器創(chuàng)建節(jié)點(diǎn)行為注冊(cè)器對(duì)象;(122)所述的節(jié)點(diǎn)行為注冊(cè)器創(chuàng)建節(jié)點(diǎn)行為緩存映射結(jié)構(gòu);(123)所述的節(jié)點(diǎn)行為注冊(cè)器從配置文件獲取各類型節(jié)點(diǎn)行為實(shí)現(xiàn)類,創(chuàng)建類的實(shí)例, 并加載到緩存映射結(jié)構(gòu)當(dāng)中。
5.根據(jù)權(quán)利要求3所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征在 于,所述的外觀控制器創(chuàng)建核心調(diào)度器并調(diào)用核心調(diào)度器的初始化,包括以下步驟(151)所述的外觀控制器創(chuàng)建所述的核心調(diào)度器;(152)所述的核心調(diào)度器創(chuàng)建核心調(diào)度線程池;(153)所述的核心調(diào)度器從該外觀控制器獲取并設(shè)置好對(duì)應(yīng)的上下文容器;(154)所述的核心調(diào)度器啟動(dòng)對(duì)應(yīng)的核心調(diào)度線程池,準(zhǔn)備好接收外部請(qǐng)求。
6.根據(jù)權(quán)利要求3所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征在 于,所述的外觀控制器調(diào)用該核心調(diào)度器對(duì)該外部請(qǐng)求進(jìn)行處理,包括以下步驟(221)所述的核心調(diào)度器調(diào)用所述的上下文容器的創(chuàng)建方法,創(chuàng)建請(qǐng)求上下文;(222)所述的核心調(diào)度器把上下文編號(hào)ID傳遞給核心調(diào)度線程池,所述的核心調(diào)度線 程池選擇一個(gè)線程執(zhí)行該外部請(qǐng)求。
7.根據(jù)權(quán)利要求6所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征在 于,所述的核心調(diào)度線程池中被選擇的線程為處理線程,所述的線程的執(zhí)行該外部請(qǐng)求,包 括以下步驟(41)所述的處理線程從所述的上下文容器獲取到對(duì)應(yīng)的上下文,作為當(dāng)前上下文;(42)所述的處理線程判斷當(dāng)前上下文是否還有更多的指令;(43)如果是,則調(diào)用所述的單元調(diào)度器的處理過程,并傳入上下文ID;(44)如果否,則對(duì)該外部請(qǐng)求的處理已經(jīng)完成,并退出;(45)重復(fù)上述步驟(42)。
8.根據(jù)權(quán)利要求7所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征在 于,所述的調(diào)用單元調(diào)度器的處理過程并傳入上下文ID,包括以下步驟(431)所述的單元調(diào)度器從該上下文容器中獲取到對(duì)應(yīng)的上下文;(432)所述的單元調(diào)度器從步驟(431)中獲取到的上下文中獲取下一個(gè)指令,作為當(dāng) 前指令;(433)所述的單元調(diào)度器判斷當(dāng)前的指令的類型;(434)如果該可執(zhí)行請(qǐng)求是Perform類型,則所述的單元調(diào)度器運(yùn)行自己的執(zhí)行過程;(435)如果該可執(zhí)行請(qǐng)求是Transmit類型,則所述的單元調(diào)度器執(zhí)行自己的傳送過程。
9.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征在 于,所述的單元調(diào)度器運(yùn)行自己的執(zhí)行過程,包括以下步驟(4341)所述的單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取到適合于當(dāng)前處理指令的節(jié)點(diǎn)行為實(shí)現(xiàn) 對(duì)象,作為當(dāng)前節(jié)點(diǎn)行為;(4342)所述的單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的執(zhí)行前方法,觸發(fā)對(duì)應(yīng)的用戶定制 行為,并傳入當(dāng)前上下文;(4343)所述的單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的執(zhí)行方法,觸發(fā)用戶定義的節(jié)點(diǎn)動(dòng) 作,并傳入當(dāng)前上下文;(4344)所述的單元調(diào)度器調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的執(zhí)行后行為,觸發(fā)對(duì)應(yīng)的用戶定制 行為,并傳入當(dāng)前上下文;(4345)所述的單元調(diào)度器獲取執(zhí)行上下文的“是否繼續(xù)”屬性;(4346)如果該屬性為“不繼續(xù)”,則直接退出,并返回步驟(45);(4347)如果該屬性為“繼續(xù)”,則調(diào)用當(dāng)前節(jié)點(diǎn)行為的獲取后繼方法,獲取到后續(xù)節(jié)點(diǎn)。(4348)所述的單元調(diào)度器記錄當(dāng)前可執(zhí)行請(qǐng)求處理完成的日志。
10.根據(jù)權(quán)利要求9所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征 在于,所述的步驟(4347)之后還包括以下處理步驟(a)循環(huán)為獲取到的后續(xù)節(jié)點(diǎn)產(chǎn)生遷移類型的指令,并追加到當(dāng)前上下文的執(zhí)行隊(duì)列當(dāng)中。
11.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征 在于,所述的單元調(diào)度器執(zhí)行自己的傳送過程,包括以下步驟(4351)所述的單元調(diào)度器從節(jié)點(diǎn)注冊(cè)器獲取適合于當(dāng)前處理指令的節(jié)點(diǎn)行為實(shí)現(xiàn)對(duì) 象,作為當(dāng)前節(jié)點(diǎn)行為;(4352)所述的單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象的遷移前方法,觸發(fā)對(duì)應(yīng)的用戶 定制行為;(4353)所述的單元調(diào)度器通過調(diào)用當(dāng)前節(jié)點(diǎn)行為對(duì)象遷移傳送動(dòng)作,獲取到后續(xù)節(jié)點(diǎn) 列表,并判斷是否能夠獲取到;(4354)如果否,則當(dāng)前節(jié)點(diǎn)是圖中最后一個(gè)節(jié)點(diǎn),也即結(jié)束節(jié)點(diǎn),查找該節(jié)點(diǎn)的父節(jié) 點(diǎn),且該單元調(diào)度器為父節(jié)點(diǎn)產(chǎn)生一個(gè)新的指令,加入到當(dāng)前上下文的執(zhí)行隊(duì)列當(dāng)中,指定 執(zhí)行階段為結(jié)束;(4355)如果是,則當(dāng)前節(jié)點(diǎn)是一個(gè)中間節(jié)點(diǎn),所述的單元調(diào)度器順次為后續(xù)節(jié)點(diǎn)創(chuàng)建 新的指令,加入到當(dāng)前上下文的執(zhí)行隊(duì)列當(dāng)中;(4356)所述的單元調(diào)度器記錄當(dāng)前指令處理完成的日志。
12.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征 在于,所述的節(jié)點(diǎn)行為為分階段節(jié)點(diǎn)行為,所述的單元調(diào)度器運(yùn)行自己的執(zhí)行過程,包括以 下步驟(51)所述的分階段節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到執(zhí)行 階段信息;(52)如果執(zhí)行階段是開始,則進(jìn)行開始階段操作處理;(53)如果執(zhí)行階段是指令,則進(jìn)行指令階段操作處理;(54)如果執(zhí)行階段是結(jié)束,則進(jìn)行結(jié)束階段操作處理。
13.根據(jù)權(quán)利要求12所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征 在于,所述的進(jìn)行開始階段操作處理,包括以下步驟(521)所述的分階段節(jié)點(diǎn)行為設(shè)定指令上下文ExecutionContext的繼續(xù)運(yùn)行屬性為真;(522)所述的分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)開始動(dòng)作;(523)所述的單元調(diào)度器判斷是否繼續(xù);(524)如果是,則設(shè)定下一個(gè)命令為執(zhí)行,并繼續(xù)回到開始的判斷;如果否,則退出。
14.根據(jù)權(quán)利要求12所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征 在于,所述的進(jìn)行指令階段操作處理,包括以下步驟(531)所述的分階段節(jié)點(diǎn)行為設(shè)定指令上下文ExecutionContext繼續(xù)運(yùn)行屬性為真;(532)所述的分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)執(zhí)行動(dòng)作;(533)所述的單元調(diào)度器判斷是否繼續(xù);(534)如果是,則設(shè)定下一個(gè)命令為結(jié)束,繼續(xù)回到開始的判斷;如果否,則退出。
15.根據(jù)權(quán)利要求12所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征 在于,所述的結(jié)束階段操作處理,包括以下步驟(541)所述的分階段節(jié)點(diǎn)行為設(shè)定指令上下文ExecutionContext繼續(xù)運(yùn)行屬性為真;(542)所述的分階段節(jié)點(diǎn)行為調(diào)用節(jié)點(diǎn)完成動(dòng)作;(543)結(jié)束階段處理完畢,退出執(zhí)行。
16.根據(jù)權(quán)利要求12所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征 在于,所述的節(jié)點(diǎn)行為為塊節(jié)點(diǎn)行為,所述的塊節(jié)點(diǎn)行為的父類為分階段節(jié)點(diǎn)行為,所述的 單元調(diào)度器運(yùn)行自己的執(zhí)行過程,包括以下步驟(61)所述的塊節(jié)點(diǎn)行為調(diào)用分階段節(jié)點(diǎn)行為的步驟(51)至(54);(62)所述的塊節(jié)點(diǎn)行為從當(dāng)前執(zhí)行上下文中獲取到當(dāng)前執(zhí)行單元,并獲取到執(zhí)行階段 fn息;(63)如果該執(zhí)行階段信息不是執(zhí)行,則直接退出;(64)如果該執(zhí)行階段信息是執(zhí)行,則所述的塊節(jié)點(diǎn)行為獲取已經(jīng)設(shè)定的開始節(jié)點(diǎn);(65)所述的塊節(jié)點(diǎn)行為對(duì)獲取到的開始節(jié)點(diǎn)創(chuàng)建新的執(zhí)行單元指令;(66)所述的塊節(jié)點(diǎn)行為把新創(chuàng)建的指令加入到當(dāng)前執(zhí)行上下文的執(zhí)行隊(duì)列當(dāng)中,并完成。
17.根據(jù)權(quán)利要求3所述的實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法,其特征 在于,所述的外觀控制器調(diào)用核心調(diào)度器的停止動(dòng)作,包括以下步驟(321)所述的核心調(diào)度器給核心調(diào)度線程池發(fā)送中斷信號(hào),停止各線程工作;(322)所述的核心調(diào)度器銷毀該核心調(diào)度線程池對(duì)象。
全文摘要
本發(fā)明涉及一種實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng),其中包括外觀控制器、上下文容器、節(jié)點(diǎn)行為注冊(cè)器、核心調(diào)度器和單元調(diào)度器,核心調(diào)度器分別與外觀控制器和上下文容器連接,單元調(diào)度器分別與上下文容器、節(jié)點(diǎn)行為注冊(cè)器、核心調(diào)度器連接。本發(fā)明還涉及一種基于該系統(tǒng)實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)的方法。采用該種實(shí)現(xiàn)支持多種流程運(yùn)行的圖形執(zhí)行虛擬機(jī)系統(tǒng)及方法,有助于快速開發(fā)出穩(wěn)定可靠的流程引擎產(chǎn)品,提高了軟件重用度,節(jié)省了工作量,降低了模塊耦合度,提高并行開發(fā)能力,提高了流程引擎的擴(kuò)展性,有效避免了少量變動(dòng)引起流程引擎的不穩(wěn)定,提高了流程引擎的穩(wěn)定性和易維護(hù)性,降低了維護(hù)成本,適用范圍較為廣泛。
文檔編號(hào)G06F9/455GK101996091SQ20101053322
公開日2011年3月30日 申請(qǐng)日期2010年11月4日 優(yōu)先權(quán)日2010年11月4日
發(fā)明者劉航 申請(qǐng)人:上海普元信息技術(shù)股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
五常市| 清原| 曲麻莱县| 博湖县| 洛南县| 长武县| 沈丘县| 磐石市| 武鸣县| 封开县| 柞水县| 年辖:市辖区| 扶余县| 黄骅市| 抚远县| 台东市| 高台县| 炉霍县| 遂昌县| 周宁县| 安达市| 营山县| 抚顺县| 大理市| 阿巴嘎旗| 乐亭县| 高邮市| 丹阳市| 伊川县| 桐城市| 海淀区| 罗江县| 朝阳县| 西乌珠穆沁旗| 济南市| 北宁市| 武强县| 阳城县| 晋州市| 台东县| 长岛县|