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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

5、.11 event(事件)203.3.12 action(動作)203.3.13 script(腳本)223.3.14 expression(表達式)233.3.15 variable(變量)233.3.16 handler(句柄)233.3.17 timer(定時器)243.3.18 create-timer(創(chuàng)建定時器)253.3.19 cancel-timer(取消定時器)263.3.20 task(任務)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小結33四、流程中任務的分配374.1 assignment-handler方式的任務分配384.2 swimlane方式的任務分配39五、jbpm持久化425.1 特殊數據庫支持425.2 jbpm數據庫的安裝425.2 jbpm流程發(fā)布455.2.1 搭建jbpm的web應用465.2.2 發(fā)布第一個流程48六、日歷(scheduler)546.1 scheduler在c/s程序上的應用546.2 scheduler 在web上的應

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

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

9、nto workspace>next根據向導找到前面提到的jbpm目錄就可以把該工程導入到eclipse當中。如下圖:好了,接下來,我們就在這個工程的基礎之上來開始我們的第一個流程。2.2 、hello world 例子我們的第一個流程示例源自jbpm的reference。流程圖如下:jbpm的流程定義采用xml的方式(實際絕大多數的流程引擎的流程定義都采用的是這種方式),作為測試xml定義我們既可以寫在代碼當中,也可以以一個獨立的xml文件的形式存在,接下來的例子我們將分別為大家介紹一下這兩種情況。我們首先來看看把xml流程定義寫在代碼中的方式。新建一個junit的測試用例,測試代碼如

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() /*這個段測試方法演示了一個流程的在代碼中以字符串形式定義和

11、這個流程定義的具體執(zhí)行。 這個流程定義包含三個節(jié)點:一個未命名的開始狀態(tài)(start-state), 一個名字為's'的狀態(tài)(state)和一個名字為'end'的結束狀態(tài)(end-state)。 下一行的功能是把一段xml文本解析為一個processdefinition,一個processdefinition是一個java對象的形式對流程的正式的描述。*/ 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>" );/*下邊的一行根據流程定義構造了的一個具體的執(zhí)行實例。 構造以后,執(zhí)行的流程就有了一個被定位在開始狀態(tài)(start-state)上的主要的執(zhí)行路徑 */ processinstance processinstance = new processinstance(processdefinition);/*構造以后,執(zhí)行的流程就有了一個主要的執(zhí)行路徑(root token) */ token token = processinstance.getroottoken();/*當然,構造以后

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

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

16、ml文件里,同樣可以達到相同的效果。接下來我們就來看一下這種做法。流程定義文件: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>測試代碼: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");/*從這里可以看出,與上面那段代碼唯一不同之處就是沒有字符串形式的流程定義信息了,取而代之的是對流程定義的xml進行解析*/ 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(); 運行測試,得到的結果同上例完全相同。到這里為止,我們已經做了一個非常簡單的流程示例,對jbpm的流程定義及使用方法也有了初步的概念,在下面的內容中我們將著重來討論jbpm的流程定義方法,及各個節(jié)點的主要含義及使用方法。三、學習jpdl3.1 、簡介jpdl(jbpm process definition language)是jbpm流程定義語言。jpdl詳細定義了這個狀態(tài)圖的每個部分,如: 開始、結束狀態(tài),狀態(tài)之間的轉換等。這種語言的定義對于用戶來說比較容易理解,也比較容易對其進行擴展。一個jbpm的流程

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

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

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

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

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

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

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

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

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

30、ode節(jié)點一樣,在沒有task的時候,也都是自動執(zhí)行,不等待。task-node被歸類為一個等待節(jié)點,是指在task-node中的task列表中的task沒有全部執(zhí)行完之前,它會一直等待。task可以在task-node節(jié)點下定義,也可以掛在process-definition節(jié)點下。最普遍的方式是在task-node節(jié)點下定義一個或多個任務。默認情況下,流程在task-node節(jié)點會處于等待狀態(tài),直到所有的任務被執(zhí)行完畢。task的執(zhí)行是按順序執(zhí)行的,任務都完成后,token仍然不會指向后面的節(jié)點;需要自己手動調用processinstance.signal()才會驅動流程到下面的節(jié)點。名稱

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

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

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

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

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

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

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

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

39、/它的默認值是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(決策)一個decision用以決定在多個執(zhí)行路徑中哪個才可以被執(zhí)行。如果你是一個程序員,把它可以理解成switch case結構即可,一個decision能夠具有許多離開的transition。 名稱類型數量描述handler元素要么指定“handler”元素,或者在轉換上指定條件。一個org.jbpm.jpdl.def.decisionhandler的實現名稱。transition元素0.*離開轉換。決策的離開轉換可以被擴展為擁有一個條件,決策會查找條件計算為true的第一個轉換,沒有條件的轉換被認為計算為true(為了建模“otherwise”分支)。請參考conditi

41、on元素。普通節(jié)點元素  請參考普通節(jié)點元素。 handler所指定的decisionhandler的實現類里的decide方法返回一個字符串,表示要執(zhí)行哪個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(轉換)轉換用來指定節(jié)點之間的連接。transition元素放在node里面,那么這個transition就會從這個節(jié)點出離開。 名稱類型數量描述name屬性可選的轉換的名稱。注意,每個節(jié)點

43、的離開轉換必須有一個不同的名稱。to屬性必需的目標節(jié)點的分級名稱,表示將要達到的那個節(jié)點名稱. action|script|create-timer|cancel-timer元素0.*發(fā)生轉換時將要執(zhí)行的動作。注意,轉換的動作無需放入事件(因為只有一個事件)。exception-handler元素0.*一個異常處理器列表,用于這個流程節(jié)點中的委托類所拋出的所有異常。 3.3.11 event(事件)jbpm定義了一系列與工作流節(jié)點元素相關聯(lián)的事件,例如,流程實例運行過程中,可以觸發(fā)節(jié)點進入(node-enter)、節(jié)點離開 (node-leave)、流程啟動(process-star

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

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

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

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

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

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

50、va類型,即使不給jbpm知道也能被應用到變量中。jbpm的流程變量在盡量模仿java.util.map的語義。這一點可以通過jbpm的api來了解。也就是說一個變量只能當它被插入時被賦值,任何java類型都可以作為變量中的value。 名稱類型數量描述name屬性必需的流程變量的名稱。access屬性可選的默認是read,write,用逗號分割的一個訪問列表。迄今為止,使用的訪問僅為read,write和required。mapped-name屬性可選的默認是變量的名稱。用來指定變量名稱被映射的名稱,mapped-name的含義依賴于這個元素所被使用的上下文。對于一個腳本,將是一個腳本變量名

51、稱;對于一個任務控制器,將是任務表單參數的標簽;對于一個process-state,將是在子流程中使用的變量名稱。 3.3.16 handler(句柄)handler是在定義一個decision時需要為其定義一個decisionhandler時采用。名稱類型數量描述expression屬性或者用class一個jpdl表達式,返回結果被用tostring()方法轉換為字符串,結果字符串應該與某個離開轉換匹配。class屬性或者用ref-name實現了org.jbpm.graph.node.decisionhandler接口的類的全名。config-type屬性可選的field|bean

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論