專注應(yīng)用,關(guān)注發(fā)展,開(kāi)拓創(chuàng)新

          <-------------------------------------------------------------------& 珍惜生命 . 善用時(shí)間 . 把握未來(lái) . 創(chuàng)造價(jià)值。

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            11 Posts :: 17 Stories :: 10 Comments :: 0 Trackbacks

          下面開(kāi)始接觸 JBPM JPDL 部分:

          jpdl 參考手冊(cè)中主要介紹了 processdefinition.xml 文件的格式( schema

          一、 Process archive:

          如前面所描述的, process archive 是商務(wù)流程的規(guī)則描述。它被打成 jar 包,通常以擴(kuò)展名 .par 結(jié)束, jbpm 識(shí)別一個(gè)流程需要三種類型的文件數(shù)據(jù):

          1、 ? 業(yè)務(wù)流程的正式聲明:在 jpdl 中,是以 processdefinition.xml 文件來(lái)表達(dá)。這一章節(jié)我們就來(lái)解析這個(gè)文件的格式。

          2、 ? 設(shè)計(jì)邏輯:在流程上加上規(guī)劃邏輯這些也是在 processdefinition.xml 中給予描述的,在 process archive 中可以嵌套 java-classes 。所有在 process archive 中的 classes 應(yīng)該放在子目錄 /classes 中。

          3、 ? 其他資源文件。作為工作流引擎的客戶端,在運(yùn)行時(shí)你可能想要在流程中包含一些資源文件的變量。例如。窗體( form )的描述與某人執(zhí)行任務(wù)相關(guān)聯(lián)。 Jbpm 不能在你想要包含在一個(gè)流程定義中的資源文件的類型上做任何手腳。

          二、 version 機(jī)制(此處 versioning 可以大致理解為:一個(gè) process archive 部署后轉(zhuǎn)變成過(guò)程定義的過(guò)程。)(此部分需要參考原文理解。感覺(jué)不對(duì)勁)

          作為最最基本的, jbpm 的翻譯機(jī)制遵從下面原理:

          l ???? 每次 process archive 部署的時(shí)候,一個(gè)新的流程定義就在 jbpm 數(shù)據(jù)庫(kù)中被創(chuàng)建。

          l ???? 在部署的時(shí)候, jbpm 安排一個(gè) version 號(hào)碼(數(shù)字)給過(guò)程定義。只有當(dāng)過(guò)程名與被定義的號(hào)相同時(shí)候才會(huì)執(zhí)行 Process archives 。為了實(shí)現(xiàn)安排 version 號(hào)碼,如果它是第一個(gè) version jbpm 采取 1+ (the highest version number of the current process definitions with the same name) 或者 1 。從 jbpm-api 中可以通過(guò)一個(gè)給定的 name 查找最近的過(guò)程定義。

          l ???? 在一個(gè)給定的定義執(zhí)行某一個(gè)過(guò)程實(shí)例,過(guò)程實(shí)例將會(huì)(等到同個(gè)定義結(jié)束前)一直在這個(gè)定義中保持執(zhí)行狀態(tài)。

          l ???? 通過(guò)這種方式能通過(guò)最近定義啟動(dòng)過(guò)程并且在相同定義中的完整的生命周期中保持運(yùn)行狀態(tài)。

          l ???? 注意: jbpm 可以把一個(gè)設(shè)計(jì)的程序邏輯與一個(gè)過(guò)程相關(guān)聯(lián)起來(lái)。通過(guò)在 process archive 中包含類文件, jbpm 將會(huì)對(duì)于每個(gè)過(guò)程定義把 classes 分離出來(lái)。

          ?

          三、 Processdefinition.xml 格式

          ?

          文檔類型定義:

          <!DOCTYPE process-definition PUBLIC

          ? "-//jBpm/jBpm Mapping DTD 2.0 beta3//EN"

          ? "http://jbpm.org/dtd/processdefinition-2.0-beta3.dtd">

          the document type definition of processdefinition.xml

          ?

          過(guò)程定義:

          <!ELEMENT process-definition (? description?,

          ??????????????????????????????? swimlane*,

          ??????????????????????????????? type*,

          ??????????????????????????????? start-state,

          ??????????????????????????????? ( state |

          ????????????????????????????????? milestone |

          ????????? ????????????????????????process-state |

          ????????????????????????????????? decision |

          ????????????????????????????????? fork |

          ????????????????????????????????? join

          ??????????????????????????????? )*,

          ??????????????????????????????? end-state,

          ?????????? ?????????????????????action*? ) >

          <!ATTLIST process-definition name CDATA #REQUIRED >

          dtd fragment for process-definition

          ?

          狀態(tài):

          <!ELEMENT state ( description?, assignment?, action*, transition+ ) >

          <!ATTLIST state name? CDATA #REQUIRED >

          dtd fragment for a state

          ?

          JBPM 中,狀態(tài)( state )這個(gè)術(shù)語(yǔ)與 FSM (有限狀態(tài)機(jī))和 UML 狀態(tài)圖中有著同樣的意思。

          對(duì)商務(wù)流程進(jìn)行建模的目的就是創(chuàng)建一個(gè)軟件系統(tǒng)。我們考慮到過(guò)程定義是軟件系統(tǒng)建立的一部分。所以 jbpm 中的狀態(tài)術(shù)語(yǔ)是以一個(gè)軟件系統(tǒng)的角度來(lái)解釋的。

          狀態(tài)是 jbpm 的核心概念。在 jbpm 中當(dāng)開(kāi)始模仿一個(gè)流程,首要需要考慮的事情就是過(guò)程的狀態(tài)。狀態(tài)將成為你所設(shè)計(jì)的過(guò)程的基本框架。

          以狀態(tài)概念為核心的另外一個(gè)特殊原因是:狀態(tài)在程序語(yǔ)言中沒(méi)有容易重復(fù)混淆的概念。一個(gè)軟件程序或者運(yùn)行或者不運(yùn)行。一個(gè)有代表性的商業(yè)過(guò)程都會(huì)與被分別執(zhí)行的所設(shè)計(jì)的邏輯部分關(guān)聯(lián)。 Jbpm 允許在相關(guān)聯(lián)的程序邏輯中對(duì)狀態(tài)建模。

          Jpdl 也在狀態(tài)之間定義了變遷,決定,分支,合并, milestone flow )。需要注意的,控制流定義在狀態(tài)與狀態(tài)之間。無(wú)論什么情況下,一個(gè)正常的設(shè)計(jì)邏輯是更合適的,過(guò)程開(kāi)發(fā)人員就能夠在一個(gè)過(guò)程事件上指定一個(gè) action Jbpl 與其他過(guò)程定義語(yǔ)言如 bpel 等之間的區(qū)別之一是, jpdl 具備以狀態(tài)管理方式對(duì) java 進(jìn)行擴(kuò)展和與程序語(yǔ)言最小交疊性的能力。

          委派( assignment ):

          ?

          <ELEMENT assignment EMPTY >

          <!ATTLIST assignment swimlane CDATA #IMPLIED

          ???????????????????? assignment (optional|required) #IMPLIED

          ???????????????????? authentication (optional|required|verify) #IMPLIED >

          dtd fragment for an assignment

          ?

          當(dāng)一個(gè)流程執(zhí)行到某種狀態(tài)時(shí)候,工作流引擎將會(huì)等到一個(gè)外部的trigger(通過(guò)調(diào)用jbpmapiExecutionService.endOfState(…))。在這個(gè)方法里面,jbpm將會(huì)算出流程實(shí)例的下一個(gè)狀態(tài)。

          所以一個(gè)狀態(tài)能夠依賴于一個(gè)外部參與者。外部參與者可以是一個(gè)人也可以是某個(gè)系統(tǒng)。有許多種方式來(lái)實(shí)現(xiàn)業(yè)務(wù)流程中的狀態(tài)與任務(wù)相關(guān)聯(lián)。這些任務(wù)基本上可以分為兩組:

          1、 ??????????? 基于客戶端的委派

          在這種策略中,jbpm的用戶管理他們自己用戶的任務(wù)列表。在這種情況,jbpm只是用一個(gè)執(zhí)行引擎來(lái)控管有限狀態(tài)機(jī)。Jbpm的職責(zé)是計(jì)算并且追蹤過(guò)程執(zhí)行中的狀態(tài),然而客戶端的職責(zé)就是確保每個(gè)人知道做了什么。然后客戶端一般就是在一個(gè)給定的狀態(tài)中找到過(guò)程實(shí)例(或者說(shuō)tokens

          2、 ??????????? 基于流程的委派

          (在jbpm2.0 beta3之前支持這種委派策略)

          在這種委派策略中,jbpm將會(huì)擔(dān)負(fù)給參與者安排狀態(tài)并且追蹤任務(wù)列表的職責(zé)。在jbpm中,流程在執(zhí)行過(guò)程中是以一個(gè)token來(lái)進(jìn)行跟蹤的。一個(gè)token有一個(gè)指針來(lái)指向狀態(tài)和一個(gè)參與者。在jbpm中一個(gè)參與者總是引用java.lant.string。為了詳細(xì)說(shuō)明jbpm如何必須安排tokens給參與者們,一些事件與此相關(guān)。接下來(lái)一個(gè)一個(gè)介紹:

          只要一個(gè)客戶端啟動(dòng)一個(gè)過(guò)程實(shí)例或者發(fā)出結(jié)束狀態(tài)的信號(hào),jbpm都會(huì)計(jì)算過(guò)程實(shí)例的下一個(gè)狀態(tài)。

          首要的事情是關(guān)于這些api方法中的第一個(gè)參數(shù):參與者。這個(gè)參與用來(lái)識(shí)別誰(shuí)來(lái)執(zhí)行。

          在啟動(dòng)一個(gè)新的過(guò)程實(shí)例的情況下,一個(gè)root-token在開(kāi)始狀態(tài)中被創(chuàng)建好。在結(jié)束一個(gè)狀態(tài)的情況下,一個(gè)tokenid需要以一個(gè)某種狀態(tài)中的參數(shù)形式指定。然后,jbpm將會(huì)開(kāi)始為token計(jì)算下一個(gè)新?tīng)顟B(tài)。為了簡(jiǎn)單起見(jiàn),我們忽略并發(fā)這種情況。Token將會(huì)經(jīng)歷變遷和節(jié)點(diǎn),然后抵達(dá)下一個(gè)狀態(tài)節(jié)點(diǎn)。在那時(shí),一個(gè)token需要安排一個(gè)參與者。選擇一個(gè)參與者之后,jbpm將通過(guò)token和調(diào)用的方法(開(kāi)始過(guò)程實(shí)例或者結(jié)束狀態(tài))的返回值進(jìn)行關(guān)聯(lián)選擇的參與者

          所以當(dāng)一個(gè)狀態(tài)中的token具備有一個(gè)參與者時(shí),那就意味著過(guò)程實(shí)例的執(zhí)行是在等待這個(gè)參與者提供一個(gè)外部triggerjbpm引擎。在這種情形下,過(guò)程中的狀態(tài)對(duì)應(yīng)一個(gè)用戶的任務(wù),jbpm通過(guò)檢索所有已經(jīng)安排給指定的參與者的tokens計(jì)算任務(wù)列表。現(xiàn)在,參與者能夠從列表中選擇一個(gè)token和發(fā)出結(jié)束狀態(tài)信號(hào)量。

          Assignmentn (委派)有許多屬性:assignmentauthenticationAssingement屬性可以有兩個(gè)值:optionalrequiredRequired意思指當(dāng)執(zhí)行到某一個(gè)狀態(tài)時(shí),jbpm將會(huì)檢測(cè)是否把一個(gè)token安排了一個(gè)參與者。如果非法則會(huì)拋出AssignmentException的異常。如果assingmentoptional=default),當(dāng)?shù)竭_(dá)一個(gè)狀態(tài)時(shí)jbpm就允許離開(kāi)一個(gè)未安排的token。屬性authentication指定約束條件來(lái)限定哪個(gè)參與者可以發(fā)出結(jié)束狀態(tài)的信號(hào)。參與者通過(guò)endOfState方法中的參數(shù)actorid來(lái)指定。如果optional=default意思指對(duì)于指定誰(shuí)來(lái)?yè)?dān)當(dāng)結(jié)束狀態(tài)并不是必須的。Required意味著一個(gè)參與者需要被指定。Vertify意味著結(jié)束狀態(tài)只可以安排給已經(jīng)安排token的參與者。

          更多信息請(qǐng)查看群組委派。查看faqs

          Swimlane

          <!ELEMENT swimlane ( description?, delegation? ) >

          <!ATTLIST swimlane name CDATA? #REQUIRED >

          dtd fragment for swimlane

          非常典型的情況,一個(gè)人具備一個(gè)流程中多個(gè)狀態(tài)的職責(zé)。在 jbpm 中通過(guò)創(chuàng)建一個(gè) swimlane 并且通過(guò) swimlane 安排狀態(tài)給參與者( actor )。一個(gè)業(yè)務(wù)流程中的 swimlane 可以被看做為一個(gè)針對(duì)參與者的角色名字。 Jbpm 對(duì) swimlane 的解釋與 UML1.5 中的術(shù)語(yǔ) swimlane 解釋一致。首次執(zhí)行到達(dá)一個(gè)狀態(tài),給定一個(gè) swimlane ,就會(huì)算出參與者。

          public interface AssignmentHandler {

          ? String selectActor( AssignmentContext assignerContext );

          }

          the AssignmentHandler interface

          swimalne 中的 delegation 標(biāo)簽指向一個(gè) AssignmentHandler 的具體實(shí)現(xiàn)。

          然后那個(gè)參與者( actor )以 swimlane 中同名的方式被存儲(chǔ)為過(guò)程變量。下次當(dāng)一個(gè) process archives 在一個(gè)狀態(tài),利用 swimlane jbpm 引擎將會(huì)檢測(cè)變量并且安排 token 給參與者(存儲(chǔ)在變量中的)

          計(jì)算的結(jié)果是存儲(chǔ)一個(gè) swimlane 同名的過(guò)程變量。所以當(dāng)下一個(gè)狀態(tài)到達(dá)相同的 swimlane 時(shí),狀態(tài)就會(huì)安排給相同的 actor ,而不再用 AssignmentHandler 。因?yàn)樵?/span> swimlane 和參與者之間的關(guān)聯(lián)已經(jīng)存儲(chǔ)在變量中,而且可以通過(guò)更新變量來(lái)改變 swimlane 參與者( actor )之間的關(guān)聯(lián)關(guān)系。

          變量和類型:

          ?

          <!ELEMENT type ( description?, (delegation|transient), variable* ) >

          <!ATTLIST type java-type CDATA #IMPLIED >

          <!ELEMENT transient EMPTY >

          ?

          <!ELEMENT variable EMPTY >

          <!ATTLIST variable name CDATA #REQUIRED >

          dtd fragment for type and variable

          一個(gè)是變量是一種key-value對(duì)。它與過(guò)程實(shí)例(一次過(guò)程執(zhí)行)相關(guān)聯(lián)。Keyjava.lang.stringvalue是任何java類型的任何pojo。所以任何是java類型,即使不給jbpm知道也能被應(yīng)用到變量中。

          變量存儲(chǔ)過(guò)程實(shí)例的上下文信息(context)。變量可以通過(guò)下面幾種方式進(jìn)行設(shè)置讀取:

          • ExecutionService.startProcessInstance( String actorId, Long definitionId, Map variables, String transitionName )

          • ExecutionService.endOfState( String actorId, Long tokenId, Map variables, String transitionName )

          • ExecutionService.setVariables( String actorId, Long tokenId, Map variables )

          • ExecutionContext.setVariable( String name, Object value )

          • ExecutionService.getVariables( String actorId, Long tokenId )

          • ExecutionContext.getVariable( String name )

          當(dāng)設(shè)計(jì)變量時(shí)候,jbpm盡量模仿java.util.map的語(yǔ)義。這一點(diǎn)可以通過(guò)jbpm-api來(lái)了解。也就是說(shuō)一個(gè)變量只能當(dāng)它被插入時(shí)被賦值,任何java類型都可以作為變量中的value

          ?

          一個(gè)type描述jbpm如何存儲(chǔ)變量的值到數(shù)據(jù)庫(kù)中。Jbpm有一個(gè)文本域用來(lái)存儲(chǔ)值,中間以serializer來(lái)實(shí)現(xiàn)文本和對(duì)象之間的轉(zhuǎn)換。

          public interface Serializer {

          ? String serialize( Object object );

          ? Object deserialize( String text );

          }

          the Serializer interface

          一個(gè)type 可以被看做一個(gè)serializer的引用。Jbpm包含了一些默認(rèn)serializer的實(shí)現(xiàn),其中包括下面java類型:

          java.lang.String

          java.lang.Long

          java.lang.Double

          by default supported java-types

          ?

          變量類型匹配:

          Java 類型聲明的變量已經(jīng)被默認(rèn)支持,而不用在processdefinition.xml聲明。Jbpm有個(gè)自動(dòng)轉(zhuǎn)換機(jī)制:當(dāng)一個(gè)變量初始化后,jbpm按照下面步驟,首先檢測(cè)java類型。如果它默認(rèn)被java支持,那么就可以正常使用,否則,jbpm檢查聲明的類型是否與processdefinition.xmljava-type屬性定義的變量是否一致。在匹配過(guò)程中jbpm也考慮變量值的父類。如果沒(méi)有找不到這種類型,jbpm就把這樣的變量作為transient(瞬間)變量對(duì)待。為了避免jbpm不得不執(zhí)行匹配過(guò)程,你可以把變量指定到它各自類型中去。

          Transient (瞬間)變量:

          一些變量并不需要做持久層處理存儲(chǔ)在數(shù)據(jù)庫(kù)中,jbpm支持瞬時(shí)變量。這樣的變量不存儲(chǔ)到數(shù)據(jù)庫(kù)中并且只可以在jbpm-api的方法中使用。換句話說(shuō),瞬時(shí)變量的使用范圍是:jbpm-api的方法。

          開(kāi)始狀態(tài):

          <!ELEMENT start-state ( description?, transition+ ) >

          <!ATTLIST start-state name? CDATA #REQUIRED

          ????????????????????? swimlane CDATA #IMPLIED >

          dtd fragment for start-state

          開(kāi)始狀態(tài)是一個(gè)過(guò)程中的唯一狀態(tài),所有的過(guò)程實(shí)例從這里開(kāi)始,注意在過(guò)程實(shí)例開(kāi)始的時(shí)刻你能夠把變量放在過(guò)程當(dāng)中了。另外重點(diǎn)的概念是你能夠有多個(gè)從開(kāi)始狀態(tài)出發(fā)的變遷,這樣的話,就需要你指定哪個(gè)變遷是你啟動(dòng)過(guò)程實(shí)例時(shí)候需要執(zhí)行的。

          milestone

          <!ELEMENT milestone ( description?, action*, transition ) >

          <!ATTLIST milestone name? CDATA #REQUIRED>

          dtd fragment for a milestone

          ?

          一個(gè) milestone 是一種特殊的狀態(tài),它用來(lái)處理兩個(gè)并發(fā)事件中的同步的作用。一個(gè) milestone 可以被應(yīng)用在下面情形:一條執(zhí)行路徑需要等待另外一個(gè)執(zhí)行路徑上的事件。如果 milestone 沒(méi)有到達(dá),接下來(lái)的執(zhí)行就必須在 milestone 處等待,知道另外一個(gè)并發(fā)路徑到達(dá)的時(shí)候,才可繼續(xù)執(zhí)行。如果 milestone 已經(jīng)到達(dá)了(條件具備了),接下來(lái)的執(zhí)行就是通過(guò)這個(gè) milestone 狀態(tài)。關(guān)于 milestone 的更多信息和圖形請(qǐng)參看工作流模式。一個(gè) milestone 與一或多個(gè) actions (用信號(hào)通知 milestones 到達(dá))相關(guān)聯(lián)。那些 actions 能夠用默認(rèn) ActionHandler org.jbpm.delegation.action.MilestoneReachdActionHandler 在流程中建模。所以 actions (發(fā)信號(hào)給 jbpm 引擎告訴它一個(gè) milestone 已經(jīng)到達(dá))能夠像下面這樣在 processdefition.xml 中調(diào)度:

          ? ...

          ? <milestone name="theMilestone">

          ??? <transition to="stateAfterMilestone" />

          ? </milestone>

          ? ...

          ? <state name="stateBeforeReachingMilestone" swimlane="initiator">

          ??? <transition to="stateAfterReachingMilestone">

          ? ???? <action>

          ????? ??? <delegation class="org.jbpm.delegation.action.MilestoneReachedActionHandler">theMilestone</delegation>

          ????? </action>

          ??? </transition>

          ? </state>

          ? ...

          modelling a milestone in the processdefinition.xml

          ?

          process-state:

          <!ELEMENT process-state ( description?, delegation, action*, transition+ ) >

          <!ATTLIST process-state name CDATA #REQUIRED>

          dtd fragment for a process-state

          一個(gè) process-state 符合父過(guò)程的 invocation 。父過(guò)程執(zhí)行到一個(gè) procee-state 時(shí)候就開(kāi)始一個(gè)子過(guò)程的執(zhí)行。過(guò)程殘留在 process-state 中用以子過(guò)程的持續(xù)。當(dāng)一個(gè)子過(guò)程完成后,就從一個(gè) process-state 中離開(kāi)了。

          Decision:

          <!ELEMENT decision ( description?, delegation, action*, transition+ ) >

          <!ATTLIST decision name CDATA #REQUIRED>

          dtd fragment for a decision

          一個(gè) decision 用以決定在多個(gè)執(zhí)行路徑中哪個(gè)才可以被執(zhí)行。如果你是一個(gè)程序員,把它可以理解成 if-then=else 結(jié)構(gòu)即可,當(dāng)然。一個(gè) decision 能夠具有許多離開(kāi)的變遷。

          需要注意的是一個(gè) decision 對(duì)某個(gè)情況建模,在這里工作流引擎根據(jù)上下文( =variables )和一些其他外部資源決定哪個(gè)路由可以被接受。作為可供選擇的(可以替代的做法),你設(shè)計(jì)從一個(gè)狀態(tài)出發(fā)具備多個(gè)變遷。在那種情況下, jbpm 客戶端必須通過(guò)調(diào)用以一個(gè)選擇變遷名字作為一個(gè)參數(shù)的 endOfState 方法決定哪個(gè)變遷被執(zhí)行。

          Fork (分支):

          <!ELEMENT fork ( description?, delegation?, action*, transition+ ) >

          <!ATTLIST fork name?????????????? CDATA #REQUIRED

          ?????????????? corresponding-join CDATA #IMPLIED>

          dtd fragment for a fork

          這個(gè)比較好理解,定義一般普通的 fork 行為一般是通過(guò) ForkHandler 接口。但是默認(rèn)行為(當(dāng)在 fork 中沒(méi)有 delegetion 時(shí)候)是 fork 的每個(gè)變遷都將獲得一個(gè)子 token 。所以僅僅對(duì)一些高級(jí)外來(lái)的并發(fā),你才需要實(shí)現(xiàn) ForkHandler.

          一般情況下,一個(gè) fork 會(huì)有一個(gè)相關(guān)的 join 。這個(gè) join 定義個(gè)并發(fā)的 block 。默認(rèn)下 fork join 僅支持嚴(yán)格的嵌套,并且默認(rèn)情況不支持繞過(guò)并發(fā) block 邊界的變遷。

          public interface ForkHandler {

          ? void fork( ForkContext forkContext ) throws ExecutionException;

          }

          the ForkHandler interface

          ?

          join

          <!ELEMENT join ( description?, delegation?, action*, transition ) >

          <!ATTLIST join name?????????????? CDATA #REQUIRED

          ?????????????? corresponding-fork CDATA #IMPLIED>

          dtd fragment for a join

          ?

          一個(gè) fork joins 用于多條路徑執(zhí)行,用 JoinHandler 接口指定普通的 join 行為。但是默認(rèn)情況下(沒(méi)有 delegation )是所有 fork 上的子 token 合并。最后 token 到達(dá) join 將會(huì)觸發(fā)父 token 最后引發(fā) join 上的離開(kāi)變遷。所以僅僅高級(jí)外來(lái)的并發(fā)你才需要實(shí)現(xiàn) JoinHandler.

          約束:一個(gè) join 只能有一個(gè)離開(kāi)變遷。

          public interface JoinHandler {

          ?? void join( JoinContext joinContext ) throws ExecutionException;

          }

          the JoinHandler interface

          ?

          結(jié)束狀態(tài):

          <!ELEMENT end-state EMPTY >

          <!ATTLIST end-state name CDATA #REQUIRED>

          dtd fragment for end-state

          一個(gè)過(guò)程定義有一個(gè)精確的結(jié)束狀態(tài)。當(dāng)一個(gè)過(guò)程實(shí)例執(zhí)行到一個(gè)結(jié)束狀態(tài)時(shí)候,這個(gè)過(guò)程實(shí)例就結(jié)束了。

          ?

          變遷( transition ):

          <!ELEMENT transition ( action* )>

          <!ATTLIST transition name CDATA #IMPLIED

          ?????? ??????????????to?? CDATA #REQUIRED>

          dtd fragment for a transition

          變遷用來(lái)指定節(jié)點(diǎn)之間的連接。變遷元素應(yīng)該放在 node 里面,那么這個(gè)變遷就會(huì)從這個(gè)節(jié)點(diǎn)出離開(kāi)。

          ?

          Action

          <!ELEMENT action ( delegation ) >

          <!ATTLIST action event-type (process-start|process-end|

          ???????????????????????????? state-enter|state-leave|state-after-assignment|

          ???????????????????????????? milestone-enter|milestone-leave|

          ???????????????????????????? decision-enter|decision-leave|

          ???????????????????????????? fork-enter|fork-every-leave|

          ???????????????????????????? join-every-enter|join-leave|

          ???????????????????????????? transition) #IMPLIED>

          dtd fragment for an action

          一個(gè) action 是一段 java 代碼。在過(guò)程執(zhí)行期間在一些事件基礎(chǔ)之上 action 在工作流引擎上執(zhí)行。

          Action 總是被定義成一個(gè)過(guò)程定義元素( process-definition, state, transition, decision, ... )的子元素。當(dāng) action 執(zhí)行的時(shí)候,父元素會(huì)在過(guò)程執(zhí)行時(shí)候外加一些事件類型來(lái)定義精確時(shí)刻。可以想象得到,一個(gè) action 的可能事件類型依賴于 action 被包含進(jìn)去的元素。 事件類型名字( event-type-names )被暗示出是他們應(yīng)用到的元素(理解有誤)。 javadoc 中有事件類型,可以進(jìn)行查看。

          ?

          public interface ActionHandler {

          ? void execute( ExecutionContext executionContext );

          }

          the ActionHandler interface

          ?

          delegation

          <!ELEMENT delegation ( #PCDATA ) >

          <!ATTLIST delegation class CDATA #REQUIRED>

          dtd fragment for a delegation

          解釋在約束元素和 delegation 類必須實(shí)現(xiàn)的接口之間的關(guān)聯(lián)。

          四、其他 process archive 文件

          當(dāng)一個(gè) process archive 被部署, processdefinition.xml 將被解析并且把信息存儲(chǔ)到 jbpm 數(shù)據(jù)庫(kù)中去。所有其他的文件或者被存儲(chǔ)在數(shù)據(jù)庫(kù)中或者文件系統(tǒng),與被創(chuàng)建的過(guò)程定義相關(guān)聯(lián)。作為一 jbpm api 的客戶端你能夠通過(guò) ExecutionReadService.getFile( Long processDefinitionId, String fileName ) 訪問(wèn)這些文件。

          一個(gè) process archive 和一個(gè)過(guò)程定義( process definition )之間的區(qū)別參看 versioning mechanism

          posted on 2006-05-06 16:38 吳名居 閱讀(524) 評(píng)論(0)  編輯  收藏 所屬分類: ERP/CRM-compie

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 水城县| 湛江市| 象州县| 大宁县| 沈丘县| 德州市| 无棣县| 汉源县| 金寨县| 航空| 晋城| 依安县| 凌云县| 资兴市| 永康市| 色达县| 叶城县| 秀山| 罗甸县| 贵州省| 张北县| 宽城| 雷山县| 渑池县| 静安区| 松桃| 利津县| 巴里| 龙州县| 永济市| 习水县| 涞源县| 平度市| 拜城县| 宿迁市| 永平县| 隆尧县| 阳信县| 普宁市| 武胜县| 盈江县|