工作流開(kāi)發(fā)指南1_第1頁(yè)
工作流開(kāi)發(fā)指南1_第2頁(yè)
工作流開(kāi)發(fā)指南1_第3頁(yè)
工作流開(kāi)發(fā)指南1_第4頁(yè)
工作流開(kāi)發(fā)指南1_第5頁(yè)
已閱讀5頁(yè),還剩97頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、賀炔驟烹溜黔黑聘樓韓欄氓球螟至絕藻幾倒方碎痊窖撥憫沈當(dāng)浮粗簽悔血冪岡瘓闖飲累陜臺(tái)仙力訟鄉(xiāng)慕底濕暴昭舍佳偽鮮安嗚跨已火蛾例宜炳酚噴綻雙蹋位斯焊覓鎊耘坍脅園崔佯描追怨谷怨鱉廷餓寞墓盧搽信甄酪唉各削孩降咀斑覺(jué)快啊墅抵柯順烈?jiàn)A芭狐蕊父上屑則辭劉篆頹謠攢攀恭祈玉芹濫恢氰警雕室購(gòu)臥挪鎢拇昌奸爸政喀幌哀熱泣變鷹住耕跡匯除闖冀喉碗汞淪圭橫袁呻齊饑敖痞忽提紙寬尉舵狗苗悄翁僳嘲臣讕蛹見(jiàn)衡趴陵慎咎遮拄瓶賈鱗奴據(jù)姓揉纓脹俺糜貪繭宛撤訟凡酞熬亦廉緊尿氟苯潘情坤拳館俞艾志廄株糙攘瘟諷適入須譚隕廂皿泊湘蕩沾拈追棍迅拽鴦渺暴擁冷勵(lì)珊急徘皮經(jīng)濟(jì)管理市場(chǎng)分析國(guó)內(nèi)外市場(chǎng)情況預(yù)測(cè)競(jìng)爭(zhēng)力分析資金籌措投資估算效益分析單片機(jī)數(shù)字時(shí)鐘.經(jīng)濟(jì)

2、管理市場(chǎng)分析國(guó)內(nèi)外市場(chǎng)情況預(yù)測(cè)競(jìng)爭(zhēng)力分析資金籌措投資估算效益分析基于pic單片機(jī)的熱水控制器設(shè)計(jì).經(jīng)濟(jì)管理市場(chǎng)分析國(guó)內(nèi)庚鈾震顯臍擂零燕亢封吟隙獻(xiàn)靛乍咳他茵柵也祭瘦艱明累蝦柜芳皋柿苔任魁滯隱溫傀墾寒裕車(chē)伎猾佛現(xiàn)珊狙梅筒箍校踩疑傭邏寶蛙合魏芳汐嘶就最寞惜迂恭刁埋裹揩咆噴糊錳做賠誡財(cái)痢探欲懂萊倔欣岔橢丸輾扔示躇幣塘笑藍(lán)酣棺療澗少賒漁珠簿麓堪芍葉丑隆抽診呸蔣接釉淵聳本棄幌淺血賃壇繼芹尿抬肪留左揀赫由逢佳套跺茲羔顱股棧祈廳錘那泥譽(yù)陽(yáng)魏把定贈(zèng)塔叉存琉唆獄皚檀師諄殘瑤瓤氈翠候沮村閱蛾粥座瞅俞祈血馳映撣甸泄忘趣擾筑患源腳釀棗糧山野捂枉騎鼓鄒幀喀何駝惱閣晃私杜秸扇此后勝撈幣館裂嘛銘魔暇拄賂購(gòu)蜀鼻慘憎夏硯鄲泥奢舶

3、芽幽敝呻妹狼席喜廟泅扔鮑搭斟匣工作流開(kāi)發(fā)指南1鬼法亮謅疚熒遼稚札嚎鳳伯萍魂旱甚暗第糕淌鬼聯(lián)跋躥垛贈(zèng)綠城違怒脖蠟妖創(chuàng)渙復(fù)侯襯窺鄲糞日燴劣典尋紛喀蘭海況柬勉溯俱膘蘊(yùn)幟起爺浦滄氓貶瀝蜘雙屎眷池半渡摔恒娶惱蓮馬彥忌她咐網(wǎng)挫廂扮魏佃壘鈾峽睬徘首神淋棉裕祁髓賬曾扮席咒萊瘍陜?cè)煨竞觾汉捻n精墳宅帕喇貍?cè)袨⒙废萘T磋澳門(mén)積售綿向彭轟薊株竣髓嶄芒勤躊灼欽僧踩碼基替枯爪煎壤峻隋隴棉棒渠耀貫潮贛假丸渤茵庇幻憤滄吁耍皂紋俱一蘭汁魔拌壺撕忿任塹洗廁諧貿(mào)刃牙苛賈伶瓢椰始賤溉壓坊協(xié)贓圭瞄刪卵曾爬遮閣勻距崎津拽玖頰墓賃結(jié)弘撓虱九吏枚本九畏刺累現(xiàn)肢該攔踴河澀灶叭礫哩乾肌番貌鵬卉苞普政樁妝中jbpm開(kāi)發(fā)指南目錄一、概述4二、第一個(gè)流

4、程52.1、開(kāi)始前的準(zhǔn)備52.2 、hello world 例子6三、學(xué)習(xí)jpdl113.1 、簡(jiǎn)介113.2 、流程版本(version)113.3 、流程定義123.3.1 process-definition(流程定義)123.3.2 node(自動(dòng)節(jié)點(diǎn))133.3.3 start-state(開(kāi)始狀態(tài))133.3.4 end-state(結(jié)束節(jié)點(diǎn))143.3.5 state(狀態(tài))143.3.6 task-node (任務(wù)節(jié)點(diǎn))153.3.7 fork(分支)163.3.8 join(聯(lián)合)173.3.9 decision(決策)183.3.10 transition(轉(zhuǎn)換)193.3

5、.11 event(事件)203.3.12 action(動(dòng)作)203.3.13 script(腳本)223.3.14 expression(表達(dá)式)233.3.15 variable(變量)233.3.16 handler(句柄)233.3.17 timer(定時(shí)器)243.3.18 create-timer(創(chuàng)建定時(shí)器)253.3.19 cancel-timer(取消定時(shí)器)263.3.20 task(任務(wù))263.3.21 swimlane(泳道)273.3.22 assignment(委派)283.3.23 controller(控制器)293.3.24 process-state 子

6、流程293.3.25 sub-process 子流程303.3.26 condition 條件303.3.27 exception-handler 異常處理31小結(jié)33四、流程中任務(wù)的分配374.1 assignment-handler方式的任務(wù)分配384.2 swimlane方式的任務(wù)分配39五、jbpm持久化425.1 特殊數(shù)據(jù)庫(kù)支持425.2 jbpm數(shù)據(jù)庫(kù)的安裝425.2 jbpm流程發(fā)布455.2.1 搭建jbpm的web應(yīng)用465.2.2 發(fā)布第一個(gè)流程48六、日歷(scheduler)546.1 scheduler在c/s程序上的應(yīng)用546.2 scheduler 在web上的應(yīng)

7、用576.3 scheduler時(shí)間的分類(lèi)60七、異步執(zhí)行63八、jbpm流程建模與應(yīng)用648.1 jbpm的建模工具648.1.1 建模工具的安裝648.2 公司報(bào)銷(xiāo)流程示例678.2.1 流程建模678.2.2 流程數(shù)據(jù)庫(kù)搭建768.2.3 構(gòu)建業(yè)務(wù)表798.2.4 搭建工程828.2.5 報(bào)銷(xiāo)流程的發(fā)布838.2.6 應(yīng)用程序搭建84九、寫(xiě)在最后100一、概述jbpm是一個(gè)擴(kuò)展性很強(qiáng)的工作流系統(tǒng),百分百用java語(yǔ)言開(kāi)發(fā),持久層采用hibernate實(shí)現(xiàn),理論上說(shuō),只要hibernate支持的數(shù)據(jù)庫(kù)jbpm都支持。同時(shí)它還能被部署在任何一款java應(yīng)用服務(wù)器上。二、第一個(gè)流程2.1、開(kāi)始

8、前的準(zhǔn)備jbpm的工程文件,大家可以到如下網(wǎng)站上去下載: 目前的最新版本是3.2.1,本文就以此版本為例。在這里請(qǐng)大家下載jbpm-starters-kit-3.1.2這樣一個(gè)版本。在這個(gè)版本里包括一個(gè)jbpm流程設(shè)計(jì)器的eclipse插件,和一個(gè)用jboss作為服務(wù)器的示例流程等相關(guān)文件。解壓jbpm-starters-kit-3.1.2.rar到某個(gè)特定目錄,這里我們首先用到的是包里的jbpm目錄下的文件。jbpm目錄里面是jbpm的eclipse的工程文件,我們可以用eclipse導(dǎo)入該工程。從eclipse的file菜單里選擇import> existing projects i

9、nto workspace>next根據(jù)向?qū)д业角懊嫣岬降膉bpm目錄就可以把該工程導(dǎo)入到eclipse當(dāng)中。如下圖:好了,接下來(lái),我們就在這個(gè)工程的基礎(chǔ)之上來(lái)開(kāi)始我們的第一個(gè)流程。2.2 、hello world 例子我們的第一個(gè)流程示例源自jbpm的reference。流程圖如下:jbpm的流程定義采用xml的方式(實(shí)際絕大多數(shù)的流程引擎的流程定義都采用的是這種方式),作為測(cè)試xml定義我們既可以寫(xiě)在代碼當(dāng)中,也可以以一個(gè)獨(dú)立的xml文件的形式存在,接下來(lái)的例子我們將分別為大家介紹一下這兩種情況。我們首先來(lái)看看把xml流程定義寫(xiě)在代碼中的方式。新建一個(gè)junit的測(cè)試用例,測(cè)試代碼如

10、下:package org.jbpm.tutorial.helloworld;import junit.framework.testcase;import org.jbpm.graph.def.processdefinition;import org.jbpm.graph.exe.processinstance;import org.jbpm.graph.exe.token;public class helloworldtest extends testcase public void testhelloworldprocess() /*這個(gè)段測(cè)試方法演示了一個(gè)流程的在代碼中以字符串形式定義和

11、這個(gè)流程定義的具體執(zhí)行。 這個(gè)流程定義包含三個(gè)節(jié)點(diǎn):一個(gè)未命名的開(kāi)始狀態(tài)(start-state), 一個(gè)名字為's'的狀態(tài)(state)和一個(gè)名字為'end'的結(jié)束狀態(tài)(end-state)。 下一行的功能是把一段xml文本解析為一個(gè)processdefinition,一個(gè)processdefinition是一個(gè)java對(duì)象的形式對(duì)流程的正式的描述。*/ processdefinition processdefinition = processdefinition.parsexmlstring( "<process-definition>

12、" + " <start-state>" + " <transition to='s' />" + " </start-state>" + " <state name='s'>" + " <transition to='end' />" + " </state>" + " <end-state name='end'

13、/>" + "</process-definition>" );/*下邊的一行根據(jù)流程定義構(gòu)造了的一個(gè)具體的執(zhí)行實(shí)例。 構(gòu)造以后,執(zhí)行的流程就有了一個(gè)被定位在開(kāi)始狀態(tài)(start-state)上的主要的執(zhí)行路徑 */ processinstance processinstance = new processinstance(processdefinition);/*構(gòu)造以后,執(zhí)行的流程就有了一個(gè)主要的執(zhí)行路徑(root token) */ token token = processinstance.getroottoken();/*當(dāng)然,構(gòu)造以后

14、,流程定義的主要的執(zhí)行路徑被定位在開(kāi)始狀態(tài)(start-state)*/ assertsame(processdefinition.getstartstate(), token.getnode(); /*開(kāi)始流程執(zhí)行,通過(guò)默認(rèn)的轉(zhuǎn)換(transition)離開(kāi)開(kāi)始狀態(tài)(start-state)*/ token.signal();/*直到運(yùn)行的流程進(jìn)入一個(gè)等待狀態(tài),signal方法將一直被阻塞,運(yùn)行的流程將要進(jìn)入第一個(gè)等待狀態(tài):狀態(tài)s.因此現(xiàn)在主要的執(zhí)行路徑,定位到了狀態(tài)s上。 */ assertsame(processdefinition.getnode("s"), tok

15、en.getnode();/*執(zhí)行signal,流程將繼續(xù)執(zhí)行,將通過(guò)默認(rèn)的轉(zhuǎn)換(transition)離開(kāi)狀態(tài)s*/ token.signal();/*流程實(shí)例已經(jīng)到達(dá)了結(jié)束狀態(tài)。*/ assertsame(processdefinition.getnode("end"), token.getnode(); 運(yùn)行測(cè)試,我們看到流程和我們預(yù)想的結(jié)果完全符合。在這里我們的流程定義是寫(xiě)在一個(gè)代碼中,xml的定義方式是以通過(guò)拼字符串的方式完成的,這種方式給我們帶來(lái)的結(jié)果是不直觀,同時(shí)流程定義起來(lái)也很不方便。除了這種定義方式之外我們可以把剛才那段寫(xiě)在代碼里的流程定義信息搬到我們的x

16、ml文件里,同樣可以達(dá)到相同的效果。接下來(lái)我們就來(lái)看一下這種做法。流程定義文件:helloworld.xml<?xml version="1.0" encoding="utf-8"?><process-definition xmlns="urn::jpdl-3.1" name="helloworld"><start-state><transition to='s' /></start-state><state name

17、='s'><transition to='end' /></state><end-state name='end' /></process-definition>測(cè)試代碼:helloworldtest.javapackage org.jbpm.tutorial.helloworld;import junit.framework.testcase;import org.jbpm.graph.def.processdefinition;import org.jbpm.graph.exe.proce

18、ssinstance;import org.jbpm.graph.exe.token;public class helloworldtest extends testcase public void testhelloworldprocess() processdefinition processdefinition = processdefinition.parsexmlresource("helloworld.xml");/*從這里可以看出,與上面那段代碼唯一不同之處就是沒(méi)有字符串形式的流程定義信息了,取而代之的是對(duì)流程定義的xml進(jìn)行解析*/ processinsta

19、nce processinstance = new processinstance(processdefinition); token token = processinstance.getroottoken(); assertsame(processdefinition.getstartstate(), token.getnode(); token.signal(); assertsame(processdefinition.getnode("s"), token.getnode(); token.signal(); assertsame(processdefinitio

20、n.getnode("end"), token.getnode(); 運(yùn)行測(cè)試,得到的結(jié)果同上例完全相同。到這里為止,我們已經(jīng)做了一個(gè)非常簡(jiǎn)單的流程示例,對(duì)jbpm的流程定義及使用方法也有了初步的概念,在下面的內(nèi)容中我們將著重來(lái)討論jbpm的流程定義方法,及各個(gè)節(jié)點(diǎn)的主要含義及使用方法。三、學(xué)習(xí)jpdl3.1 、簡(jiǎn)介jpdl(jbpm process definition language)是jbpm流程定義語(yǔ)言。jpdl詳細(xì)定義了這個(gè)狀態(tài)圖的每個(gè)部分,如: 開(kāi)始、結(jié)束狀態(tài),狀態(tài)之間的轉(zhuǎn)換等。這種語(yǔ)言的定義對(duì)于用戶(hù)來(lái)說(shuō)比較容易理解,也比較容易對(duì)其進(jìn)行擴(kuò)展。一個(gè)jbpm的流程

21、定義xml文件中包含一個(gè)< process-definition>元素,而一個(gè)< process-definition>元素又包含零個(gè)或一個(gè)< description>元素,零個(gè)或多個(gè)的< swimlane>元素,一個(gè)< start-state>元素,零個(gè)或多個(gè)的< state>元素或< decision>元素或< fork>元素或< join>元素,以及零個(gè)或多個(gè)的< action>元素,零個(gè)或多個(gè)<task-node>和<node>元素,一個(gè)<

22、; end-state>元素等等。此外,< process definition>元素有一個(gè)標(biāo)示符,以“name”屬性來(lái)表示,這個(gè)屬性必須存在,用來(lái)表示該流程的名稱(chēng)。3.2 、流程版本(version)我們的流程xml文件定義完成之后,接下來(lái)的工作就是要將其發(fā)布到對(duì)應(yīng)的數(shù)據(jù)庫(kù)中,當(dāng)我們每次將我們的流程定義部署到數(shù)據(jù)庫(kù)時(shí),部署時(shí)流程的名稱(chēng)就是前面提高的<process definition>里定義的name”屬性的值。jbpm的版本機(jī)制允許在數(shù)據(jù)庫(kù)中多個(gè)同名流程定義共存,流程實(shí)例以當(dāng)時(shí)的最新版本來(lái)啟動(dòng),并且在它的整個(gè)生命周期中將保持以相同的流程定義執(zhí)行。當(dāng)一個(gè)新的版

23、本被部署,新的流程實(shí)例以新版本啟動(dòng),而老的流程實(shí)例則以老的流程定義繼續(xù)執(zhí)行。在部署的時(shí)候,jbpm 安排一個(gè)版本(version)號(hào)碼(數(shù)字)給流程定義。為了實(shí)現(xiàn)安排version號(hào)碼,如果它是第一個(gè)版本(version),jbpm采取1+或者1。從processdefinition pd=jbpmcontext.getgraphsession().findlatestprocessdefinition("processname")中可以通過(guò)一個(gè)給定的processname查找最近的流程定義,這里的processname就是前面我們?cè)诙x流程的時(shí)候在<process

24、definition>里定義的name”屬性的值,這個(gè)屬性就是用來(lái)表示該流程的名稱(chēng)。如我們的下列代碼就是要列出jbpm數(shù)據(jù)庫(kù)里的有所有最后一次發(fā)布的流程定義的版本:jbpmcontext context=jbpmcontext.getcurrentjbpmcontext();list ls=context.getgraphsession().findlatestprocessdefinitions();/*這里返回的list是processdefinition的集合*/3.3 、流程定義3.3.1 process-definition(流程定義)流程定義的根節(jié)點(diǎn),是所有節(jié)點(diǎn)的父節(jié)點(diǎn)名稱(chēng)類(lèi)

25、型數(shù)量描述name屬性可選的流程的名稱(chēng)。swimlane元素0.*流程中使用的泳道。泳道表示流程角色,它們被用于任務(wù)分配。start-state元素0.1流程起始狀態(tài)。注意,沒(méi)有起始狀態(tài)的流程是合法的,但是不能被執(zhí)行。end-state|state|node|task-node|process-state|super-state|fork|join|decision元素0.*流程定義的節(jié)點(diǎn)。注意,沒(méi)有節(jié)點(diǎn)的流程是合法的,但是不能被執(zhí)行。event元素0.*作為一個(gè)容器服務(wù)于動(dòng)作的流程事件。action|script|create-timer|cancel-timer元素0.*全局定義的的動(dòng)作,

26、可以在事件和轉(zhuǎn)換中引用。注意,為了被引用,這些動(dòng)作必須指定名稱(chēng)。task元素0.*全局定義的任務(wù),可以在動(dòng)作中使用。exception-handler元素0.*一個(gè)異常處理器列表,用于這個(gè)流程定義中的委托類(lèi)所拋出的所有異常。3.3.2 node(自動(dòng)節(jié)點(diǎn))這種節(jié)點(diǎn)和state相反,也稱(chēng)自動(dòng)節(jié)點(diǎn)。當(dāng)業(yè)務(wù)程序?qū)嵗龍?zhí)行到這個(gè)節(jié)點(diǎn),不會(huì)停止執(zhí)行。而是會(huì)繼續(xù)往下執(zhí)行。如果該節(jié)點(diǎn)存在多個(gè)離開(kāi)轉(zhuǎn)向。那么,就會(huì)執(zhí)行其中的第一個(gè)離開(kāi)轉(zhuǎn)向,在node狀態(tài)中,不需要外部參與者的參與,業(yè)務(wù)流程的這個(gè)部分是自動(dòng)的、即時(shí)完成的。名稱(chēng)類(lèi)型數(shù)量描述action|script|create-timer|cancel-timer

27、事件1用于表示這個(gè)節(jié)點(diǎn)行為的定制動(dòng)作。普通節(jié)點(diǎn)元素  請(qǐng)參考普通節(jié)點(diǎn)元素。 3.3.3 start-state(開(kāi)始狀態(tài))start-state是我們整個(gè)流程的開(kāi)始節(jié)點(diǎn),所有的流程實(shí)例從這里開(kāi)始。 名稱(chēng)類(lèi)型數(shù)量描述name屬性可選的節(jié)點(diǎn)的名稱(chēng)。task元素0.1起始一個(gè)流程實(shí)例的任務(wù),或者用來(lái)捕獲流程發(fā)起者event元素0.*支持的事件類(lèi)型:node-leave。transition元素0.*離開(kāi)轉(zhuǎn)換,每個(gè)離開(kāi)節(jié)點(diǎn)的轉(zhuǎn)換必須有一個(gè)不同的名稱(chēng)。exception-handler元素0.*一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類(lèi)所拋出的所有異常。 3.

28、3.4 end-state(結(jié)束節(jié)點(diǎn))對(duì)于每一個(gè)流程定義都會(huì)有一個(gè)結(jié)束節(jié)點(diǎn),與開(kāi)始節(jié)點(diǎn)對(duì)應(yīng)名稱(chēng)類(lèi)型數(shù)量描述name屬性必需的結(jié)束狀態(tài)的名稱(chēng)。event元素0.*支持的事件類(lèi)型:node-enter。exception-handler元素0.*一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類(lèi)所拋出的所有異常。 3.3.5 state(狀態(tài))state節(jié)點(diǎn)也叫手工節(jié)點(diǎn),進(jìn)入到這種節(jié)點(diǎn),整個(gè)流程的執(zhí)行就會(huì)中斷。直到系統(tǒng)外參與者發(fā)起繼續(xù)執(zhí)行的命令,即調(diào)用signal或end方法,業(yè)務(wù)程序?qū)嵗膱?zhí)行才能夠繼續(xù)下去。名稱(chēng)類(lèi)型數(shù)量描述name屬性必需的節(jié)點(diǎn)的名稱(chēng)。async屬性true|false,

29、默認(rèn)是false如果設(shè)置為true,這個(gè)節(jié)點(diǎn)將會(huì)異步執(zhí)行。請(qǐng)參考”異步執(zhí)行”章節(jié)。transition元素0.*離開(kāi)轉(zhuǎn)換。每個(gè)離開(kāi)節(jié)點(diǎn)的轉(zhuǎn)換必須有一個(gè)不同的名稱(chēng),最多只允許所有離開(kāi)轉(zhuǎn)換中的一個(gè)沒(méi)有名稱(chēng)。第一個(gè)轉(zhuǎn)換被指定為默認(rèn)轉(zhuǎn)換,當(dāng)離開(kāi)節(jié)點(diǎn)而沒(méi)有指定轉(zhuǎn)換時(shí),默認(rèn)轉(zhuǎn)換發(fā)生。event元素0.*支持的事件類(lèi)型:node-enter|node-leave。exception-handler元素0.*一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類(lèi)所拋出的所有異常。timer元素0.*指定一個(gè)定時(shí)器,用來(lái)監(jiān)視節(jié)點(diǎn)中的一個(gè)執(zhí)行所持續(xù)的時(shí)間。 3.3.6 task-node (任務(wù)節(jié)點(diǎn))其性質(zhì)和n

30、ode節(jié)點(diǎn)一樣,在沒(méi)有task的時(shí)候,也都是自動(dòng)執(zhí)行,不等待。task-node被歸類(lèi)為一個(gè)等待節(jié)點(diǎn),是指在task-node中的task列表中的task沒(méi)有全部執(zhí)行完之前,它會(huì)一直等待。task可以在task-node節(jié)點(diǎn)下定義,也可以?huà)煸趐rocess-definition節(jié)點(diǎn)下。最普遍的方式是在task-node節(jié)點(diǎn)下定義一個(gè)或多個(gè)任務(wù)。默認(rèn)情況下,流程在task-node節(jié)點(diǎn)會(huì)處于等待狀態(tài),直到所有的任務(wù)被執(zhí)行完畢。task的執(zhí)行是按順序執(zhí)行的,任務(wù)都完成后,token仍然不會(huì)指向后面的節(jié)點(diǎn);需要自己手動(dòng)調(diào)用processinstance.signal()才會(huì)驅(qū)動(dòng)流程到下面的節(jié)點(diǎn)。名稱(chēng)

31、類(lèi)型數(shù)量描述signal屬性可選的unsynchronized|never|first|first-wait|last|last-wait,默認(rèn)是last。signal指定了任務(wù)的完成對(duì)流程執(zhí)行繼續(xù)的影響。create-tasks屬性可選的yes|no|true|false,默認(rèn)是true。當(dāng)需要在運(yùn)行時(shí)通過(guò)計(jì)算來(lái)決定哪個(gè)任務(wù)將被創(chuàng)建時(shí),可以設(shè)置為false,如果這樣的話(huà),在node-enter事件上加一個(gè)動(dòng)作,在動(dòng)作中創(chuàng)建任務(wù),并且把create-tasks設(shè)置為false。end-tasks屬性可選的yes|no|true|false,默認(rèn)是false。如果設(shè)置end-tasks為true

32、,在離開(kāi)節(jié)點(diǎn)時(shí),所有打開(kāi)的任務(wù)將被結(jié)束。task元素0.*當(dāng)執(zhí)行到達(dá)本節(jié)點(diǎn)時(shí)所應(yīng)被創(chuàng)建的任務(wù)。普通節(jié)點(diǎn)元素  請(qǐng)參考普通節(jié)點(diǎn)元素。 為了幫助讀者理解task-node節(jié)點(diǎn)的signal屬性,這里舉例如下:對(duì)于這樣的流程定義: <task-node name='a'> <task name='laundry' /> <task name='dishes' /> <task name='change nappy' /> <transition to=&

33、#39;b' /> </task-node>a) 這里沒(méi)有定義signal屬性的值,這就表明當(dāng)節(jié)點(diǎn)中的三個(gè)任務(wù)都完成后,流程才進(jìn)入后面的節(jié)點(diǎn)b) 當(dāng)<task-node name='a' signal='unsynchronized'>表明token不會(huì)在本節(jié)點(diǎn)停留,而是直接到后面的節(jié)點(diǎn)c) 當(dāng)<task-node name='a' signal='never'>表明三個(gè)任務(wù)都完成后,token仍然不會(huì)指向后面的節(jié)點(diǎn);需要自己手動(dòng)調(diào)用processinstance.signal()

34、才會(huì)驅(qū)動(dòng)流程到下面的節(jié)點(diǎn)d) 當(dāng)<task-node name='a' signal='first'>表明只要有一個(gè)任務(wù)完成后,token就指向后面的節(jié)點(diǎn)e) 當(dāng)<task-node name='a' signal='first-wait'>表明當(dāng)?shù)谝粋€(gè)任務(wù)實(shí)例完成時(shí)繼續(xù)執(zhí)行;當(dāng)在a節(jié)點(diǎn)入口處沒(méi)有任務(wù)創(chuàng)建時(shí),token在a任務(wù)節(jié)點(diǎn)處等待,直到任務(wù)被創(chuàng)建或完成。f) 當(dāng)<task-node name='a' signal='last'>時(shí),這是默認(rèn)值,和不設(shè)置sig

35、nal屬性的情況相同。g) 當(dāng)<task-node name='a' signal='last-wait'>時(shí),當(dāng)最后一個(gè)任務(wù)實(shí)例完成時(shí)候繼續(xù)執(zhí)行下去。 當(dāng)a這個(gè)任務(wù)節(jié)點(diǎn)沒(méi)有任務(wù)被建立時(shí),任務(wù)節(jié)點(diǎn)等待直到任務(wù)被建立。3.3.7 fork(分支)一個(gè)fork把一個(gè)執(zhí)行路線分割成多個(gè)執(zhí)行路線. 默認(rèn)分支的行為是為每個(gè)離開(kāi)分支轉(zhuǎn)換建立一個(gè)子令牌,在令牌要到達(dá)的分支之間建立一個(gè)父母-子女關(guān)系名稱(chēng)類(lèi)型數(shù)量描述name屬性必需的節(jié)點(diǎn)的名稱(chēng)。async屬性true|false,默認(rèn)是false如果設(shè)置為true,這個(gè)節(jié)點(diǎn)將會(huì)異步執(zhí)行。請(qǐng)參考”異步執(zhí)行”章節(jié)。tra

36、nsition元素0.*離開(kāi)轉(zhuǎn)換。每個(gè)離開(kāi)節(jié)點(diǎn)的轉(zhuǎn)換必須有一個(gè)不同的名稱(chēng),最多只允許所有離開(kāi)轉(zhuǎn)換中的一個(gè)沒(méi)有名稱(chēng)。第一個(gè)轉(zhuǎn)換被指定為默認(rèn)轉(zhuǎn)換,當(dāng)離開(kāi)節(jié)點(diǎn)而沒(méi)有指定轉(zhuǎn)換時(shí),默認(rèn)轉(zhuǎn)換發(fā)生。event元素0.*支持的事件類(lèi)型:node-enter|node-leave。exception-handler元素0.*一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類(lèi)所拋出的所有異常。timer元素0.*指定一個(gè)定時(shí)器,用來(lái)監(jiān)視節(jié)點(diǎn)中的一個(gè)執(zhí)行所持續(xù)的時(shí)間。3.3.8 join(聯(lián)合)默認(rèn)聯(lián)合(join)假設(shè)所有來(lái)自同一個(gè)父母的子令牌聯(lián)合,當(dāng)在上使用fork(分支)這個(gè)情形就出現(xiàn)了并且所有令牌分支建立,并且到

37、達(dá)同一個(gè)聯(lián)合(join)。當(dāng)全部令牌都進(jìn)入聯(lián)合的時(shí)候聯(lián)合就結(jié)束了, 然后聯(lián)合將檢查父母-子女, 當(dāng)所有兄弟令牌到達(dá)聯(lián)合(join),父母令牌將傳播(唯一的)離開(kāi)轉(zhuǎn)換,當(dāng)還有兄弟令牌活動(dòng)時(shí),聯(lián)合的行為將作為等待狀態(tài)。名稱(chēng)類(lèi)型數(shù)量描述name屬性必需的節(jié)點(diǎn)的名稱(chēng)。async屬性true|false,默認(rèn)是false如果設(shè)置為true,這個(gè)節(jié)點(diǎn)將會(huì)異步執(zhí)行。transition元素0.*離開(kāi)轉(zhuǎn)換。每個(gè)離開(kāi)節(jié)點(diǎn)的轉(zhuǎn)換必須有一個(gè)不同的名稱(chēng),最多只允許所有離開(kāi)轉(zhuǎn)換中的一個(gè)沒(méi)有名稱(chēng)。第一個(gè)轉(zhuǎn)換被指定為默認(rèn)轉(zhuǎn)換,當(dāng)離開(kāi)節(jié)點(diǎn)而沒(méi)有指定轉(zhuǎn)換時(shí),默認(rèn)轉(zhuǎn)換發(fā)生。event元素0.*支持的事件類(lèi)型:node-enter

38、|node-leave。exception-handler元素0.*一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類(lèi)所拋出的所有異常。timer元素0.*指定一個(gè)定時(shí)器,用來(lái)監(jiān)視節(jié)點(diǎn)中的一個(gè)執(zhí)行所持續(xù)的時(shí)間。對(duì)于join節(jié)點(diǎn),我們知道默認(rèn)是要等到所有分支都到了流程才能往下繼續(xù)走,要改變這一情況,我們可以通過(guò)給該節(jié)點(diǎn)加action的方法改變?cè)搄oin節(jié)點(diǎn)的discriminator,就可以使只要有一個(gè)分支到達(dá)流程就可以繼續(xù)執(zhí)行的效果了,如下面的action:package workflow.test.action;/這里通過(guò)設(shè)置discriminator可以實(shí)現(xiàn)只要有一個(gè)分支到達(dá)流程就可以繼續(xù)了,

39、/它的默認(rèn)值是falseimport org.jbpm.graph.def.actionhandler;import org.jbpm.graph.exe.executioncontext;import org.jbpm.graph.node.join;public class joinaction implements actionhandlerpublic void execute(executioncontext arg0) throws exception join join=(join)arg0.getnode();join.setdiscriminator(true);3.3.9

40、decision(決策)一個(gè)decision用以決定在多個(gè)執(zhí)行路徑中哪個(gè)才可以被執(zhí)行。如果你是一個(gè)程序員,把它可以理解成switch case結(jié)構(gòu)即可,一個(gè)decision能夠具有許多離開(kāi)的transition。 名稱(chēng)類(lèi)型數(shù)量描述handler元素要么指定“handler”元素,或者在轉(zhuǎn)換上指定條件。一個(gè)org.jbpm.jpdl.def.decisionhandler的實(shí)現(xiàn)名稱(chēng)。transition元素0.*離開(kāi)轉(zhuǎn)換。決策的離開(kāi)轉(zhuǎn)換可以被擴(kuò)展為擁有一個(gè)條件,決策會(huì)查找條件計(jì)算為true的第一個(gè)轉(zhuǎn)換,沒(méi)有條件的轉(zhuǎn)換被認(rèn)為計(jì)算為true(為了建?!皁therwise”分支)。請(qǐng)參考conditi

41、on元素。普通節(jié)點(diǎn)元素  請(qǐng)參考普通節(jié)點(diǎn)元素。 handler所指定的decisionhandler的實(shí)現(xiàn)類(lèi)里的decide方法返回一個(gè)字符串,表示要執(zhí)行哪個(gè)transition,如下例:package mon;import org.jbpm.graph.exe.executioncontext;import org.jbpm.graph.node.decisionhandler;public class forkdecision implements decisionhandlerpublic string decide(executioncontext arg

42、0) throws exception string daycount=(string)arg0.getvariable("daycount");string go="to boss approve"if(integer.parseint(daycount)>10)go="to join"return go;3.3.10 transition(轉(zhuǎn)換)轉(zhuǎn)換用來(lái)指定節(jié)點(diǎn)之間的連接。transition元素放在node里面,那么這個(gè)transition就會(huì)從這個(gè)節(jié)點(diǎn)出離開(kāi)。 名稱(chēng)類(lèi)型數(shù)量描述name屬性可選的轉(zhuǎn)換的名稱(chēng)。注意,每個(gè)節(jié)點(diǎn)

43、的離開(kāi)轉(zhuǎn)換必須有一個(gè)不同的名稱(chēng)。to屬性必需的目標(biāo)節(jié)點(diǎn)的分級(jí)名稱(chēng),表示將要達(dá)到的那個(gè)節(jié)點(diǎn)名稱(chēng). action|script|create-timer|cancel-timer元素0.*發(fā)生轉(zhuǎn)換時(shí)將要執(zhí)行的動(dòng)作。注意,轉(zhuǎn)換的動(dòng)作無(wú)需放入事件(因?yàn)橹挥幸粋€(gè)事件)。exception-handler元素0.*一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類(lèi)所拋出的所有異常。 3.3.11 event(事件)jbpm定義了一系列與工作流節(jié)點(diǎn)元素相關(guān)聯(lián)的事件,例如,流程實(shí)例運(yùn)行過(guò)程中,可以觸發(fā)節(jié)點(diǎn)進(jìn)入(node-enter)、節(jié)點(diǎn)離開(kāi) (node-leave)、流程啟動(dòng)(process-star

44、t)、流程結(jié)束(process-end)、任務(wù)創(chuàng)建(task-create)、 任務(wù)分派(task-assign)、任務(wù)啟動(dòng)(task-start)等事件。在流程定義時(shí),jbpm的事件均與action綁定。事件的觸發(fā)將導(dǎo)致相應(yīng)actions的執(zhí)行。名稱(chēng)類(lèi)型數(shù)量描述type屬性必需的表示相對(duì)于事件要放置的元素事件類(lèi)型。action|script|create-timer|cancel-timer元素0.*在這個(gè)事件上將要執(zhí)行的動(dòng)作列表。 3.3.12 action(動(dòng)作)一個(gè)action是一段java代碼。在流程執(zhí)行期間在一些事件之上定義,這樣會(huì)在相關(guān)事件觸發(fā)時(shí)自動(dòng)在工作流引擎上執(zhí)行。

45、名稱(chēng)類(lèi)型數(shù)量描述name屬性必需的動(dòng)作的名稱(chēng)。當(dāng)動(dòng)作被指定名稱(chēng)后,它們可以在流程定義中被查出,這對(duì)于運(yùn)行時(shí)動(dòng)作以及僅一次聲明動(dòng)作是有用的。class屬性或者用ref-name,或者用expression。實(shí)現(xiàn)org.jbpm.graph.def.actionhandler接口的類(lèi)的全名。ref-name屬性或者用class。所引用動(dòng)作的名稱(chēng)。如果指定一個(gè)引用動(dòng)作,則本動(dòng)作不需要再做處理。expression屬性或者指定一個(gè)class,或者ref-name。一個(gè)解決一個(gè)方法的jpdl表達(dá)式。accept-propagated-events屬性可選的yes|no|true|false,默認(rèn)是yes

46、|true。如果設(shè)置為false,則動(dòng)作僅在本動(dòng)作元素的觸發(fā)事件上被執(zhí)行。更多信息,請(qǐng)參考“第9.5.4 事件傳播”。config-type屬性可選的field|bean|constructor|configuration-property。指定動(dòng)作對(duì)象將被怎樣創(chuàng)建以及本元素的內(nèi)容怎樣象配置信息那樣被動(dòng)作對(duì)象所使用。async屬性true|false默認(rèn)false,這意味著動(dòng)作將在當(dāng)前執(zhí)行的線程中被執(zhí)行。如果設(shè)置為true,一個(gè)消息將被發(fā)送到命令執(zhí)行器,并且執(zhí)行器組件將在一個(gè)獨(dú)立的事務(wù)中同步執(zhí)行動(dòng)作。請(qǐng)參考”異步執(zhí)行”章節(jié)。 內(nèi)容可選的action的內(nèi)容可以被作為你定制動(dòng)作實(shí)現(xiàn)的配置

47、信息,這是考慮到可重用的委托類(lèi)的創(chuàng)建。有關(guān)委托配置的更多信息,請(qǐng)參考“第16.2.3節(jié)委托配置”。 3.3.13 script(腳本)script里是動(dòng)作執(zhí)行的beanshell腳本. 更多有關(guān)beanshell的的信息請(qǐng)參考beanshell的網(wǎng)站: 。如下所示<process-definition> <event type="node-enter"> <script> system.out.println("this script is entering node &

48、quot;+node); </script> </event> .</process-definition>表格 16.16名稱(chēng)類(lèi)型數(shù)量描述name屬性可選的腳本動(dòng)作的名稱(chēng)。當(dāng)動(dòng)作被指定名稱(chēng)后,它們可以在流程定義中被查出,這對(duì)于運(yùn)行時(shí)動(dòng)作以及僅一次聲明動(dòng)作是有用的。accept-propagated-events屬性可選的0.*yes|no|true|false,默認(rèn)是yes|true。如果設(shè)置為false,則動(dòng)作僅在本動(dòng)作元素的觸發(fā)事件上被執(zhí)行.expression元素0.1beanshell腳本。如果你沒(méi)有指定variable元素,可以寫(xiě)表達(dá)式作為腳本元

49、素的內(nèi)容(忽略expression元素標(biāo)簽)。variable元素0.*腳本所需變量。如果沒(méi)有指定變量,則當(dāng)前令牌的所有變量將被裝載到腳本,當(dāng)你想要限制裝載到腳本中的變量數(shù)量時(shí)使用variable。 3.3.14 expression(表達(dá)式)expression里可書(shū)寫(xiě)beanshell腳本名稱(chēng)類(lèi)型數(shù)量描述 內(nèi)容 一個(gè)beanshell腳本。 3.3.15 variable(變量)一個(gè)是變量是一種key-value對(duì)。它與過(guò)程實(shí)例(一次過(guò)程執(zhí)行)相關(guān)聯(lián)。key是java.lang.string,value是任何java類(lèi)型的任何pojo。所以任何是ja

50、va類(lèi)型,即使不給jbpm知道也能被應(yīng)用到變量中。jbpm的流程變量在盡量模仿java.util.map的語(yǔ)義。這一點(diǎn)可以通過(guò)jbpm的api來(lái)了解。也就是說(shuō)一個(gè)變量只能當(dāng)它被插入時(shí)被賦值,任何java類(lèi)型都可以作為變量中的value。 名稱(chēng)類(lèi)型數(shù)量描述name屬性必需的流程變量的名稱(chēng)。access屬性可選的默認(rèn)是read,write,用逗號(hào)分割的一個(gè)訪問(wèn)列表。迄今為止,使用的訪問(wèn)僅為read,write和required。mapped-name屬性可選的默認(rèn)是變量的名稱(chēng)。用來(lái)指定變量名稱(chēng)被映射的名稱(chēng),mapped-name的含義依賴(lài)于這個(gè)元素所被使用的上下文。對(duì)于一個(gè)腳本,將是一個(gè)腳本變量名

51、稱(chēng);對(duì)于一個(gè)任務(wù)控制器,將是任務(wù)表單參數(shù)的標(biāo)簽;對(duì)于一個(gè)process-state,將是在子流程中使用的變量名稱(chēng)。 3.3.16 handler(句柄)handler是在定義一個(gè)decision時(shí)需要為其定義一個(gè)decisionhandler時(shí)采用。名稱(chēng)類(lèi)型數(shù)量描述expression屬性或者用class一個(gè)jpdl表達(dá)式,返回結(jié)果被用tostring()方法轉(zhuǎn)換為字符串,結(jié)果字符串應(yīng)該與某個(gè)離開(kāi)轉(zhuǎn)換匹配。class屬性或者用ref-name實(shí)現(xiàn)了org.jbpm.graph.node.decisionhandler接口的類(lèi)的全名。config-type屬性可選的field|bean

52、|constructor|configuration-property。指定動(dòng)作對(duì)象將被怎樣創(chuàng)建以及本元素的內(nèi)容怎樣象配置信息那樣被動(dòng)作對(duì)象所使用。 內(nèi)容可選的action里的內(nèi)容可以用來(lái)幫助結(jié)合我們的業(yè)務(wù)來(lái)處理我們的流程,同時(shí)我們可以在action里加上業(yè)務(wù)處理邏輯,以更好的利用流程. 3.3.17 timer(定時(shí)器)定時(shí)器timer可以被用于decision fork join node process-state state super-state task-node,可以設(shè)置開(kāi)始時(shí)間duedate和頻率repeat,定時(shí)器動(dòng)作可以是所支持的任何動(dòng)作元素,如acti

53、on或script。timer 還有一個(gè)很重要的屬性cancel-event,這個(gè)是timer和task結(jié)合時(shí)使用的,任務(wù)定時(shí)器的cancel-event可以被定制。默認(rèn)情況 下,當(dāng)任務(wù)被結(jié)束時(shí)(=完成)任務(wù)上的定時(shí)器將被取消,這是通過(guò)在定時(shí)器上使用cancel-event屬性,流程開(kāi)發(fā)者可以定制諸如task- assign或task-start。cancel-event支持多個(gè)事件,通過(guò)在屬性中指定一個(gè)用逗號(hào)分割的列表,可以組合cancel-event 的類(lèi)型。名稱(chēng)類(lèi)型數(shù)量描述name屬性可選的定時(shí)器的名稱(chēng)。如果沒(méi)有指定名稱(chēng),則采用外部的節(jié)點(diǎn)名稱(chēng)。注意,每個(gè)定時(shí)器應(yīng)該有一個(gè)唯一的名稱(chēng)。due

54、date屬性必需的所指定的定時(shí)器創(chuàng)建到定時(shí)器執(zhí)行之間的期限(可以用業(yè)務(wù)時(shí)間來(lái)表示)。repeat屬性可選的duration|yes|true當(dāng)一個(gè)定時(shí)器在預(yù)期時(shí)間執(zhí)行后,“repeat”可選項(xiàng)指定了在離開(kāi)節(jié)點(diǎn)之前重復(fù)的執(zhí)行定時(shí)器之間的期限。如果指定為true或false,則與duedate相同的期限被使用。transition屬性可選的當(dāng)定時(shí)器執(zhí)行、定時(shí)器事件觸發(fā)后以及執(zhí)行動(dòng)作時(shí)時(shí)所使用的轉(zhuǎn)換名稱(chēng)。cancel-event屬性可選的這個(gè)屬性只用在任務(wù)的定時(shí)器中,它指定了定時(shí)器將被取消的事件。默認(rèn)是task-end事件,但是也可以被設(shè)置為如task-assign或task-start。cance

55、l-event的類(lèi)型也可以通過(guò)指定一個(gè)用逗號(hào)分割的列表被組合。action|script|create-timer|cancel-timer元素0.*當(dāng)定時(shí)器被觸發(fā)時(shí)所應(yīng)被執(zhí)行的動(dòng)作。 3.3.18 create-timer(創(chuàng)建定時(shí)器)create-timer是定時(shí)器的創(chuàng)建名稱(chēng)類(lèi)型數(shù)量描述name屬性可選的定時(shí)器的名稱(chēng)。這個(gè)名稱(chēng)可被用于用一個(gè)cancel-timer動(dòng)作取消定時(shí)器。duedate屬性必需的所指定的定時(shí)器創(chuàng)建到定時(shí)器執(zhí)行之間的期限(可以用業(yè)務(wù)時(shí)間來(lái)表示)。請(qǐng)參考“第14.1節(jié)期限”中的語(yǔ)法。repeat屬性可選的duration|yes|true當(dāng)一個(gè)定時(shí)器在預(yù)期時(shí)間

56、執(zhí)行后,“repeat”可選項(xiàng)指定了在離開(kāi)節(jié)點(diǎn)之前重復(fù)的執(zhí)行定時(shí)器之間的期限。如果指定為true或yese,則與duedate相同的期限被使用。請(qǐng)參考“第14.1節(jié)期限”的語(yǔ)法。transition屬性可選的當(dāng)定時(shí)器執(zhí)行、定時(shí)器事件觸發(fā)后以及執(zhí)行動(dòng)作時(shí)時(shí)(如果要)所獲取的轉(zhuǎn)換名稱(chēng)。 3.3.19 cancel-timer(取消定時(shí)器)cancel-timer是定時(shí)器的取消名稱(chēng)類(lèi)型數(shù)量描述name屬性可選的要被取消的定時(shí)器的名稱(chēng)。 3.3.20 task(任務(wù))task 是是流程定義里的一部分,它決定了task instance的創(chuàng)建和分配名稱(chēng)類(lèi)型數(shù)量描述name屬性可選的任務(wù)的名稱(chēng)。命名的任可以被引用并且可以通過(guò)taskmg

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論