下面開(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)用jbpm的api,ExecutionService.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è)外部trigger給jbpm引擎。在這種情形下,過(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 (委派)有許多屬性:assignment和authentication。Assingement屬性可以有兩個(gè)值:optional和required。Required意思指當(dāng)執(zhí)行到某一個(gè)狀態(tài)時(shí),jbpm將會(huì)檢測(cè)是否把一個(gè)token安排了一個(gè)參與者。如果非法則會(huì)拋出AssignmentException的異常。如果assingment是optional(=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
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)。Key是java.lang.string,value是任何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.xml中java-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
。