版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
【最新卓越管理方案您可自由編輯】
(BPM業(yè)務(wù)流程管
理)JBBPM精要講義及培
訓(xùn)課件
2020年5月
多年的企業(yè)咨詢顧問經(jīng)驗,經(jīng)過實戰(zhàn)驗證可以落地執(zhí)行的卓越管理方案,值得您下載擁有
JBossjBPM3.0
下一頁
JBossjBPM3.0
WorkflowandBPM實踐
目錄
L介紹
l.L綜述
12TheJBossjBPM新手工具箱
L3.TheJBossjBPM流程圖形設(shè)計器
1.4.TheJBossjBPM核心組件
15TheJBossjBPM控制臺w制應(yīng)用
1.6.TheJBossjBPM身份組件
L7.TheJBossjBPM日程安排程序
L8.TheJBossjBPM兼容數(shù)據(jù)庫包
L9.TheJBossjBPMBPEL擴展
2.開始
2.1.下載一覽
2.1.1.iBPM3
2.1.LL新手工具箱
2.1.12核心引擎和身份組件
2.L13數(shù)據(jù)庫擴展
2.12jBPM流程設(shè)計器
2.121.Eclipse更新站點
2.1.22Eclipse特點
2.1.3.jBPMBPEL擴展
22TheJBossjBPM項目目錄
2.3.公開CVS訪問
3.指南
3.1.HelloWorld例子
32數(shù)據(jù)庫例子
3.3.上下問(context)例子:流程變量
34任務(wù)分派例子
35定制動作Action例子
4.面向圖的程序設(shè)計
4.1.缺少的一環(huán)
42圖解表示和開發(fā)過程
43習(xí)慣方法
44什么是面向圖的程序設(shè)計
45組建塊
5.發(fā)布
5.L運行時的相關(guān)部分
5.1.LJava運行環(huán)境
5.12jBPM庫
5.13運行時需要的庫
52配置文件
5.2.1.perties
522.Hibernatecfgxmlfile
523.業(yè)務(wù)日歷配置文件
524.變量映射配置穩(wěn)健
525.轉(zhuǎn)換器配置文件
526.缺省模塊配置文件
527.流程文檔解析器配置文件
53在Web應(yīng)用程序中使用jBPM
54在EJB包容器中使用中PM
6.永久化
6.L永久化API
62數(shù)據(jù)庫配置
6.3.管理事務(wù)
64jBPM數(shù)據(jù)庫
6.4.1.Hibernate集成
6.42開發(fā)數(shù)據(jù)庫是hsqldb
6.4.3.其他數(shù)據(jù)庫的支持
6.44高速緩沖存儲器
6.5.Hibernate定制
7.流程模型
7.1.綜述
7.2.流程圖(processGraph)
7.3.節(jié)點(Nodes)
7.3.1.節(jié)點(Node)職責(zé)
7.3.2.節(jié)點類型(Nodetype)任務(wù)(task-node)
7.3.3.節(jié)點類型(Nodetype)狀態(tài)(state)
7.3.4.節(jié)點類型(Nodetype)判定(decision)
7.35節(jié)點類型(Nodetype)分叉(fork)
7.3.6.節(jié)點類型(Nodetype)聯(lián)合(join)
7.3.7.節(jié)點類型(Nodetype)節(jié)點(node)
7.4.動作(Actions)
741.動作配置
7.42動作引用
7.4.3.事件
7.44事件傳播
7.4.5.Script
746.定制事件
7.5.超狀態(tài)(superstate)
7.5.1.超狀態(tài)變遷
7.52超狀態(tài)事件
753.分級名字
76異常處理
7.7.流程組成
78定制節(jié)點行為
79圖(Graph)執(zhí)行
8.上下文(Context)
8.1.存取變量
82變量的使用期限
8.3.變量永久化
8.4.變量范圍
8.4.1.變量重載(overloading)
8.42變量重寫(overriding)
85瞬間變量
8.6.定制變量永久化
9.任務(wù)管理
9」.任務(wù)
92任務(wù)實例
921.任務(wù)實例生命周期
922.任務(wù)實例及圖執(zhí)行
9.3.委派(Assignment)
9.3.1.委派接口
9.32委派數(shù)據(jù)模型
9.3.3."推"模型
9.3.4."拉"模型
9.4.泳道(Swimlanes)
95任務(wù)事件
9.6.任務(wù)定時器
9.7.任務(wù)控制器
98定制任務(wù)實例
99身份組件
991.身份模型
9.92賦值表達式
9.921.第一個術(shù)語
9.922.下一個術(shù)語
993.刪除身份組件
1。調(diào)度程序
101定時器
102調(diào)度程序發(fā)布
11業(yè)務(wù)日歷
11.L持久時間
112配置
12.記錄
12.1.建立日志
122日志檢索
123數(shù)據(jù)倉庫
13.jBPM流程定義語言(JPDL)
13.L流程檔案
13.1.L發(fā)布流程檔案
13.12流程版本(versioning)
13.1.3.流程轉(zhuǎn)換(conversion)
132代理
1321.jBPM類載入器
13.22流程類載入器(classloader)
1323.代理配置
1323.1.配置類型field
13232配置類型bean
.酉己置類型constructor
.酉己置類型configuration-property
13.3.JPDLxmlschema
13.3.1.process-definition(流程定義)
13.32node(節(jié)點)
13.3.3.commonnodeelements(常見節(jié)點元素)
13.3.4.start-state(開始狀態(tài))
13.3.5.end-state(結(jié)束狀態(tài))
13.3.6.state(狀態(tài))
13.3.7.task-node(任務(wù)節(jié)點)
13.3.8.process-state(流程狀態(tài))
13.3.9.super-state(超狀態(tài))
13.3.10.fork(交叉)
13.3.11.join(聯(lián)合)
13.3.12.decision(判定)
13.3.13.event(事件)
13.3.14.transition(轉(zhuǎn)換)
13.3.15.action(動作)
13.3.16.script(腳本)
13.3.17.expression(表達式)
13.3.18.variable(變量)
13.3.19.handler(處理器)
13.3.20timer(定時器)
13.3.2Lcreate-timer(建立定時器)
13.3.22.cancel-timer(放棄定時器)
13.3.23.task(任務(wù))
13.3.24.swimlane(泳道)
13.3.25.assignment(委派)
13.3.26.controller(控制器)
13.3.27.sub-process(子流程)
13.3.28.condition(條件)
13.3.29.exception-handler(異常處理)
14.安全
14.1.要做的
142驗證
143授權(quán)
15.TDDforworkflow
15.1.IntroducingTDDforworkflow
152XMLsources
1521.Parsingaprocessarchive
15.22Parsinganxmlfile
1523.ParsinganxmlString
15.3.Testingsubprocesses
16.可插入架構(gòu)
下一步
Chapter1.介紹
第一章:介紹
前一頁后一頁
第一章:介紹
JBossjBPM是一個復(fù)雜的可擴展的工作流管理系統(tǒng).JBossjBPM有直觀的流
程語言來表示商業(yè)流程圖的術(shù)語比如,任務(wù),異步通訊的等待狀態(tài),定時器,自動操
作等等.把這些操作綁在一起〃JBossjBPM就有了最強大和易擴展性的控制流
機制.
JBossjBPM只有最小的倚賴性可以很容易的作為java庫來使用.當(dāng)然它也可以
用在吞吐量極為關(guān)鍵的J2EE群應(yīng)用服務(wù)器環(huán)境中.
JBossjBPM可以同任何數(shù)據(jù)庫配置可以部署在任何應(yīng)用服務(wù)器上.
1.1.綜述
核心工作流和BPM功能被封狀作為一個簡單的Java庫.這個庫包括在jBPM數(shù)
據(jù)庫中存儲,更新和檢索流程信息的服務(wù)
Figure1.1.JBossjBPM組件一覽
1.2.JBossjBPM新手工具箱
新手工具箱是包含了jBPM所有組件包在一個可下載的包里.
這個包包括:
jbpm-server,預(yù)先配置的jboss應(yīng)用服務(wù)器.
jbpm-designer,jBPM流程圖形化設(shè)計器的eclipse插件.
jbpm-dbJBPM數(shù)據(jù)庫兼容包(參看下面).
jbpm,核心jbpm組件包括庫和本手冊.
jbpm-bpel,JBossjBPMBPEL擴展參考.
預(yù)配置的JBoss應(yīng)用服務(wù)器有下列安裝組件:
核心jBPM組件,打包作為JBoss服務(wù)檔案
一個包括所有jBPM表格的完整數(shù)據(jù)庫:默認(rèn)的hypersonic數(shù)據(jù)庫
包含所有的jBPM表格和已經(jīng)定義的流程.
jBPM控制臺web應(yīng)用程序這個可以用來為jBPM管理員.
jBPM調(diào)度程序所有定時器的執(zhí)行.調(diào)度程序在新手工具箱里配置成了
一個servlet.這個Servlet會為產(chǎn)生一個線程來監(jiān)視每個定時器的執(zhí)行.
一介流程例子已經(jīng)發(fā)布進了jBPM數(shù)據(jù)庫.
1.3.JBossjBPM圖形化流程設(shè)計器
JBossjBPM也包括一個圖形化的流程設(shè)計工具.這個設(shè)計器是用來創(chuàng)作商業(yè)流
程的
JBossjBPM圖形設(shè)計器是一個Eclipse插件.獨立安裝版本的設(shè)計器工具已經(jīng)
在開發(fā)路線圖里了.
圖形化設(shè)計工具最重要的特性是它同時支持業(yè)務(wù)分析員和技術(shù)開發(fā)人員.這樣
就可以在業(yè)務(wù)流程建模和實際執(zhí)行之間平滑轉(zhuǎn)換.
插件可用做為本地的updatesite(Eclipse純粹的zip文件),用做符合Eclipse軟
件更新機制的安裝包.當(dāng)然你也可以把它展開到你的Eclipse的安裝目錄.
1.4JBossjBPM核心組件
JBossjBPM核心組件是純粹的Java(J2SE)軟件,來處理流程定義和運行時的流
程實例執(zhí)行.
JBossjBPM是一個Java庫.因此它可以用在任何java環(huán)境比如web應(yīng)用程
序,Swing應(yīng)用程序,EJB,WebService等等.jBPM庫可以被打包作為sateless
sessionEJB(無狀態(tài)會話EJB).這可以用做集群的發(fā)布具有極高的吞吐量可伸縮
性.無狀態(tài)會話EJB根據(jù)J2EEL3規(guī)范重新寫過所以可以發(fā)布到任何應(yīng)用服務(wù)器
上.
JBossjBPM核心組件被打包成一個簡單的Java庫文件.依賴你所使用的功能
性,庫jbpm-3.0.jar及一些相關(guān)的第三方的庫比如.hibernate,dom4j等等.這些
相關(guān)性在第五章發(fā)布有清晰的描述
永久性方面,jBPM內(nèi)部使用hibernate.除了傳統(tǒng)的0/R映射外,hibernate也
分析不同數(shù)據(jù)庫系統(tǒng)的SQL方言,這使jBPM在當(dāng)前所有的數(shù)據(jù)庫上都可以移
植.
JBossjBPMAPI可以從項目中任意編寫的Java軟件訪問,比如Web應(yīng)用程
序,EJB,或webService組件,消息bean或其他java組件.
1.5.JBossjBPM控制臺web應(yīng)用程序
jBPM控制臺web應(yīng)用程序是為兩個目的服務(wù)的.首先,它作為流程執(zhí)行運行時
間任務(wù)生成的中央用戶接口.其次,它也是一個管理和監(jiān)視控制臺允許檢查和操
作運行中的流程實例.
1.6.JBossjBPM身份組件
JBossjBPM可以集成進任何包含公司用戶和組織信息的目錄.對項目來說從那
里得到組織信息組件不是容易得到的,JBossjBPM就包含這個組件.身份組件
使用的模型比通常的servlet,ejb和門戶模型跟富有.
更多信息可參考章節(jié)信9,"身份組件"
1.7.JBossjBPM調(diào)度程序
JBossjBPM調(diào)度程序是用來監(jiān)視和運行已經(jīng)計劃到時執(zhí)行流程的定時器的組
件.
定時器組件被打包在核心jbpm庫中,但是它需要被發(fā)布到下面的任一環(huán)境中:
要不你把調(diào)度程序Servlet來產(chǎn)生監(jiān)視線程或者就必須用獨立的JVM來調(diào)用調(diào)
度程序的main方法.
1.8.JBossjBPM數(shù)據(jù)庫兼容包
JBossjBPM數(shù)據(jù)庫兼容包包括所有支持?jǐn)?shù)據(jù)庫的相關(guān)信息JDBC驅(qū)動程序和
數(shù)據(jù)庫初始化腳本.
1.9.JBossjBPMBPEL擴展
JBossjBPMBPEL擴展是獨立的擴展包用來支持BPEL(BusinessProcess
ExecutionLanguage商業(yè)流程執(zhí)行語言).BPEL的基本要素是xmlScripting
語言用來寫其他webserver的webservices.
前一頁Up后一頁
JBossjBPM3.0首取第二章:開始
第二章開始
前一頁后一頁
第二章開始
本章將帶你如何獲得JBossjBPM的第一步并且提供
立即運行的初始提示.
2.1.下載包一覽
下面是當(dāng)前可用的不同jBPM包清單.這些包中的每一個都包含一個或多個可下
載的文件.同這些文件一起的包含一個描述它的內(nèi)容及相關(guān)安裝的指示
所有下面下載的描述都可以在thesourceforgejbpm下載頁面.上找到
2.1.1.jBPM3
這是主要的發(fā)行包,包括了主要核心引擎和數(shù)個額外的你使用jBPM的時候可能
用得上的包.下載這個包的文件從這里.
.新手工具箱
如果你想盡快開始運行jBPM,那么這就是你想下載的文件.工具箱包含了所有
jBPM的模塊以及圖形化的設(shè)計工具在一個單獨下載的文件里名字為:
'jbpm-starters-kit-<version>.zip'.展開這個壓縮文件到目錄下閱讀
,readme.html,獲取更多信息、.有了這個工具箱,你可以立即開始進入第三章
講座.
.核心引擎和身份組件
下載文件名為‘jbpm-<version>.zip,包含jBPM核心引擎也包含角色和組管
理的身份組件.開始工作前,展開文件到一個目錄下,然后‘jbpm-〈version〉,文
件夾下找到包含重要的參考信息的‘readme.html,文件
2.1.13.數(shù)據(jù)庫擴展
如果你想改變jBPM的默認(rèn)數(shù)據(jù)庫(HypersonicHSQLDB),你需要下載這個
包.文件名為‘jbpm-db-<version>.zip,包含你改變數(shù)據(jù)庫需要的各種資源.包
含,數(shù)據(jù)庫建立腳本,hibernate屬性文件及數(shù)據(jù)庫JDBC驅(qū)動程序.如何操作
的步驟包含在'readme.html,文件里,它在你展開這個壓縮包的最上層的目錄
下.
2.1.2.jBPM流程設(shè)計器
ThesecondpackagecontainsthedownloadsrelatedtothejBPM
GraphicalProcesDesigner.Thedesignerenablesyoutoauthoryour
processdefinitionsandtoeasilydeploythem.Youcanfindthese
downloadshere.Thedesignerisaplug-infortheEclipseplatformwhich
isavailablefordownloadeitherasazippedEclipsefeatureorasazipped
Eclipseupdatesite.Thereisnodifferenceincontent,theonlydifference
isinthewayyouhavetodotheinstallation.
.Eclipse更新站點
Ifyouwanttobeabsolutelysurethatthedesignerinstallationgoes
smoothly,werecommendtousetheupdatesitemechanismtogether
withanewEclipseinstallation.OfcourcetheEclipseversionshould
matchthedownloadedupdatesitearchive.ToobtaintheProcess
DesignerUpdateSite,youshoulddownloadthefile
'jbpm-gpd-site-<version>.zip'.Thenfollowtheinstructionsinthe
'readme.html'fileincludedinthearchivesrootfoldertosuccesfully
installtheGPD.
.Eclipse特性
IfyouaretiredofeachtimehavingtodoafreshEclipseinstallationand
youarewillingtocopewithsomepossibleissues,youcantrythefeature
download.Inthiscaseinstallationisaseasyasextractingthearchiveinto
yourEclipseinstallation(makesuretheincluded'plugins'and'features'
foldersendupinthesamelocationofyourEclipseinstallation)
overwritingthefilesandfolderswiththesamenamethatarepossibly
alreadypresent.Thisinstallationisveryeasy,butyoucouldruninto
incompatibilityissueswhenyouoverwritepluginsalreadypresentin
yourinstallationbecauseofotherfeaturesthatyoudidinstall.Though
theyhavethesamenameitcouldhappenthattheversionsofthese
collidingpluginsarenotequal,hencethepossibleincompatibilities.
Downloadthefile'jbpm-gpd-feature-<version>.zip'toobtaintheGPD
feature.Theinstallationinstructionsarerepeatedinthe'readme.html'
file.
2.1.3.jBPMBPEL擴展
第三個也是最后一個包包含jBPMBPEL擴展.它只包含一個文件:
'jbpm-bpel-<version>.zip'.你可以找到這個包在這里.要開始BPEL擴展,在
doc目錄下找到User'sGuide.
2.2.JBossjBPM項目號碼簿
professionalsupport:JBossisthecompanythatbacksthisprojectwith
professionalsupport,trainingandconsultancyservices.
userguide:isthedocumentyou'rereadingandservesasthemainentry
pointintotheproject.
downloaddescriptions:descriptionofthedownloadables
downloads:sourceforgedownloadpageforjBPM
forums:getincontactwiththecommunity,askquestionsanddiscussjBPM
wiki:extrainformation,mostlyprovidedbythecommunity
issuetracker:forsubmittingbugsandfeaturerequests
roadmap:showswhattoexpectinthenextversions
mailinglists:mailinglistsareusedforannouncements
javadocs:partofthedownloadinthedoc/javadocdirectory,
cvs:thedetailsofhowtogetthejBPMsourcesfromCVS
2.3.公開的CVS訪問
另外,你可以通過JBossjBPMcvs服務(wù)器得到j(luò)BPM
服務(wù)器的信息如下
Connectiontype:pserver
User:anonymous
Password:
Host:
Port:2401(whichisthedefault)
Repositorypath:/cvsroot/jbpm
Label::pserver:anonymous@/cvsroot/jbpm
第三章.講座
前一頁后一頁
第三章.講座
這個講座將展示如何建造一個jpdl和如何使用API的方法來管理運行時的執(zhí)行.
這個講座的方式是解釋一系列的例子.每個例子將集中關(guān)注特別的主題和額外
的說明.這些例子可以在jBPM包的examples目錄下找到.
最好的方法就是學(xué)著來建立一個Project實驗所給的例子.
eclipse用戶注意:下載jbpm-3.0-[version].zip并且解壓縮到系統(tǒng).然后從菜單
"File"-->"Import..."-->"ExistingProjectintoWorkspace".點"Next"然
后瀏覽jBPM根目錄然后點擊"Finish".現(xiàn)在你的有了jbpm3project了.你
可以發(fā)現(xiàn)這個講座目錄在目錄src/java.examples/….你打開這些例子后,可以運
行它們"Run""RunAs..."->"JUnitTest"
jBPM包括一個圖形設(shè)計器來產(chǎn)生例子中的XML.你可以從這里下載和學(xué)習(xí)有
關(guān)圖形設(shè)計器的說明節(jié)2.1,"下載一覽"
3.1.HelloWorld例子
一個流程是有一個定向圖(directedgraph)來定義,由節(jié)點和變換組成.hello
world流程有3個節(jié)點.如下看如何組合起來,我們先開始一個簡單的流程不使
用圖形設(shè)計器.下面的圖形表示helloworld流程:
Figure3.1.helloworld流程圖
publicvoidtestHelloWorldProcess(){
//這個方法展現(xiàn)流程定義和流程執(zhí)行的定義
//流程定義有3個節(jié)點.
//一個未命名的開始狀態(tài)start-state,一個狀態(tài),s'
//一個結(jié)束狀態(tài)名字為'end.
//下面行解析一個xmltext為一個ProcessDefinition對象(流
程定義)
//ProcessDefinition把流程定義形式描述為java對象
ProcessDefinitionprocessDefinition=
ProcessDefinition.parseXmlString(
"<process-definition>"+
"<start-state>"+
〈transitionto='s'/>"+
"</start-state>"+
"<statename='s'>"+
"〈transitionto='end'/>"+
"</state>"+
"<end-statename='end'/>"+
"</process-definition>"
);
//下一行建立了一個流程執(zhí)行定義.
〃在構(gòu)造后,流程執(zhí)行有一個主要的執(zhí)行路徑
//(=roottoken根令牌)此時位置在start-state處
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
//在構(gòu)造后流程執(zhí)行有一個主要的執(zhí)行路徑
//(=roottoken根令牌).
Tokentoken=processInstance.getRootToken();
//構(gòu)造后,位置處于流程定義執(zhí)行路徑start-state的位置
assertSame(processDefinition.getStartState(),token.getNodeO);
//現(xiàn)在開始流程執(zhí)行,離開start-state結(jié)束默認(rèn)的轉(zhuǎn)換(transition)
token.signal();
//這個signal方法將會阻塞直到流程執(zhí)行進入wait狀態(tài)
//流程執(zhí)行在狀態(tài)'s'進入第一個等待狀態(tài)
//因此執(zhí)行主路徑現(xiàn)在位置在狀態(tài)'s'
assertSame(processDefinition.getNode("s"),token.getNode());
//我們再送另外一個信號signal.這將繼續(xù)執(zhí)行離開狀態(tài)M結(jié)束默
認(rèn)的轉(zhuǎn)換(transition)
token.signal();
//現(xiàn)在信號signal方法將返回,因為流程實例到達了end-state結(jié)
束狀態(tài)
assertSame(processDefinition.getNode("end"),token.getNode());
)
32數(shù)據(jù)庫例子
jBPM一個基本的特性是當(dāng)流程處于等待狀態(tài)時候可以把流程執(zhí)行永久化到數(shù)
據(jù)庫中.下一個例子想你展示了如何存儲一個流程實例到j(luò)BPM數(shù)據(jù)庫中.例
子給出一個將會發(fā)生的上下文.分開的方法用來建立不同部分的用戶代碼.比如
一部分用戶代碼在web應(yīng)用程序中開始一個流程并永久化執(zhí)行到數(shù)據(jù)庫中.然
后,messagedrivebean從數(shù)據(jù)庫中載入流程實例并繼續(xù)它的執(zhí)行
jBPM永久化的更多內(nèi)容可以參看第六章,永久化.
publicclassHelloWorldDbTestextendsTestCase{
//我們在每個應(yīng)用程序中需要一個JbpmSessionFactory.因
此我們把它放在一個靜態(tài)變量中
//JbpmSessionFactory在test方法中來建立一個
JbpmSession's.
staticJbpmSessionFactoryjbpmSessionFactory=
JbpmSessionFactory.buildJbpmSessionFactoryO;
static{
//因為HSQLDBin-memory數(shù)據(jù)庫是干凈的數(shù)據(jù)庫,
//在我們開始測試前,我們需要建立table.
//Thenextlinecreatesthedatabasetablesandforeignkey
//constraints.
jbpmSessionFactory.getJbpmSchema().createSchema();
)
publicvoidtestSimplePersistence(){
〃在3個方法調(diào)用下面方法中間,所有數(shù)據(jù)被寫入數(shù)據(jù)庫
//在單元測試中,這3個方法被正確執(zhí)行在每個方法之后
//因為我們想完成測試流程場景
//但在實際中這些方法代表著server不同的請求
//因為我們開始的數(shù)據(jù)庫是個干凈的數(shù)據(jù)庫,我們需要首先發(fā)
布流程在里面
//在真實中,這個是由流程開發(fā)人員完成的
deployProcessDefinition();
〃假定我們想開始流程實例(=流程執(zhí)行)
//當(dāng)用戶提交一個Web表單的時候.
processInstancelsCreatedWhenllserSubmitsWebappFormO;
//然后,到達的異步消息將繼續(xù)執(zhí)行
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
)
publicvoiddeployProcessDefinition(){
〃定義一個流程,包括三個及點,一個未命名的start-state,一個狀態(tài)‘s'
〃一個結(jié)束狀態(tài)end-state名字'end'.
ProcessDefinitionprocessDefinition=
ProcessDefinition.parseXmlString(
"<process-definitionname='helloworld'>+
"<start-statename='start'>+
"〈transitionto='s'/>+
"</start-state>+
"<statename='s'>+
〈transitionto='end'/>+
"</state>+
<end-statename='end'/>+
"</process-definition>
);
//打開新的永久層會話
JbpmSessionjbpmSession=
jbpmSessionFactory.openJbpmSession();
//并且在永久層會話上開啟事務(wù)
jbpmSession.beginTransaction();
〃保存流程定義到數(shù)據(jù)庫中
jbpmSession
.getGraphSession()
.saveProcessDefinition(processDefinition);
//提交事務(wù)
jbpmSmitTransaction();
//關(guān)閉會話.
jbpmSession.close();
)
publicvoid
processInstancelsCreatedWhenUserSubmitsWebappFormO{
//這個方法里的代碼可以放在structsaction或JSF管理bean
里
//打開一個新的永久層會話
JbpmSessionjbpmSession=
jbpmSessionFactory.openJbpmSession();
//啟動事務(wù).
jbpmSession.beginTransaction();
//查詢數(shù)據(jù)庫得到我們在上面步驟發(fā)布的流程定義
ProcessDefinitionprocessDefinition=
jbpmSession
,getGraphSession()
,findLatestProcessDefinition("helloworld");
//有了從數(shù)據(jù)庫中的得到的processDefinition,
〃我們就可以建立流程執(zhí)行定義比如helloworld例子(它沒有永久
化).
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
Tokentoken=processInstance.getRootToken();
assertEquals("start",token.getNode().getName());
//開始流程執(zhí)行
token.signal();
//流程在狀態(tài)'S'.
assertEquals("s",token.getNode().getName());
//流程實例被保存在數(shù)據(jù)庫
//所以當(dāng)前流程執(zhí)行的狀態(tài)被保存進數(shù)據(jù)庫
jbpmSession
.getGraphSession()
.saveProcessInstance(processInstance);
〃Themethodbelowwillgettheprocessinstancebackout
//ofthedatabaseandresumeexecutionbyprovidinganother
//externalsignal.
//web應(yīng)用程序動作結(jié)束出,事務(wù)被提交.
jbpmSmitTransaction();
//關(guān)閉jbpmSession.
jbpmSession.close();
)
publicvoid
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived(){
//這個代碼可以包含在messagedrivenbean中.
//打開新的永久性的會話.
JbpmSessionjbpmSession=
jbpmSessionFactory.openJbpmSession();
//永久化會話上開始事務(wù)
〃說明它也可能使用應(yīng)用服務(wù)器的DataSource的JDBC連
接
jbpmSession.beginTransaction();
GraphSessiongraphSession=jbpmSession.getGraphSession();
//First,weneedtogettheprocessinstancebackoutofthe
database.
//Thereareseveraloptionstoknowwhatprocessinstancewe
aredealing
//withhere.Theeasiestinthissimpletestcaseisjusttolook
for
//thefulllistofprocessinstances.Thatshouldgiveusonlyone
//result.Solet'slookuptheprocessdefinition.
ProcessDefinitionprocessDefinition=
graphSession.findLatestProcessDefinition("helloworld");
//現(xiàn)在,我們搜索這個流程定義的所有流程實例.
Listprocessinstances=
graphSession.findProcessInstances(processDefinition.getId());
//Weknowthatinthecontextofthisunittestthereis
〃onlyoneexecution.Inreallife,theprocesslnstanceldcanbe
//extractedfromthecontentofthemessagethatarrivedor
from
//theusermakingachoice.
Processinstanceprocessinstance=
(Processinstance)processInstances.get(O);
//我們可以繼續(xù)執(zhí)行.說明流程實例委托信號到執(zhí)行主路徑(=
theroottoken)
processlnstance.signal();
//在singal后,我們知道流程執(zhí)行應(yīng)該到end-state
assertTrue(processInstance.hasEnded());
//現(xiàn)在我們可以更新執(zhí)行狀態(tài)到數(shù)據(jù)庫中
graphSession.saveProcessInstance(processInstance);
〃MDB結(jié)束,事務(wù)被提交.
jbpmSmitTransaction();
//jbpmSession被關(guān)閉.
jbpmSession.closeQ;
)
)
3.3.上下文例子:流程變量
在流程執(zhí)行時候流程變量包含上下文信息.流程變量同java.util.Map相似映射
名字到值,值可能是個java對象.流程變量被永久化作為流程實例的一部分.為
了讓事情簡單,這個例子中我們僅僅展示使用變量的API而沒有永久化.
關(guān)于變量的更多信息可以參看第8章上下文
//這個例子也是從helloworld流程開始.
//甚至沒有修改.
ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlString(
"<process-definition>"+
"<start-state>"+
"<transitionto='s'/>"+
"</start-state>"+
"<statename='s'>"+
"<transitionto='end'/>"+
"</state>"+
"<end-statename='end'/>"+
"</process-definition>"
);
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
//從流程實例中為流程變量獲得上下文實例
Contextinstancecontextinstance=
processInstance.getContextlnstanceO;
//在開始之前流程離開了start-state,
//我們準(zhǔn)備設(shè)置一些流程變量在流程實例上下文中
contextInstance.setVariable("amount",newInteger(500));
contextInstance.setVariable("reason","imetmydeadline");
//從現(xiàn)在開始,這些變量同流程實例關(guān)聯(lián)
//流程變量可以從用戶代碼中通過下面展示的API來訪問
//可可以在動作Action和節(jié)點的實現(xiàn)中訪問
//流程變量也作為流程實例的一部分保存進數(shù)據(jù)庫
processlnstance.signal();
//訪問變量通過contextinstance.
assertEquals(newInteger(500),
contextinstance.getVariable("amount"));
assertEquals("imetmydeadline",
contextinstance.getVariable("reason"));
3.4.任務(wù)分派例子
在下個例子里我們將要展示你怎么才能分派一個任務(wù)給一個用戶因為jBPM工
作流引擎和組織模型是分開的,一種用來計算參與者表達語言總是受限的.因此,
你不得不指定AssignmentHandler的實現(xiàn)來計算任務(wù)的參與者.
publicvoidtestTaskAssignment(){
//這個流程展示基于helloworld流程.
//狀態(tài)節(jié)點被task-node代替.task-node在JPDL中是表示一
個等待狀態(tài)并且
//產(chǎn)生一個在流程繼續(xù)執(zhí)行前要完成的任務(wù)
ProcessDefinitionprocessDefinition=
ProcessDefinition.parseXmlString(
"<process-definitionname='thebabyprocess'>"+
"<start-state>"+
<transitionname='babycries'to='t'/>"+
"</start-state>"+
"<task-nodename='t'>"+
<taskname='changenappy'>"+
<assignment
class='org.jbpm.tutorial.taskmgmtNappyAssignmentHandler'/>"+
"</task>"+
"<transitionto='end'/>"+
"</task-node>"+
"<end-statename='end'/>"+
"</process-definition>"
);
//產(chǎn)生一個流程執(zhí)行定義.
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
Tokentoken=processInstance.getRootToken();
//開始流程執(zhí)行,完整默認(rèn)的轉(zhuǎn)換后離開start-state
token.signal();
//signal方法將被阻塞知道流程執(zhí)行進入等待狀態(tài).
//在這個case中是指task-node.
assertSame(processDefinition.getNode("t"),token.getNode());
//當(dāng)執(zhí)彳亍至U達task-node,彳壬務(wù)'changenappy'
//被建立并且NappyAssignmentHandler被調(diào)用來決定任務(wù)將分派給睡
//NappyAssignmentHandler返回'papa'
//在真實環(huán)境中,任務(wù)將會從數(shù)據(jù)庫中獲取,通過or
g.jbpm.db.TaskMgmtSession.
//因此這個例子中我們不想包括復(fù)雜的永久化
//我們只是得到這個流程實例的第一個task-實例
(weknowthereisonlyoneinthistest
//我們知道在這介測試場景中這里只有一個).
Taskinstancetaskinstance=(Taskinstance)
processinstance
.getTaskMgmtInstance()
,getTaskInstances()
,iterator().next();
//現(xiàn)在,我們檢查taskinstance實際分配給了‘papa'.
assertEquals("papa",taskinstance.getActorId());
〃現(xiàn)在,我們期望'papa,完成了他的任務(wù)并且標(biāo)記任務(wù)是完成
的
tasklnstance.end();
//因為這是最后(唯一的)要做的任務(wù),這個任務(wù)的完成觸發(fā)
//流程實例的繼續(xù)執(zhí)行.
assertSame(processDefinition.getNode("end"),token.getNode());
}
3.5.客戶化動作例子
動作action是綁定你自己的定制java代碼和jBPM流程的一種機制.動作可以
同它自己的節(jié)點關(guān)聯(lián)起來(如果它們在流程圖表示中相關(guān)).動作也可以放在事
件event上比如.takingatransition,leavinganode或者enteringanode.
在這個case,動作不是圖表的一部分,但是它們在流程執(zhí)行產(chǎn)生事件的時候,也會
被執(zhí)行.
我們將用一個例子:MyActionHandler來觀察動作的實現(xiàn).這個動作handler實
現(xiàn)不是什么非常特別的事情.它只是設(shè)置boolean變量isExecuted為true.變
量isExecuted是靜態(tài)的因此它可以在actionhandler內(nèi)部被訪問.
關(guān)于動作action的內(nèi)容可以參看7.4節(jié),"動作"
//MyActionHandler就是一個class可以在jBPM流程執(zhí)行時候在某
些用戶代碼里被執(zhí)行
publicclassMyActionHandlerimplementsActionHandler{
//在測試之前,isExecuted被設(shè)置為
false.
publicstaticbooleanisExecuted=false;
//動作將設(shè)置true因此當(dāng)動作被執(zhí)行
//unittest將會展示
publicvoidexecute(ExecutionContextexecutioncontext){
isExecuted=true;
)
)
//每次測試開始都要設(shè)置MyActionHandler的成員static
isExecuted為
false.
publicvoidsetUp(){
MyActionHandler.isExecuted=false;
)
我們將要在轉(zhuǎn)換時開始一個動作
publicvoidtestTransitionAction(){
〃Thenextprocessisavariantofthehelloworldprocess.
//Wehaveaddedanactiononthetransitionfromstate's'
//totheend-state.Thepurposeofthistestistoshow
//howeasyitistointegratejavacodeinajBPMprocess.
ProcessDefinitionprocessDefinition=
ProcessDefinition.parseXmlString(
"<process-definition>"+
"<start-state>"+
"<transitionto='s'/>"+
"</start-state>"+
"<statename='s'>"+
<transitionto='end'>"+
<action
class='org.jbpm.tutorial.action.MyActionHandler'/>"+
"</transition>"+
"</state>"+
"<end-statename='end'/>"+
"</process-definition>"
);
〃Let'sstartanewexecutionfortheprocessdefinition.
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
//Thenextsignalwillcausetheexecutiontoleavethestart
//stateandenterthestate's'
processInstance.signalO;
//這里將顯示MyActionHandler還沒有被執(zhí)行
assertFalse(MyActionHandler.isExecuted);
//...andthatthemainpathofexecutionispositionedin
//thestate's"
assertSame(processDefinition.getNode("s"),
processInstance.getRootToken().getNode());
//Thenextsignalwilltriggertheexecutionoftheroot
//token.Thetokenwilltakethetransitionwiththe
//actionandtheactionwillbeexecutedduringthe
〃calltothesignalmethod.
processInstance.signalO;
〃HerewecanseethatMyActionHandlerwasexecutedduring
//thecalltothesignalmethod.
assertTrue(MyActionHandler.isExecuted);
)
下一個例子是同樣的動作,但動作被分別放在enter-node和leave-node事件.
注意節(jié)點同轉(zhuǎn)換相比有超過一個事件類型(eventtype)轉(zhuǎn)換(transition)只有一
個事件.
ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlString(
"<process-definition>"+
"<start-state>"+
"<transitionto='s'/>"+
"</start-state>"+
"<statename='s'>"+
<eventtype='node-enter'>"+
<actionclass='org.jbpm.tutorial.action.MyActionHandler'
/>"+
"</event>"+
"<eventtype='node-leave'>"+
<actionclass='org.jbpm.tutorial.action.MyActionHandler'
/>"+
</event>"+
"<transitionto='end'/>"+
"</state>"+
"<end-statename='end'/>"+
"</process-definition>"
);
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
assertFalse(MyActionHandler.isExecuted);
//Thenextsignalwillcausetheexecutiontoleavethestart
//stateandenterthestate's'.Sothestate's'isentered
//andhencetheactionisexecuted.
processlnstance.signal();
assertTrue(MyActionHandler.isExecuted);
//Let'sresettheMyActionHandler.isExecuted
MyActionHandler.isExecuted=false;
//Thenextsignalwilltriggerexecutiontoleavethe
//state's'.Sotheactionwillbeexecutedagain.
processlnstance.signal();
//Voila.
assertTrue(MyActionHandler.isExecuted);
第四章.面向圖的程序設(shè)計
前一頁后一頁
第四章.面向圖的程序設(shè)計
當(dāng)前工作流和業(yè)務(wù)流程管理(BPM)的總體發(fā)展來說是極其零碎的.在一些工具,規(guī)
范和學(xué)術(shù)界發(fā)現(xiàn)很少的統(tǒng)一意見.傳統(tǒng)方法導(dǎo)致笨重的,單系統(tǒng)把大量的功能包
含在一個單一的系統(tǒng)中
Java開發(fā)語言中缺少的特性導(dǎo)致在這個范圍產(chǎn)生了完整系列的解決方法.這個
文章將標(biāo)識缺少的特性并且提出一個簡
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 書法比賽活動總結(jié)
- 初一學(xué)生學(xué)習(xí)計劃
- 銷售部年度個人工作計劃模板2022
- 2025年藥妝項目合作計劃書
- 青春寄語短句8個字3篇
- 小孩夏季發(fā)燒
- 柴油配送運輸合同
- 別墅租賃協(xié)議
- 商場鋪位租賃合同
- 2025年煙氣自動采樣器及測定儀項目發(fā)展計劃
- 永煤集團順和煤礦液壓銷齒彎道推車機技術(shù)規(guī)格書
- 九型人格測試之180題(完整版)和答案解析
- 口內(nèi)病例分析
- 壓力管道內(nèi)審記錄(共5頁)
- LS-MASTER-K-指令手冊
- 堵蓋與膠貼在車身堵孔方面的應(yīng)用
- 清單計價規(guī)范附錄附表詳解PPT課件
- 光刻膠知識簡介
- 烏茲別克語字母表
- 微機室學(xué)生上機記錄
- 畢業(yè)設(shè)計(論文)基于單片機AT89C51的數(shù)字搶答器設(shè)計
評論
0/150
提交評論