流程定義語言_第1頁
流程定義語言_第2頁
流程定義語言_第3頁
流程定義語言_第4頁
流程定義語言_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

CompanyDocumentnumber:WUUT-WUUY-WBBGB-BWYTT-1982GTCompanyDocumentnumber:WUUT-WUUY-WBBGB-BWYTT-1982GT流程定義語言一JPDL流程定義process-definition(流程定義)流程定義的根節(jié)點(diǎn),是所有節(jié)點(diǎn)的父節(jié)點(diǎn)名稱類型數(shù)量描述name屬性可選的流程的名稱。swimlane元素[0..*]流程中使用的泳道。泳道表示流程角色,它們被用于任務(wù)分配。start-state元素[0..1]流程起始狀態(tài)。注意,沒有起始狀態(tài)的流程是合法的,但是不能被執(zhí)行。end-state|state|node|task-node|process-state|super-state|fork|join|decision元素[0..*]流程定義的節(jié)點(diǎn)。注意,沒有節(jié)點(diǎn)的流程是合法的,但是不能被執(zhí)行。event元素[0..*]作為一個(gè)容器服務(wù)于動(dòng)作的流程事件。action|script|create-timer|cancel-timer元素[0..*]全局定義的的動(dòng)作,可以在事件和轉(zhuǎn)換中引用。注意,為了被引用,這些動(dòng)作必須指定名稱。task元素[0..*]全局定義的任務(wù),可以在動(dòng)作中使用。exception-handler元素[0..*]一個(gè)異常處理器列表,用于這個(gè)流程定義中的委托類所拋出的所有異常。node(自動(dòng)節(jié)點(diǎn))這種節(jié)點(diǎn)和State相反,也稱自動(dòng)節(jié)點(diǎn)。當(dāng)業(yè)務(wù)程序?qū)嵗龍?zhí)行到這個(gè)節(jié)點(diǎn),不會(huì)停止執(zhí)行。而是會(huì)繼續(xù)往下執(zhí)行。如果該節(jié)點(diǎn)存在多個(gè)離開轉(zhuǎn)向。那么,就會(huì)執(zhí)行其中的第一個(gè)離開轉(zhuǎn)向,在Node狀態(tài)中,不需要外部參與者的參與,業(yè)務(wù)流程的這個(gè)部分是自動(dòng)的、即時(shí)完成的。名稱類型數(shù)量描述action|script|create-timer|cancel-timer事件1用于表示這個(gè)節(jié)點(diǎn)行為的定制動(dòng)作。普通節(jié)點(diǎn)元素請參考普通節(jié)點(diǎn)元素。start-state(開始狀態(tài))start-state是我們整個(gè)流程的開始節(jié)點(diǎn),所有的流程實(shí)例從這里開始。名稱類型數(shù)量描述Name屬性可選的節(jié)點(diǎn)的名稱。Task元素[0..1]起始一個(gè)流程實(shí)例的任務(wù),或者用來捕獲流程發(fā)起者Event元素[0..*]支持的事件類型:{node-leave}。transition元素[0..*]離開轉(zhuǎn)換,每個(gè)離開節(jié)點(diǎn)的轉(zhuǎn)換必須有一個(gè)不同的名稱。exception-handler元素[0..*]一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類所拋出的所有異常。end-state(結(jié)束節(jié)點(diǎn))對(duì)于每一個(gè)流程定義都會(huì)有一個(gè)結(jié)束節(jié)點(diǎn),與開始節(jié)點(diǎn)對(duì)應(yīng)名稱類型數(shù)量描述Name屬性必需的結(jié)束狀態(tài)的名稱。event元素[0..*]支持的事件類型:{node-enter}。exception-handler元素[0..*]一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類所拋出的所有異常。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ù)下去。名稱類型數(shù)量描述name屬性必需的節(jié)點(diǎn)的名稱。async屬性{true|false},默認(rèn)是false如果設(shè)置為true,這個(gè)節(jié)點(diǎn)將會(huì)異步執(zhí)行。請參考”異步執(zhí)行”章節(jié)。transition元素[0..*]離開轉(zhuǎn)換。每個(gè)離開節(jié)點(diǎn)的轉(zhuǎn)換必須有一個(gè)不同的名稱,最多只允許所有離開轉(zhuǎn)換中的一個(gè)沒有名稱。第一個(gè)轉(zhuǎn)換被指定為默認(rèn)轉(zhuǎn)換,當(dāng)離開節(jié)點(diǎn)而沒有指定轉(zhuǎn)換時(shí),默認(rèn)轉(zhuǎn)換發(fā)生。event元素[0..*]支持的事件類型:{node-enter|node-leave}。exception-handler元素[0..*]一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類所拋出的所有異常。timer元素[0..*]指定一個(gè)定時(shí)器,用來監(jiān)視節(jié)點(diǎn)中的一個(gè)執(zhí)行所持續(xù)的時(shí)間。task-node(任務(wù)節(jié)點(diǎn))其性質(zhì)和node節(jié)點(diǎn)一樣,在沒有task的時(shí)候,也都是自動(dòng)執(zhí)行,不等待。task-node被歸類為一個(gè)等待節(jié)點(diǎn),是指在task-node中的task列表中的task沒有全部執(zhí)行完之前,它會(huì)一直等待。Task可以在task-node節(jié)點(diǎn)下定義,也可以掛在process-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)用()才會(huì)驅(qū)動(dòng)流程到下面的節(jié)點(diǎn)。名稱類型數(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í)通過計(jì)算來決定哪個(gè)任務(wù)將被創(chuàng)建時(shí),可以設(shè)置為false,如果這樣的話,在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,在離開節(jié)點(diǎn)時(shí),所有打開的任務(wù)將被結(jié)束。task元素[0..*]當(dāng)執(zhí)行到達(dá)本節(jié)點(diǎn)時(shí)所應(yīng)被創(chuàng)建的任務(wù)。請參考。為了幫助讀者理解task-node節(jié)點(diǎn)的signal屬性,這里舉例如下:對(duì)于這樣的流程定義:<task-nodename='a'><taskname='laundry'/><taskname='dishes'/><taskname='changenappy'/><transitionto='b'/></task-node>這里沒有定義signal屬性的值,這就表明當(dāng)節(jié)點(diǎn)中的三個(gè)任務(wù)都完成后,流程才進(jìn)入后面的節(jié)點(diǎn)當(dāng)<task-nodename='a'signal='unsynchronized'>表明token不會(huì)在本節(jié)點(diǎn)停留,而是直接到后面的節(jié)點(diǎn)當(dāng)<task-nodename='a'signal='never'>表明三個(gè)任務(wù)都完成后,token仍然不會(huì)指向后面的節(jié)點(diǎn);需要自己手動(dòng)調(diào)用()才會(huì)驅(qū)動(dòng)流程到下面的節(jié)點(diǎn)當(dāng)<task-nodename='a'signal='first'>表明只要有一個(gè)任務(wù)完成后,token就指向后面的節(jié)點(diǎn)當(dāng)<task-nodename='a'signal='first-wait'>表明當(dāng)?shù)谝粋€(gè)任務(wù)實(shí)例完成時(shí)繼續(xù)執(zhí)行;當(dāng)在a節(jié)點(diǎn)入口處沒有任務(wù)創(chuàng)建時(shí),token在a任務(wù)節(jié)點(diǎn)處等待,直到任務(wù)被創(chuàng)建或完成。當(dāng)<task-nodename='a'signal='last'>時(shí),這是默認(rèn)值,和不設(shè)置signal屬性的情況相同。當(dāng)<task-nodename='a'signal='last-wait'>時(shí),當(dāng)最后一個(gè)任務(wù)實(shí)例完成時(shí)候繼續(xù)執(zhí)行下去。當(dāng)a這個(gè)任務(wù)節(jié)點(diǎn)沒有任務(wù)被建立時(shí),任務(wù)節(jié)點(diǎn)等待直到任務(wù)被建立。fork(分支)一個(gè)fork把一個(gè)執(zhí)行路線分割成多個(gè)執(zhí)行路線.默認(rèn)分支的行為是為每個(gè)離開分支轉(zhuǎn)換建立一個(gè)子令牌,在令牌要到達(dá)的分支之間建立一個(gè)父母-子女關(guān)系名稱類型數(shù)量描述name屬性必需的節(jié)點(diǎn)的名稱。async屬性{true|false},默認(rèn)是false如果設(shè)置為true,這個(gè)節(jié)點(diǎn)將會(huì)異步執(zhí)行。請參考”異步執(zhí)行”章節(jié)。transition元素[0..*]離開轉(zhuǎn)換。每個(gè)離開節(jié)點(diǎn)的轉(zhuǎn)換必須有一個(gè)不同的名稱,最多只允許所有離開轉(zhuǎn)換中的一個(gè)沒有名稱。第一個(gè)轉(zhuǎn)換被指定為默認(rèn)轉(zhuǎn)換,當(dāng)離開節(jié)點(diǎn)而沒有指定轉(zhuǎn)換時(shí),默認(rèn)轉(zhuǎn)換發(fā)生。event元素[0..*]支持的事件類型:{node-enter|node-leave}。exception-handler元素[0..*]一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類所拋出的所有異常。timer元素[0..*]指定一個(gè)定時(shí)器,用來監(jiān)視節(jié)點(diǎn)中的一個(gè)執(zhí)行所持續(xù)的時(shí)間。join(聯(lián)合)默認(rèn)聯(lián)合(join)假設(shè)所有來自同一個(gè)父母的子令牌聯(lián)合,當(dāng)在上使用fork(分支)這個(gè)情形就出現(xiàn)了并且所有令牌分支建立,并且到達(dá)同一個(gè)聯(lián)合(join)。當(dāng)全部令牌都進(jìn)入聯(lián)合的時(shí)候聯(lián)合就結(jié)束了,然后聯(lián)合將檢查父母-子女,當(dāng)所有兄弟令牌到達(dá)聯(lián)合(join),父母令牌將傳播(唯一的)離開轉(zhuǎn)換,當(dāng)還有兄弟令牌活動(dòng)時(shí),聯(lián)合的行為將作為等待狀態(tài)。名稱類型數(shù)量描述name屬性必需的節(jié)點(diǎn)的名稱。async屬性{true|false},默認(rèn)是false如果設(shè)置為true,這個(gè)節(jié)點(diǎn)將會(huì)異步執(zhí)行。transition元素[0..*]離開轉(zhuǎn)換。每個(gè)離開節(jié)點(diǎn)的轉(zhuǎn)換必須有一個(gè)不同的名稱,最多只允許所有離開轉(zhuǎn)換中的一個(gè)沒有名稱。第一個(gè)轉(zhuǎn)換被指定為默認(rèn)轉(zhuǎn)換,當(dāng)離開節(jié)點(diǎn)而沒有指定轉(zhuǎn)換時(shí),默認(rèn)轉(zhuǎn)換發(fā)生。event元素[0..*]支持的事件類型:{node-enter|node-leave}。exception-handler元素[0..*]一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類所拋出的所有異常。timer元素[0..*]指定一個(gè)定時(shí)器,用來監(jiān)視節(jié)點(diǎn)中的一個(gè)執(zhí)行所持續(xù)的時(shí)間。對(duì)于Join節(jié)點(diǎn),我們知道默認(rèn)是要等到所有分支都到了流程才能往下繼續(xù)走,要改變這一情況,我們可以通過給該節(jié)點(diǎn)加Action的方法改變該Join節(jié)點(diǎn)的Discriminator,就可以使只要有一個(gè)分支到達(dá)流程就可以繼續(xù)執(zhí)行的效果了decision(決策)一個(gè)decision用以決定在多個(gè)執(zhí)行路徑中哪個(gè)才可以被執(zhí)行。如果你是一個(gè)程序員,把它可以理解成switchcase結(jié)構(gòu)即可,一個(gè)decision能夠具有許多離開的transition。名稱類型數(shù)量描述handler元素要么指定“handler”元素,或者在轉(zhuǎn)換上指定條件。一個(gè)的實(shí)現(xiàn)名稱。transition元素[0..*]離開轉(zhuǎn)換。決策的離開轉(zhuǎn)換可以被擴(kuò)展為擁有一個(gè)條件,決策會(huì)查找條件計(jì)算為true的第一個(gè)轉(zhuǎn)換,沒有條件的轉(zhuǎn)換被認(rèn)為計(jì)算為true(為了建?!皁therwise”分支)。請參考。請參考。Handler所指定的DecisionHandler的實(shí)現(xiàn)類里的decide方法返回一個(gè)字符串,表示要執(zhí)行哪個(gè)transitiontransition(轉(zhuǎn)換)轉(zhuǎn)換用來指定節(jié)點(diǎn)之間的連接。transition元素放在node里面,那么這個(gè)transition就會(huì)從這個(gè)節(jié)點(diǎn)出離開。名稱類型數(shù)量描述name屬性可選的轉(zhuǎn)換的名稱。注意,每個(gè)節(jié)點(diǎn)的離開轉(zhuǎn)換必須有一個(gè)不同的名稱。to屬性必需的目標(biāo)節(jié)點(diǎn)的分級(jí)名稱,表示將要達(dá)到的那個(gè)節(jié)點(diǎn)名稱.action|script|create-timer|cancel-timer元素[0..*]發(fā)生轉(zhuǎn)換時(shí)將要執(zhí)行的動(dòng)作。注意,轉(zhuǎn)換的動(dòng)作無需放入事件(因?yàn)橹挥幸粋€(gè)事件)。exception-handler元素[0..*]一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類所拋出的所有異常。event(事件)JBPM定義了一系列與工作流節(jié)點(diǎn)元素相關(guān)聯(lián)的事件,例如,流程實(shí)例運(yùn)行過程中,可以觸發(fā)節(jié)點(diǎn)進(jìn)入(node-enter)、節(jié)點(diǎn)離開(node-leave)、流程啟動(dòng)(process-start)、流程結(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í)行。名稱類型數(shù)量描述type屬性必需的表示相對(duì)于事件要放置的元素事件類型。action|script|create-timer|cancel-timer元素[0..*]在這個(gè)事件上將要執(zhí)行的動(dòng)作列表。action(動(dòng)作)一個(gè)action是一段java代碼。在流程執(zhí)行期間在一些事件之上定義,這樣會(huì)在相關(guān)事件觸發(fā)時(shí)自動(dòng)在工作流引擎上執(zhí)行。名稱類型數(shù)量描述name屬性必需的動(dòng)作的名稱。當(dāng)動(dòng)作被指定名稱后,它們可以在流程定義中被查出,這對(duì)于運(yùn)行時(shí)動(dòng)作以及僅一次聲明動(dòng)作是有用的。class屬性或者用ref-name,或者用expression。實(shí)現(xiàn)接口的類的全名。ref-name屬性或者用class。所引用動(dò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|true。如果設(shè)置為false,則動(dòng)作僅在本動(dòng)作元素的觸發(fā)事件上被執(zhí)行。更多信息,請參考“”。config-type屬性可選的{|||}。指定動(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)作。請參考”異步執(zhí)行”章節(jié)。{內(nèi)容}可選的action的內(nèi)容可以被作為你定制動(dòng)作實(shí)現(xiàn)的配置信息,這是考慮到可重用的委托類的創(chuàng)建。有關(guān)委托配置的更多信息,請參考“”。script(腳本)Script里是動(dòng)作執(zhí)行的beanshell腳本.名稱類型數(shù)量描述name屬性可選的腳本動(dòng)作的名稱。當(dāng)動(dò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..1]beanshell腳本。如果你沒有指定元素,可以寫表達(dá)式作為腳本元素的內(nèi)容(忽略expression元素標(biāo)簽)。variable元素[0..*]腳本所需變量。如果沒有指定變量,則當(dāng)前令牌的所有變量將被裝載到腳本,當(dāng)你想要限制裝載到腳本中的變量數(shù)量時(shí)使用variable。expression(表達(dá)式)Expression里可書寫B(tài)eanshell腳本名稱類型數(shù)量描述{內(nèi)容}一個(gè)beanshell腳本。variable(變量)一個(gè)是變量是一種key-value對(duì)。它與過程實(shí)例(一次過程執(zhí)行)相關(guān)聯(lián)。Key是,value是任何java類型的任何pojo。所以任何是java類型,即使不給jbpm知道也能被應(yīng)用到變量中。JBPM的流程變量在盡量模仿的語義。這一點(diǎn)可以通過JBPM的API來了解。也就是說一個(gè)變量只能當(dāng)它被插入時(shí)被賦值,任何java類型都可以作為變量中的value。名稱類型數(shù)量描述name屬性必需的流程變量的名稱。access屬性可選的默認(rèn)是read,write,用逗號(hào)分割的一個(gè)訪問列表。迄今為止,使用的訪問僅為read,write和required。mapped-name屬性可選的默認(rèn)是變量的名稱。用來指定變量名稱被映射的名稱,mapped-name的含義依賴于這個(gè)元素所被使用的上下文。對(duì)于一個(gè)腳本,將是一個(gè)腳本變量名稱;對(duì)于一個(gè)任務(wù)控制器,將是任務(wù)表單參數(shù)的標(biāo)簽;對(duì)于一個(gè)process-state,將是在子流程中使用的變量名稱。handler(句柄)Handler是在定義一個(gè)decision時(shí)需要為其定義一個(gè)DecisionHandler時(shí)采用。名稱類型數(shù)量描述expression屬性或者用class一個(gè)jPDL表達(dá)式,返回結(jié)果被用toString()方法轉(zhuǎn)換為字符串,結(jié)果字符串應(yīng)該與某個(gè)離開轉(zhuǎn)換匹配。class屬性或者用ref-name實(shí)現(xiàn)了接口的類的全名。Config-type屬性可選的{|||}。指定動(dòng)作對(duì)象將被怎樣創(chuàng)建以及本元素的內(nèi)容怎樣象配置信息那樣被動(dòng)作對(duì)象所使用。{內(nèi)容}可選的Action里的內(nèi)容可以用來幫助結(jié)合我們的業(yè)務(wù)來處理我們的流程,同時(shí)我們可以在Action里加上業(yè)務(wù)處理邏輯,以更好的利用流程.timer(定時(shí)器)定時(shí)器timer可以被用于decisionforkjoinnodeprocess-statestatesuper-statetask-node,可以設(shè)置開始時(shí)間duedate和頻率repeat,定時(shí)器動(dòng)作可以是所支持的任何動(dòng)作元素,如action或script。timer還有一個(gè)很重要的屬性cancel-event,這個(gè)是timer和task結(jié)合時(shí)使用的,任務(wù)定時(shí)器的cancel-event可以被定制。默認(rèn)情況下,當(dāng)任務(wù)被結(jié)束時(shí)(=完成)任務(wù)上的定時(shí)器將被取消,這是通過在定時(shí)器上使用cancel-event屬性,流程開發(fā)者可以定制諸如task-assign或task-start。cancel-event支持多個(gè)事件,通過在屬性中指定一個(gè)用逗號(hào)分割的列表,可以組合cancel-event的類型。名稱類型數(shù)量描述name屬性可選的定時(shí)器的名稱。如果沒有指定名稱,則采用外部的節(jié)點(diǎn)名稱。注意,每個(gè)定時(shí)器應(yīng)該有一個(gè)唯一的名稱。duedate屬性必需的所指定的定時(shí)器創(chuàng)建到定時(shí)器執(zhí)行之間的期限(可以用業(yè)務(wù)時(shí)間來表示)。repeat屬性可選的{duration|yes|true}當(dāng)一個(gè)定時(shí)器在預(yù)期時(shí)間執(zhí)行后,“repeat”可選項(xiàng)指定了在離開節(jié)點(diǎn)之前重復(fù)的執(zhí)行定時(shí)器之間的期限。如果指定為true或false,則與duedate相同的期限被使用。transition屬性可選的當(dāng)定時(shí)器執(zhí)行、定時(shí)器事件觸發(fā)后以及執(zhí)行動(dòng)作時(shí)時(shí)所使用的轉(zhuǎn)換名稱。cancel-event屬性可選的這個(gè)屬性只用在任務(wù)的定時(shí)器中,它指定了定時(shí)器將被取消的事件。默認(rèn)是task-end事件,但是也可以被設(shè)置為如task-assign或task-start。cancel-event的類型也可以通過指定一個(gè)用逗號(hào)分割的列表被組合。action|script|create-timer|cancel-timer元素[0..*]當(dāng)定時(shí)器被觸發(fā)時(shí)所應(yīng)被執(zhí)行的動(dòng)作。create-timer(創(chuàng)建定時(shí)器)Create-timer是定時(shí)器的創(chuàng)建名稱類型數(shù)量描述name屬性可選的定時(shí)器的名稱。這個(gè)名稱可被用于用一個(gè)cancel-timer動(dòng)作取消定時(shí)器。duedate屬性必需的所指定的定時(shí)器創(chuàng)建到定時(shí)器執(zhí)行之間的期限(可以用業(yè)務(wù)時(shí)間來表示)。請參考“”中的語法。repeat屬性可選的{duration|’yes’|’true’}當(dāng)一個(gè)定時(shí)器在預(yù)期時(shí)間執(zhí)行后,“repeat”可選項(xiàng)指定了在離開節(jié)點(diǎn)之前重復(fù)的執(zhí)行定時(shí)器之間的期限。如果指定為true或yese,則與duedate相同的期限被使用。請參考“”的語法。transition屬性可選的當(dāng)定時(shí)器執(zhí)行、定時(shí)器事件觸發(fā)后以及執(zhí)行動(dòng)作時(shí)時(shí)(如果要)所獲取的轉(zhuǎn)換名稱。cancel-timer(取消定時(shí)器)Cancel-timer是定時(shí)器的取消名稱類型數(shù)量描述name屬性可選的要被取消的定時(shí)器的名稱。task(任務(wù))Task是是流程定義里的一部分,它決定了taskinstance的創(chuàng)建和分配名稱類型數(shù)量描述name屬性可選的任務(wù)的名稱。命名的任可以被引用并且可以通過TaskMgmtDefinition被查出。blocking屬性可選的{yes|no|true|false}如果blocking設(shè)置為true,當(dāng)任務(wù)沒有結(jié)束時(shí)節(jié)點(diǎn)不能被離開(必須要通過()方法離開節(jié)點(diǎn));如果設(shè)置為false(默認(rèn)),允許用戶通過signal繼續(xù)執(zhí)行和離開節(jié)點(diǎn)。默認(rèn)設(shè)置為false,因?yàn)橥ǔJ怯捎脩艚涌趤韽?qiáng)制阻塞。signalling屬性可選的{yes|no|true|false},默認(rèn)是true。如果設(shè)置signalling為false,則任務(wù)沒有觸發(fā)令牌繼續(xù)的能力。duedate屬性可選的延遲時(shí)間(任務(wù)執(zhí)行的的延遲時(shí)間)。請見業(yè)務(wù)日歷中的解釋。swimlane屬性可選的引用一個(gè),如果在任務(wù)上指定了一個(gè)swimlane,則assignment將被忽略。priority屬性可選的{highest,high,normal,low,lowest}之一。作為選擇,可以為priority指定任何整數(shù),供參考:(highest=1,lowest=5)。元素可選的描寫一個(gè),該委托將在任務(wù)被創(chuàng)建時(shí)把任務(wù)分配給一個(gè)參與者。event元素[0..*]支持的事件類型:{task-create|task-start|task-assign|task-end}。為了任務(wù)分配,我們特別的為TaskInstance添加了一個(gè)非持久化的屬性previousActorId。exception

-handler元素[0..*]一個(gè)異常處理器列表,用于這個(gè)流程節(jié)點(diǎn)中的委托類所拋出的所有異常。timer元素[0..*]指定一個(gè)監(jiān)視本任務(wù)執(zhí)行期限的一個(gè)定時(shí)器。對(duì)于任務(wù)定時(shí)器特殊的是可以指定cancel-event,cancel-event默認(rèn)是task-end,但是它可以被自定義如task-assign或task-start。controller元素[0..1]指定流程變量怎樣被轉(zhuǎn)換為任務(wù)表單參數(shù)。任務(wù)表單參數(shù)有用戶界面使用,用力向用戶表現(xiàn)一個(gè)任務(wù)表單。swimlane(泳道)實(shí)際應(yīng)用中,一個(gè)人是一個(gè)流程中多個(gè)Task的參與者(actor)的情況是很常見的。在jbpm中通過創(chuàng)建一個(gè)swimlane并且把swimlane賦給一個(gè)task的方式來設(shè)置當(dāng)前task的參與者(actor)。一個(gè)業(yè)務(wù)流程中的swimlane可以被看做為一個(gè)參與者的參與者對(duì)象的名稱,當(dāng)然它不一定是固定的某個(gè)人,它可以是一個(gè)用戶組,一個(gè)特定用戶的角色等。首次執(zhí)行到達(dá)一個(gè)Task,賦給該Task的一個(gè)swimlane就會(huì)算出參與者(actor)。名稱類型數(shù)量描述name屬性必需的泳道的名稱。泳道可以被引用并且可以通過TaskMgmtDefinition被查出。assignment元素[1..1]指定泳道的分配。這個(gè)分配在本泳道中的第一個(gè)任務(wù)實(shí)例被創(chuàng)建時(shí)完成。assignment(委派)當(dāng)流程執(zhí)行到某個(gè)Task的時(shí)候,引時(shí)流程引摯要調(diào)用相應(yīng)的swimlane或assignment將當(dāng)前的task分配(委派)給某個(gè)參與者,外部參與者可以是一個(gè)人也可以是某個(gè)系統(tǒng)等。名稱類型數(shù)量描述expression屬性可選的由于歷史原因,這個(gè)屬性的表達(dá)式不是,而是對(duì)jBPM身份組件的一個(gè)分配表達(dá)式。actor-id屬性可選的一個(gè)actorId,可以與pooled-actors協(xié)同使用。actor-id被作為,因此你可以引用一個(gè)固定的actorId,如actor-id=”bobthebuiler”;或者你可以引用一個(gè)可以返回一個(gè)字符串的屬性或方法,如actor-id=””,這將調(diào)用任務(wù)實(shí)例變量“myVar”上的getActorId方法。Pooled-actors屬性可選的一個(gè)逗號(hào)分割的actorId列表,可以與actor-id協(xié)同使用。一個(gè)固定的參與者池可以指定如下:pooled-actors=”chicagobulls,pointersisters”。pooled-actors被作為,因此你可以引用一個(gè)返回String[]、Collection、或一個(gè)逗號(hào)分割的池中的參與者列表的屬性或方法。class屬性可選的一個(gè)實(shí)現(xiàn)接口的類的全名稱。config-type屬性可選的{|||}。指定分配處理器對(duì)象(assignment-handler-object)對(duì)象將被怎樣創(chuàng)建以及本元素的內(nèi)容怎樣象配置信息那樣被分配處理器對(duì)象所使用。{內(nèi)容}可選的assignment元素的內(nèi)容可以被作為分配處理器(AssignmentHandler)實(shí)現(xiàn)的配置信息,這是考慮到可重用的委托類的創(chuàng)建。controller(控制器)在任務(wù)執(zhí)行時(shí),可能需要讀、寫流程變量;在任務(wù)完成并提交時(shí),可能需要寫流程變量。為此,jBPM提供了"任務(wù)變量"的概念。在某些情況下,任務(wù)變量和流程變量并非簡單的一一對(duì)應(yīng)關(guān)系,例如,三個(gè)流程變量代表三個(gè)月的銷售額,任務(wù)變量只需要它們的平均值。為實(shí)現(xiàn)任務(wù)與流程實(shí)例之間的信息交流,jBPM設(shè)置了任務(wù)控制器機(jī)制。該機(jī)制也采用遞進(jìn)模式:首先,jBPM提供基本(默認(rèn))的任務(wù)控制器;如果不敷使用,二次開發(fā)人員可以使用自定義的任務(wù)控制器。jBPM的任務(wù)控制器機(jī)制在流程變量和任務(wù)變量之間架起了一座橋梁。名稱類型數(shù)量描述class屬性可選的一個(gè)實(shí)現(xiàn)接口的類的全名稱。Config-type屬性可選的{|||}。指定分配處理器對(duì)象(assignment-handler-object)對(duì)象將被怎樣創(chuàng)建以及本元素的內(nèi)容怎樣象配置信息那樣被分配處理器對(duì)象所使用。{內(nèi)容}controller元素的內(nèi)容要么是指定的任務(wù)控制處理器的配置信息(如果指定了class屬性),要么必須是一個(gè)variable元素列表(如果沒有指定任務(wù)控制器)。variable元素[0..*]如果沒有通過class屬性指定任務(wù)控制處理器,則controller元素的內(nèi)容必須是變量列表。process-state子流程process-state是JBPM提供的用來處理子流程的節(jié)點(diǎn),一個(gè)process-state只能對(duì)應(yīng)一個(gè)子流程,究竟指到哪個(gè)子流程可以在process-state的action里指定,當(dāng)token執(zhí)行到指定的子流程時(shí),子流程就已經(jīng)啟動(dòng),不用像啟動(dòng)主流程一樣手工啟動(dòng)子流程。其它部分的處理就和普通的流程沒有區(qū)別了。名稱類型數(shù)量描述name屬性必需的名稱。Sub-process元素只能定義一個(gè)子流程variable變量[0…*]Variable是用來指定如何把數(shù)據(jù)從父流程copy到子流程sub-process子流程名稱類型數(shù)量描述name屬性必需的子流程的名稱version屬性可選子流程的版本。如果沒有指定該屬性,默認(rèn)將會(huì)采且該子流程的最后一個(gè)版本condition條件名稱類型數(shù)量描述{內(nèi)容}或?qū)傩员磉_(dá)式必需的condition元素的內(nèi)容是一個(gè)計(jì)算結(jié)果為布爾值的jPDL表達(dá)式。決策采用第一個(gè)表達(dá)式處理結(jié)果為true的轉(zhuǎn)換(按在中的順序),如果沒有條件處理結(jié)果為true,則采用默認(rèn)離開轉(zhuǎn)換(也就是第一個(gè))。exception-handler異常處理Jbpm的異常處理機(jī)制僅僅集中于java異常,流程定義本身的執(zhí)行不會(huì)導(dǎo)致什么異常,只有在執(zhí)行委托類時(shí)才會(huì)導(dǎo)致異常。

在流程定義(process-definitions)添加的exception-handler對(duì)整個(gè)流程起作用、節(jié)點(diǎn)(nodes)上添加異常只對(duì)當(dāng)前的節(jié)點(diǎn)起作用(同時(shí)如果在process-definitions里也設(shè)置了exception-handler那么將不會(huì)再執(zhí)行process-definitions里的exception-handler),和轉(zhuǎn)換(transitions)添加exception-handler只對(duì)當(dāng)前的transitions起作用(同時(shí)如果在process-definitions里也設(shè)置了exception-handler那么將不會(huì)再執(zhí)行process-definitions里的exception-handler),可以指定一個(gè)異常處理(exception-handlers)清單,每個(gè)異常處理(exception-handler)有一個(gè)動(dòng)作列表,當(dāng)在委托類中發(fā)生異常時(shí),會(huì)在流程元素的父層次搜索一個(gè)適當(dāng)?shù)漠惓L幚恚╡xception-handler),當(dāng)它被搜索到,則異常處理(exception-handler)的動(dòng)作將被執(zhí)行。

注意,Jbpm的異常處理機(jī)制與java異常處理不完全相似。在java中,一個(gè)捕獲的異??梢杂绊懣刂屏?,而在Jbpm中,流程不會(huì)被Jbpm異常處理機(jī)制所改變。異常要么被捕獲,要么不捕獲,沒有被捕獲的異常被拋向客戶端(例如客戶端調(diào)用()),而被捕獲的異常則是通過Jbpm的exception-handler,對(duì)于被捕獲的異常,圖執(zhí)行仍會(huì)繼續(xù),就像沒有異常發(fā)生一樣。

在處理異常的動(dòng)作中,可以使用(Nodenode)把令牌放入圖中的任何節(jié)點(diǎn)。名稱類型數(shù)量描述exception-class屬性可選的指定與本異常處理器所匹配的javathrowable類,如果這個(gè)沒有指定這個(gè)屬性,則它匹配所有異常()。action元素[1..*]當(dāng)異常被異常處理器捕獲時(shí)將要執(zhí)行的動(dòng)作列表。二XPDL元模型定義了流程定義里所包含的實(shí)體、它們的關(guān)系以及屬性,其中屬性不僅僅為了執(zhí)行需要,很多屬性是為了統(tǒng)計(jì)與監(jiān)控的需要。包(Package)流程模型包含許多作用域大于流程定義的實(shí)體,例如參與者聲明、應(yīng)用程序聲明和相關(guān)數(shù)據(jù)元素,它們可能被多個(gè)流程定義所引用。為了避免每個(gè)流程定義都重復(fù)定義這些實(shí)體,XPDL引入包的概念,包作為流程定義的容器,對(duì)流程定義按照關(guān)聯(lián)性進(jìn)行分組。在包上定義的實(shí)體被其包含的流程定義繼承,同時(shí),包能夠?yàn)樗鶎倭鞒潭x聲明一系列的通用屬性,例如作者、版本號(hào)、狀態(tài)等。XPDL里的包等價(jià)于BPMN里的業(yè)務(wù)流程圖(BusinessProcessDiagram)。泳道(Swimlanes)泳道被用來對(duì)流程定義和活動(dòng)進(jìn)行布局。我們使用泳道在流程級(jí)別上定義參與者信息(部門、公司),在活動(dòng)級(jí)別上定義執(zhí)行者信息(角色、人員)。我們使用一系列非重疊的長方形來描述泳道,這些長方形稱為池(Pool),同時(shí),池又被細(xì)分為一系列的子泳道(Lane)。如下圖2-6所示:圖2-6泳道同樣的在下圖中描述了一個(gè)包含貸款應(yīng)用流程的池。池中沒有道。流程可以是可重用的子流程或內(nèi)嵌的子流程。要注意遷移(順序流)可以穿越同一個(gè)池中的道。遷移可能不會(huì)穿越池。流程定義(ProcessDefinition)流程定義是對(duì)流程的建模和描述,為流程中的其他實(shí)體提供上下文信息。其屬性包括創(chuàng)建時(shí)間、作者、初始化參數(shù)、執(zhí)行優(yōu)先級(jí)、時(shí)間約束、仿真信息等。文檔包含對(duì)流程集(包)的流程定義。Xml文檔不僅被模型工具、模擬工具和執(zhí)行工具使用,它同樣為bam報(bào)表工具提供了基本信息,特別是為OLAP立體報(bào)表技術(shù)提供了維度和變量信息。在這里我們描述了使用管理工具發(fā)送xpdl流程定義到分析工具并傳達(dá)能捕捉執(zhí)行的詳細(xì)情況的日志事件流的企業(yè)流程管理系統(tǒng)。分析工具根據(jù)流程定義、參與者和隊(duì)列信息來構(gòu)造數(shù)據(jù)庫和OLAP立方。分析工具處理事件來更新數(shù)據(jù)庫中實(shí)際和維度上的表,并且利用excel和(或)其他擁有的流程以及企業(yè)智能工具立體處理事件來完成對(duì)切片和切塊查看數(shù)據(jù)的交互的準(zhǔn)備。一個(gè)可供選擇的數(shù)據(jù)展示的方法顯示了流程定義的視覺環(huán)境中選擇的數(shù)據(jù)。這個(gè)可以由歷史展示或動(dòng)畫執(zhí)行系統(tǒng)或模擬運(yùn)行來實(shí)現(xiàn)。活動(dòng)(Activity)活動(dòng)是流程中的一個(gè)步驟,一個(gè)基本活動(dòng)具有屬性。這些屬性提供了在這一步驟中誰可以執(zhí)行這個(gè)活動(dòng)、什么應(yīng)用或Web服務(wù)會(huì)被調(diào)用、正在工作的對(duì)象的哪些內(nèi)容被使用了以及(或)被改變了等信息。參與者(資源)和應(yīng)用可能會(huì)定義在一個(gè)流程中,或者被定義在企業(yè)流程模型的整個(gè)流程集中。工作對(duì)象的內(nèi)容同樣可以定義在一個(gè)流程中或整個(gè)模型中。活動(dòng)有一些其他屬性更進(jìn)一步定義了它們的特殊角色或它們是如何實(shí)現(xiàn)的一個(gè)流程包含一個(gè)或多個(gè)活動(dòng),活動(dòng)對(duì)應(yīng)著流程里的一個(gè)工作單元。一個(gè)典型的活動(dòng)能被人力資源或計(jì)算機(jī)所執(zhí)行。XPDL的活動(dòng)粒度比較粗,分為四類,分別對(duì)應(yīng)BPMN里的任務(wù)、子流程、網(wǎng)關(guān)和事件。如下圖2-7所示:圖2-7XPDL活動(dòng)與BPMN的映射轉(zhuǎn)移線(Transition)活動(dòng)之間通過轉(zhuǎn)移線連接。轉(zhuǎn)移線包括3個(gè)屬性:源活動(dòng)、目標(biāo)活動(dòng)和條件。轉(zhuǎn)移線可以是有條件的(設(shè)置表達(dá)式),也可以是無條件的。XPDL的轉(zhuǎn)移線對(duì)應(yīng)于BPMN里的順序流,如下圖2-8所示:圖2-8XPDL轉(zhuǎn)移線對(duì)應(yīng)BPMN里的順序流參與者聲明(ParticipantDeclaration)描述執(zhí)行流程和活動(dòng)的資源。資源可以是單個(gè)人、也可以是角色、部門、還可以是自動(dòng)執(zhí)行的機(jī)器資源(例如打印機(jī))。應(yīng)用程序聲明(ApplicationDeclaration)活動(dòng)可以調(diào)用的IT系統(tǒng)、接口、Web服務(wù)。BPMN使用內(nèi)置的服務(wù)任務(wù)(ServiceTask)直接代表對(duì)應(yīng)用程序的調(diào)用。人工產(chǎn)出物(Artifact)為流程附加額外的建模信息,這些信息不屬于基本的流程實(shí)體(活動(dòng)、轉(zhuǎn)移線、消息流),它們通過關(guān)聯(lián)與流程實(shí)體聯(lián)系在一起。在BPMN里,人工交付物包括3種類型,如下圖2-9所示:圖2-9人工產(chǎn)出物消息流(MessageFlow)消息流用來展示兩個(gè)參與者/流程之間的消息流向。在BPMN中,用泳道中的池代表兩個(gè)參與者/流程。消息流不能連接同一個(gè)池中的活動(dòng)。圖2-10消息流消息流一般由Web服務(wù)或消息隊(duì)列實(shí)現(xiàn)。在例子中我們闡述了不同池中的活動(dòng)之間的消息流是怎樣流動(dòng)的。這使得我們可以圖形化的展示流程之間各方面的安排。應(yīng)該注意的是消息流不會(huì)出現(xiàn)在同一個(gè)池中的活動(dòng)之間。換句話說,順序流用來連接同一個(gè)池中的活動(dòng),而消息流用來展示不同池中的活動(dòng)之間的通信。這個(gè)例子中的池被畫成水平方向并且擴(kuò)展到整個(gè)頁面。但是,規(guī)范中也支持垂直池,并允許限制寬度和高度。這支持了規(guī)范中抽象流程和安排對(duì)池的使用。關(guān)聯(lián)(Association)我們使用關(guān)聯(lián)將信息、人工產(chǎn)出物與流程實(shí)體連接起來,為流程模型提供更多的信息,它不影響流程的執(zhí)行。如下圖2-11所示:圖2-11關(guān)聯(lián)相關(guān)數(shù)據(jù)元素(Relevantdatafield)為流程定義執(zhí)行過程中創(chuàng)建或使用到的數(shù)據(jù),這些數(shù)據(jù)被活動(dòng)、應(yīng)用程序和流程中定義的各種表達(dá)式(轉(zhuǎn)移線條件計(jì)算、網(wǎng)關(guān)條件計(jì)算)所使用。數(shù)據(jù)類型與表達(dá)式(DataTypesandExpressions)定義相關(guān)數(shù)據(jù)元素、系統(tǒng)與環(huán)境數(shù)據(jù)、參與者數(shù)據(jù)的數(shù)據(jù)類型,這包括了一些標(biāo)準(zhǔn)類型,例如String、int、date等等,也包括了自定義的擴(kuò)展。表達(dá)式被用于各種條件計(jì)算(轉(zhuǎn)移線、網(wǎng)關(guān))以及給數(shù)據(jù)元素賦值。系統(tǒng)與環(huán)境數(shù)據(jù)(SystemandEnvironmentalData)由工作流系統(tǒng)和外部環(huán)境所維護(hù)的數(shù)據(jù),這些數(shù)據(jù)被流程在執(zhí)行過程中使用。資源倉庫(ResourceRepository)執(zhí)行活動(dòng)的資源可以是人、也可以是角色、部門、程序、還可以是自動(dòng)執(zhí)行的機(jī)器資源,所以我們使用資源倉庫將流程所涉及到的資源管理起來。資源倉庫包括了對(duì)組織機(jī)構(gòu)建模的支持。廠商/用戶自定義擴(kuò)展(VendororUserspecificExtensions)工作流系統(tǒng)廠商/用戶可以針對(duì)自己的業(yè)務(wù)需求對(duì)流程元素和屬性進(jìn)行擴(kuò)展。流程交換一般的元模型允許工具交換模型。這些工具有:模擬工具監(jiān)控工具執(zhí)行工具模型工具庫工具下圖展示了再BPM套件中流程交換的使用。三一個(gè)BPMNXML流程的根是definitions元素。在命名狀態(tài),子元素會(huì)包含真正的業(yè)務(wù)流程定義。每個(gè)process子元素可以擁有一個(gè)id和name。的基本結(jié)構(gòu):事件與活動(dòng)和網(wǎng)關(guān)一起,事件用來在實(shí)際的每個(gè)業(yè)務(wù)流程中。事件讓業(yè)務(wù)建模工具用很自然的方式描述業(yè)務(wù)流程,比如“當(dāng)我接收到客戶的訂單,這個(gè)流程就啟動(dòng)”,“如果兩天內(nèi)任務(wù)沒結(jié)束,就終止流程”或者當(dāng)我收到一封取消郵件,當(dāng)流程在運(yùn)行時(shí),使用子流程處理郵件。注意典型的業(yè)務(wù)通常使用這種事件驅(qū)動(dòng)的方式。人們不會(huì)硬編碼順序創(chuàng)建,但是他們傾向于使用在他們的環(huán)境中發(fā)生的事情(比如,事件)。在BPMN規(guī)范中,描述了很多事件類型,為了覆蓋可能的事情,在業(yè)務(wù)環(huán)境中可能出現(xiàn)的情況。事件:空啟動(dòng)事件一個(gè)啟動(dòng)事件說明了流程的開始(或子流程)。圖形形式,它看起來是一個(gè)圓(可能)內(nèi)部有一個(gè)小圖標(biāo)。圖標(biāo)指定了事件的實(shí)際類型會(huì)在流程實(shí)例創(chuàng)建時(shí)被觸發(fā)??諉?dòng)事件畫出來是一個(gè)圓,內(nèi)部沒有圖標(biāo),意思是這個(gè)觸發(fā)器是未知或者未指定的。jPDL的開始活動(dòng)基本是一樣的語法。流程實(shí)例的流程定義包含一個(gè)空啟動(dòng)事件,可以使用executionService的API調(diào)用創(chuàng)建。一個(gè)空開始事件像下面這樣定義。id是必填的,name是可選的。<startEventid="start"name="myStart"/>事件:空結(jié)束事件結(jié)束事件指定了流程實(shí)例中一個(gè)流程路徑的結(jié)束。圖形上,它看起來就是一個(gè)圓擁有厚邊框(可能)內(nèi)部有小圖標(biāo)。圖標(biāo)指定了結(jié)束的時(shí)候會(huì)執(zhí)行哪種操作??战Y(jié)束事件畫出來是一個(gè)圓,擁有厚邊框,內(nèi)部沒有圖標(biāo),這意味著當(dāng)流程到達(dá)事件時(shí),不會(huì)拋出任何信號(hào)。jPDL中的結(jié)束事件與空結(jié)束事件語義相同??战Y(jié)束事件可以像下面一樣定義,id是必填的,name是可選的。<endEventid="end"name="myEnd"/>下面的例子顯示了只使用空開始和結(jié)束事件的流程:這個(gè)流程對(duì)應(yīng)的可執(zhí)行XML像這樣(忽略聲明用的definitions根元素)<processid="noneStartEndEvent"name="BPMN2Examplenonestartandendevent"><startEventid="start"/><sequenceFlowid="flow1"name="fromStartToEnd"sourceRef="start"targetRef="end"/><endEventid="end"name="End"/></process>事件:終止結(jié)束事件終止和的區(qū)別是實(shí)際中流程的路徑是如何處理的(或者使用BPMN的術(shù)語叫做token)。終止結(jié)束事件會(huì)結(jié)束整個(gè)流程實(shí)例,而空結(jié)束事件只會(huì)結(jié)束當(dāng)前流程路徑。他們都不會(huì)拋出任何事情當(dāng)?shù)竭_(dá)結(jié)束事件的時(shí)候。一個(gè)終止結(jié)束事件可以像下面定義。id是必填的,name是可選的。<endEventid="terminateEnd"name="myTerminateEnd"><terminateEventDefinition/></endEvent>終止結(jié)束事件被描繪成結(jié)束事件一樣(圓,厚邊框),內(nèi)部圖標(biāo)時(shí)一個(gè)完整的圓。在下面的例子中,完成task1會(huì)結(jié)束流程實(shí)例,當(dāng)完成task2時(shí)只會(huì)結(jié)束到達(dá)結(jié)束事件的流程路徑,只剩下task1打開。順序流順序流是事件,活動(dòng)和網(wǎng)關(guān)之間的連線,顯示為一條實(shí)線帶有箭頭,在BPMN圖形中(jPDL中等效的是transition)。每個(gè)順序流都有一個(gè)源頭和一個(gè)目標(biāo)引用,包含了活動(dòng),事件或網(wǎng)關(guān)的id。<sequenceFlowid="myFlow"name="MyFlow"sourceRef="sourceId"targetRef="targetId"/>與jPDL的一個(gè)重要區(qū)別是多外向順序流的行為。在jPDL中,只有一個(gè)轉(zhuǎn)移會(huì)成為外向轉(zhuǎn)移,除非活動(dòng)是fork(或自定義活動(dòng)擁有fork行為)。然而,在BPMN中,多外向順序流的默認(rèn)行為是切分進(jìn)入的token(jBPM中術(shù)語叫做execution)分成token集合,每個(gè)順序流一個(gè)。在下面情況中,在完成第一個(gè)任務(wù),就會(huì)激活三個(gè)任務(wù)。為了避免使用一個(gè)順序流,必須添加condition條件到順序流中。在運(yùn)行時(shí),只有當(dāng)condition條件結(jié)果為true,順序流才會(huì)被執(zhí)行?;顒?dòng)(比如用戶任務(wù))和網(wǎng)關(guān)(比如唯一網(wǎng)關(guān))可以用戶默認(rèn)順序流。默認(rèn)順序流只會(huì)在活動(dòng)或網(wǎng)關(guān)的所有其他外向順序流的condition條件為false時(shí)才會(huì)使用。默認(rèn)順序流圖形像是順序流多了一個(gè)斜線標(biāo)記。默認(rèn)順序流通過指定活動(dòng)或網(wǎng)關(guān)的'default'屬性來使用。也要注意,默認(rèn)順序流上的表達(dá)式會(huì)被忽略。網(wǎng)關(guān)BPMN中的網(wǎng)關(guān)是用來控制流程中的流向的。更確切的是,當(dāng)一個(gè)token(BPMN中execution的概念注解)到達(dá)一個(gè)網(wǎng)關(guān),它會(huì)根據(jù)網(wǎng)關(guān)的類型進(jìn)行合并或切分。網(wǎng)關(guān)描繪成一個(gè)菱形,使用一個(gè)內(nèi)部圖標(biāo)來指定類型唯一,廣泛,其他)。所有網(wǎng)關(guān)類型,都可以設(shè)置gatewayDirection。下面的值可以使用:unspecificed(默認(rèn)):網(wǎng)關(guān)可能擁有多個(gè)進(jìn)入和外出順序流。mixed:網(wǎng)關(guān)必須擁有多個(gè)進(jìn)入和外出順序流。converging:網(wǎng)關(guān)必須擁有多個(gè)進(jìn)入順序流,但是只能有一個(gè)外出順序流。diverging:網(wǎng)關(guān)必須擁有一個(gè)進(jìn)入順序流,和多個(gè)外出順序流。網(wǎng)關(guān):唯一網(wǎng)關(guān)唯一網(wǎng)關(guān)表達(dá)了一個(gè)流程中的唯一決策。會(huì)有一個(gè)外向順序流被使用,根據(jù)定義在順序流中的條件。對(duì)應(yīng)的jPDL結(jié)構(gòu),相同的語法是decision活動(dòng)。唯一網(wǎng)關(guān)的完全技術(shù)名稱是'基于數(shù)據(jù)的唯一網(wǎng)關(guān)',但是也經(jīng)常稱為XOR網(wǎng)關(guān)。XOR網(wǎng)關(guān)被描繪為一個(gè)菱形,內(nèi)部有一個(gè)'X',一個(gè)空的菱形,沒有網(wǎng)關(guān)也象征著唯一網(wǎng)關(guān)。下面圖形顯示了唯一網(wǎng)關(guān)的用法:根據(jù)amount變量的值,會(huì)選擇唯一網(wǎng)關(guān)外向的三個(gè)外向順序流中的一個(gè)。網(wǎng)關(guān):并行網(wǎng)關(guān)并行網(wǎng)關(guān)用來切分或同步相關(guān)的進(jìn)入或外出順序流。并行網(wǎng)關(guān)擁有一個(gè)進(jìn)入順序流的和多于一個(gè)的外出順序流叫做'并行切分或'AND-split'。所有外出順序流都會(huì)被并行使用。注意:像規(guī)范中定義的那樣,外出順序流中的條件都會(huì)被忽略。并行網(wǎng)關(guān)擁有多個(gè)進(jìn)入順序流和一個(gè)外出順序流叫做'并行歸并'或AND-join。所有進(jìn)入順序流需要到達(dá)這個(gè)并行歸并,在外向順序流使用之前。下面的圖形顯示了一個(gè)并行網(wǎng)關(guān)可以如何使用。在流程啟動(dòng)后,“prepareshipment”和“billcustomer”用戶任務(wù)都會(huì)被激活。并行網(wǎng)關(guān)被描繪為一個(gè)菱形,內(nèi)部圖標(biāo)是一個(gè)十字,對(duì)切分和歸并行為都是一樣。任務(wù)一個(gè)任務(wù)表示工作需要被外部實(shí)體完成,比如人工或自動(dòng)服務(wù)。重要的是注意BPMN語法的'task'與jPDL語法的區(qū)別。在jPDL中,'task'的概念總是用在人工做一些事情的環(huán)境。流程引擎遇到j(luò)PDL中的task,它會(huì)創(chuàng)建一個(gè)task,交給一些人的任務(wù)列表,然后它會(huì)進(jìn)入等待狀態(tài)。然而在BPMN中,這里有很多任務(wù)類型,一些表示等待狀態(tài)(比如,UserTask一些表示自動(dòng)活動(dòng)(比如,ServiceTask。所以小心不要混淆了任務(wù)的概念,在切換語言的時(shí)候。任務(wù)被描繪成一個(gè)圓角矩形,一般內(nèi)部包含文字。任務(wù)的類型(用戶任務(wù),服務(wù)任務(wù),腳本任務(wù),等等)顯示在矩形的左上角,用小圖標(biāo)區(qū)別。根據(jù)任務(wù)的類型,引擎會(huì)執(zhí)行不同的功能。任務(wù):人工任務(wù)usertask是典型的'人工任務(wù)',實(shí)際中的每個(gè)workflow或BPMN軟件中都可以找到。當(dāng)流程執(zhí)行到達(dá)這樣一個(gè)usertask時(shí),一個(gè)新人工任務(wù)就會(huì)被創(chuàng)建,交給用戶的任務(wù)列表和的主要區(qū)別是(也與人工工作對(duì)應(yīng))是流程引擎了解任務(wù)。引擎可以跟蹤競爭,分配,時(shí)間,其他,這些不是manualtask的情況。usertask描繪為一個(gè)圓角矩形,在左上角是一個(gè)小用戶圖標(biāo)。usertask被定義為下面的BPMNXML:<userTaskid="myTask"name="Mytask"/>根據(jù)規(guī)范,可以使用多種實(shí)現(xiàn)(WebService,WS-humantask,等等)。通過使用implementation屬性。當(dāng)前,只有標(biāo)準(zhǔn)的jBPM任務(wù)機(jī)制才可以用,所以這里(還)沒有定義'implementation'屬性的功能。規(guī)范包含了一些方法把任務(wù)分配給用戶、組、角色等等。當(dāng)前的實(shí)現(xiàn)允許使用一個(gè)resourceAssignmentExpression來分配任務(wù),結(jié)合humanPerformerorPotentialOwner結(jié)構(gòu)。這部分希望在未來的版本里能夠進(jìn)一步演化。potentialOwner用來在你希望確定用戶、組、角色的時(shí)候。這是一個(gè)task的候選人。也要注意,需要在流程外部定義一個(gè)資源,這樣任務(wù)分配器可以引用到這個(gè)資源。實(shí)際上,任何活動(dòng)都可以引用一個(gè)或多個(gè)資源元素。目前,只需要定義這個(gè)資源就可以了(因?yàn)樗且?guī)范中的一個(gè)必須的元素),但是在以后的發(fā)布中會(huì)進(jìn)行加強(qiáng)(比如,資源可以擁有運(yùn)行時(shí)參數(shù))。任務(wù):Java服務(wù)任務(wù)ServiceTask是一個(gè)自動(dòng)活動(dòng),它會(huì)調(diào)用一些服務(wù),比如webservice,javaservice等等。當(dāng)前jBPM引擎只支持調(diào)用javaservice,但是webservice的調(diào)用已經(jīng)在未來的版本中做了計(jì)劃。定義一個(gè)服務(wù)任務(wù)需要好幾行XML(這里就可以看到BPEL的影響力)。當(dāng)然,在不久的未來,我們希望有工具可以把這部分大量的簡化。一個(gè)服務(wù)任務(wù)需要如下定義:<serviceTaskid="MyServiceTask"name="Myservicetask"implementation="Other"operationRef="myOperation"/>服務(wù)任務(wù)需要一個(gè)必填的id和一個(gè)可選的name。implementation元素是用來表示調(diào)用服務(wù)的類型??蛇x值是WebService,Other或者Unspecified。因?yàn)槲覀冎粚?shí)現(xiàn)了Java調(diào)用,現(xiàn)在只能選擇Other。服務(wù)任務(wù)將調(diào)用一個(gè)操作,operation的id會(huì)在operationRef屬性中引用。這樣一個(gè)操作就是下面實(shí)例的interface的一部分。每個(gè)操作都至少有一個(gè)輸入信息,并且最多有一個(gè)輸出信息。<interfaceid="myInterface"<operationid="myOperation2"name="myMethod"><inMessageRef>inputMessage</inMessageRef><outMessageRef>outputMessage</outMessageRef></bpmn:operation></interface>對(duì)于java服務(wù),接口的名稱用來指定java類的全類名。操作的名稱用來指定將要調(diào)用方法名。輸入/輸出信息表示著java方法的參數(shù)/返回值,定義如下所示:<messageid="inputMessage"name="inputmessage"structureRef="myItemDefinition1"/>BPMN中很多元素叫做'item感知',包括這個(gè)消息結(jié)構(gòu)。這意味著它們會(huì)在流程執(zhí)行過程中保存或讀取item。負(fù)責(zé)這些元素的數(shù)據(jù)結(jié)構(gòu)需要使用ItemDefinition。在這個(gè)環(huán)境下,消息指定了它的數(shù)據(jù)結(jié)構(gòu),通過引用structureRef屬性中定義的ItemDefinition。任務(wù):腳本服務(wù)任務(wù)本任務(wù)時(shí)一個(gè)自動(dòng)活動(dòng),當(dāng)?shù)竭_(dá)這個(gè)任務(wù)的時(shí)候流程引擎會(huì)執(zhí)行一個(gè)腳本。腳本任務(wù)使用方式如下:<scriptTaskid="scriptTask"name="ScriptTask"scriptLanguage="bsh"><script><![CDATA[for(inti=0;i<;i++){}]]></script></scriptTask>腳本任務(wù),除了必填id和可選的name之外,還允許指定scriptLanguage和script。因?yàn)槲覀兪褂昧薐SR-223(java平臺(tái)的腳本語言),修改腳本語言就需要:把scriptLanguage屬性修改為JSR-223兼容的名稱在classpath下添加JSR規(guī)范的ScriptEngine實(shí)現(xiàn)上面的XML對(duì)應(yīng)圖形如下所示(添加了空開始和結(jié)束事件)。任務(wù):手工任務(wù)手工任務(wù)時(shí)一個(gè)由外部人員執(zhí)行的任務(wù),但是沒有指定是一個(gè)BPM系統(tǒng)或是一個(gè)服務(wù)會(huì)被調(diào)用。在真實(shí)世界里,有很多例子:安裝一個(gè)電話系統(tǒng),使用定期郵件發(fā)送一封信,用電話聯(lián)系客戶,等等。<manualTaskid="myManualTask"name="Callcustomer"/>手工任務(wù)的目標(biāo)更像文檔/建模提醒的,因?yàn)樗鼘?duì)流程引擎的運(yùn)行沒有任何意義,因此,當(dāng)流程引擎遇到一個(gè)手工任務(wù)時(shí)會(huì)簡單略過。任務(wù):java接收任務(wù)receivetask是一個(gè)任務(wù)會(huì)等到外部消息的到來。除了廣泛使用的webservice用例,規(guī)范在其他環(huán)境中的使用也是一樣的。webservice用例還沒有實(shí)現(xiàn),但是receivetask已經(jīng)可以在java環(huán)境中使用了。receivetask顯示為一個(gè)圓角矩形(和task圖形一樣)在左上角有一個(gè)小信封的圖標(biāo)。在java環(huán)境中,receivetask沒有其他屬性,除了id和name(可選),行為就像是一個(gè)等待狀態(tài)。為了在你的業(yè)務(wù)流程中使用等待狀態(tài),只需要加入如下幾行:<receiveTaskid="receiveTask"name="wait"/>流程執(zhí)行會(huì)在這樣一個(gè)receivetask中等待。流程會(huì)使用熟悉的jBPMsignalmethods來繼續(xù)執(zhí)行。注意,這些可能在未來改變,因?yàn)?signal'在BPMN中擁有完全不同的含義。Executionexecution=("receiveTask");());四BPEL簡介業(yè)務(wù)流程執(zhí)行語言(BusinessProcessExecutionLanguage,BPEL,發(fā)音為'bipple'或'bee-pell'),也叫業(yè)務(wù)過程執(zhí)行語言,是一種基于XML的,用來描寫業(yè)務(wù)流程的編程語言,被描寫的業(yè)務(wù)流程的每個(gè)單一步驟則由Web服務(wù)來實(shí)現(xiàn)。BPEL的目標(biāo)是要實(shí)現(xiàn)業(yè)務(wù)流程定義格式的標(biāo)準(zhǔn)化,使得公司之間可以通過Web服務(wù)無縫的進(jìn)行交互。BPEL是基于Web服務(wù)的,并且依賴于WSDL。一個(gè)BPEL流程可以發(fā)布為一個(gè)WSDL定義的服務(wù),并像其它Web服務(wù)一樣被調(diào)用。而且,BPEL希望一個(gè)Web服務(wù)合成所包含的全部外部Web服務(wù),都是用WSDL服務(wù)契約定義的,這令BPEL流程可以調(diào)用其它BPEL流程,甚至可以遞歸的調(diào)用自己。值得注意的是BPEL不直接支持人機(jī)對(duì)話,BPEL所描寫的過程僅與Web服務(wù)通信,而這些Web服務(wù)卻可以提供與用戶的信息交換,但它們不是用戶本身。用BPEL編寫的流程可以在任何支持BEPL規(guī)范的平臺(tái)或產(chǎn)品上運(yùn)行。BPEL支持兩類不同類型的業(yè)務(wù)流程可執(zhí)行流程:定義了要執(zhí)行的各項(xiàng)具體任務(wù),以及完成業(yè)務(wù)流程所需要調(diào)用的各個(gè)服務(wù),它們遵循編排規(guī)范,可以被一個(gè)編排引擎所執(zhí)行。(orchestration)

抽象流程:詳細(xì)說明了雙方或多方的公共消息交換,但沒有定義流程流的內(nèi)部行為細(xì)節(jié),不可執(zhí)行。(choreography)

BPEL現(xiàn)已成為被業(yè)界廣泛認(rèn)可和接受的進(jìn)行Web服務(wù)編排的事實(shí)標(biāo)準(zhǔn)。BPEL與其它Web服務(wù)技術(shù)的關(guān)系BPEL是建立在Webservices技術(shù)之上的,因此與WSDL、XML、SOAP和UDDI等標(biāo)準(zhǔn)密切相關(guān)。BPEL流程模型是在WSDL定義的服務(wù)模型之上的一層。一個(gè)業(yè)務(wù)流程定義了一個(gè)流程實(shí)例和它的伙伴之間的交互。為了定義一個(gè)業(yè)務(wù)流程,BPEL引入了一些新的XML元素,例如Partners:業(yè)務(wù)事務(wù)中的參與者(actors)Containers:組成業(yè)務(wù)流程中的某一狀態(tài)的一組消息Operations:所需Web服務(wù)的類型Porttypes:operations所要求的相關(guān)Web服務(wù)的關(guān)系BPEL包含的范圍處理活動(dòng)的順序,特別是網(wǎng)絡(luò)服務(wù)互操作。消息和處理實(shí)例之間的關(guān)系。在發(fā)生錯(cuò)誤和例外情況下的恢復(fù)行為處理角色之間的基于網(wǎng)絡(luò)服務(wù)關(guān)系的雙面性。BPEL語言支持的兩類任務(wù)BPEL支持兩類任務(wù)或者說是行為:基本任務(wù)(basictasks)和結(jié)構(gòu)化任務(wù)(structuredtasks)?;救蝿?wù)是指由業(yè)務(wù)流程的一個(gè)基本的步驟,任務(wù)內(nèi)不會(huì)嵌套其它任務(wù);而結(jié)構(gòu)化任務(wù)從外部看是一個(gè)步驟而從內(nèi)部看卻有若干個(gè)步驟。基本任務(wù)包括:Invoke任務(wù)——允許業(yè)務(wù)流程在某一個(gè)Web服務(wù)提供的portType上調(diào)用單向的(one-way)或請求/響應(yīng)(request/respose)操作。Receive任務(wù)——允許業(yè)務(wù)流程停下來等待消息到來。Reply任務(wù)——允許業(yè)務(wù)流程對(duì)收到的消息發(fā)送一個(gè)回復(fù)消息。Wait任務(wù)——通知流程等待一段時(shí)間。Assign任務(wù)——把數(shù)據(jù)從一處復(fù)制到另一處。Throw任務(wù)——表明發(fā)生了某個(gè)錯(cuò)誤。Terminate任務(wù)——終止整個(gè)編排實(shí)例。結(jié)構(gòu)化任務(wù)包括:Sequence任務(wù)——定義一個(gè)有序的任務(wù)序列Switch任務(wù)——根據(jù)條件選擇某一分支Pick任務(wù)——停下并等待某一適當(dāng)消息的到來,或者等到超時(shí)繼續(xù)前進(jìn)。只要多個(gè)觸發(fā)器中的一個(gè)發(fā)生,就執(zhí)行相應(yīng)的活動(dòng),任務(wù)便結(jié)束了。While任務(wù)——定義循環(huán)執(zhí)行,直至滿足某一個(gè)條件的一組任務(wù)。Flow任務(wù)——表明一

溫馨提示

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

評(píng)論

0/150

提交評(píng)論