版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【最新卓越管理方案您可自由編輯】
(BPM業(yè)務(wù)流程管
理)JBBPM精要講義及培
訓(xùn)課件
2020年5月
多年的企業(yè)咨詢顧問(wèn)經(jīng)驗(yàn),經(jīng)過(guò)實(shí)戰(zhàn)驗(yàn)證可以落地執(zhí)行的卓越管理方案,值得您下載擁有
JBossjBPM3.0
下一頁(yè)
JBossjBPM3.0
WorkflowandBPM實(shí)踐
目錄
L介紹
l.L綜述
12TheJBossjBPM新手工具箱
L3.TheJBossjBPM流程圖形設(shè)計(jì)器
1.4.TheJBossjBPM核心組件
15TheJBossjBPM控制臺(tái)w制應(yīng)用
1.6.TheJBossjBPM身份組件
L7.TheJBossjBPM日程安排程序
L8.TheJBossjBPM兼容數(shù)據(jù)庫(kù)包
L9.TheJBossjBPMBPEL擴(kuò)展
2.開(kāi)始
2.1.下載一覽
2.1.1.iBPM3
2.1.LL新手工具箱
2.1.12核心引擎和身份組件
2.L13數(shù)據(jù)庫(kù)擴(kuò)展
2.12jBPM流程設(shè)計(jì)器
2.121.Eclipse更新站點(diǎn)
2.1.22Eclipse特點(diǎn)
2.1.3.jBPMBPEL擴(kuò)展
22TheJBossjBPM項(xiàng)目目錄
2.3.公開(kāi)CVS訪問(wèn)
3.指南
3.1.HelloWorld例子
32數(shù)據(jù)庫(kù)例子
3.3.上下問(wèn)(context)例子:流程變量
34任務(wù)分派例子
35定制動(dòng)作Action例子
4.面向圖的程序設(shè)計(jì)
4.1.缺少的一環(huán)
42圖解表示和開(kāi)發(fā)過(guò)程
43習(xí)慣方法
44什么是面向圖的程序設(shè)計(jì)
45組建塊
5.發(fā)布
5.L運(yùn)行時(shí)的相關(guān)部分
5.1.LJava運(yùn)行環(huán)境
5.12jBPM庫(kù)
5.13運(yùn)行時(shí)需要的庫(kù)
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ù)庫(kù)配置
6.3.管理事務(wù)
64jBPM數(shù)據(jù)庫(kù)
6.4.1.Hibernate集成
6.42開(kāi)發(fā)數(shù)據(jù)庫(kù)是hsqldb
6.4.3.其他數(shù)據(jù)庫(kù)的支持
6.44高速緩沖存儲(chǔ)器
6.5.Hibernate定制
7.流程模型
7.1.綜述
7.2.流程圖(processGraph)
7.3.節(jié)點(diǎn)(Nodes)
7.3.1.節(jié)點(diǎn)(Node)職責(zé)
7.3.2.節(jié)點(diǎn)類型(Nodetype)任務(wù)(task-node)
7.3.3.節(jié)點(diǎn)類型(Nodetype)狀態(tài)(state)
7.3.4.節(jié)點(diǎn)類型(Nodetype)判定(decision)
7.35節(jié)點(diǎn)類型(Nodetype)分叉(fork)
7.3.6.節(jié)點(diǎn)類型(Nodetype)聯(lián)合(join)
7.3.7.節(jié)點(diǎn)類型(Nodetype)節(jié)點(diǎn)(node)
7.4.動(dòng)作(Actions)
741.動(dòng)作配置
7.42動(dòng)作引用
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.分級(jí)名字
76異常處理
7.7.流程組成
78定制節(jié)點(diǎn)行為
79圖(Graph)執(zhí)行
8.上下文(Context)
8.1.存取變量
82變量的使用期限
8.3.變量永久化
8.4.變量范圍
8.4.1.變量重載(overloading)
8.42變量重寫(xiě)(overriding)
85瞬間變量
8.6.定制變量永久化
9.任務(wù)管理
9」.任務(wù)
92任務(wù)實(shí)例
921.任務(wù)實(shí)例生命周期
922.任務(wù)實(shí)例及圖執(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ù)定時(shí)器
9.7.任務(wù)控制器
98定制任務(wù)實(shí)例
99身份組件
991.身份模型
9.92賦值表達(dá)式
9.921.第一個(gè)術(shù)語(yǔ)
9.922.下一個(gè)術(shù)語(yǔ)
993.刪除身份組件
1。調(diào)度程序
101定時(shí)器
102調(diào)度程序發(fā)布
11業(yè)務(wù)日歷
11.L持久時(shí)間
112配置
12.記錄
12.1.建立日志
122日志檢索
123數(shù)據(jù)倉(cāng)庫(kù)
13.jBPM流程定義語(yǔ)言(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é)點(diǎn))
13.3.3.commonnodeelements(常見(jiàn)節(jié)點(diǎn)元素)
13.3.4.start-state(開(kāi)始狀態(tài))
13.3.5.end-state(結(jié)束狀態(tài))
13.3.6.state(狀態(tài))
13.3.7.task-node(任務(wù)節(jié)點(diǎn))
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(動(dòng)作)
13.3.16.script(腳本)
13.3.17.expression(表達(dá)式)
13.3.18.variable(變量)
13.3.19.handler(處理器)
13.3.20timer(定時(shí)器)
13.3.2Lcreate-timer(建立定時(shí)器)
13.3.22.cancel-timer(放棄定時(shí)器)
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驗(yàn)證
143授權(quán)
15.TDDforworkflow
15.1.IntroducingTDDforworkflow
152XMLsources
1521.Parsingaprocessarchive
15.22Parsinganxmlfile
1523.ParsinganxmlString
15.3.Testingsubprocesses
16.可插入架構(gòu)
下一步
Chapter1.介紹
第一章:介紹
前一頁(yè)后一頁(yè)
第一章:介紹
JBossjBPM是一個(gè)復(fù)雜的可擴(kuò)展的工作流管理系統(tǒng).JBossjBPM有直觀的流
程語(yǔ)言來(lái)表示商業(yè)流程圖的術(shù)語(yǔ)比如,任務(wù),異步通訊的等待狀態(tài),定時(shí)器,自動(dòng)操
作等等.把這些操作綁在一起〃JBossjBPM就有了最強(qiáng)大和易擴(kuò)展性的控制流
機(jī)制.
JBossjBPM只有最小的倚賴性可以很容易的作為java庫(kù)來(lái)使用.當(dāng)然它也可以
用在吞吐量極為關(guān)鍵的J2EE群應(yīng)用服務(wù)器環(huán)境中.
JBossjBPM可以同任何數(shù)據(jù)庫(kù)配置可以部署在任何應(yīng)用服務(wù)器上.
1.1.綜述
核心工作流和BPM功能被封狀作為一個(gè)簡(jiǎn)單的Java庫(kù).這個(gè)庫(kù)包括在jBPM數(shù)
據(jù)庫(kù)中存儲(chǔ),更新和檢索流程信息的服務(wù)
Figure1.1.JBossjBPM組件一覽
1.2.JBossjBPM新手工具箱
新手工具箱是包含了jBPM所有組件包在一個(gè)可下載的包里.
這個(gè)包包括:
jbpm-server,預(yù)先配置的jboss應(yīng)用服務(wù)器.
jbpm-designer,jBPM流程圖形化設(shè)計(jì)器的eclipse插件.
jbpm-dbJBPM數(shù)據(jù)庫(kù)兼容包(參看下面).
jbpm,核心jbpm組件包括庫(kù)和本手冊(cè).
jbpm-bpel,JBossjBPMBPEL擴(kuò)展參考.
預(yù)配置的JBoss應(yīng)用服務(wù)器有下列安裝組件:
核心jBPM組件,打包作為JBoss服務(wù)檔案
一個(gè)包括所有jBPM表格的完整數(shù)據(jù)庫(kù):默認(rèn)的hypersonic數(shù)據(jù)庫(kù)
包含所有的jBPM表格和已經(jīng)定義的流程.
jBPM控制臺(tái)web應(yīng)用程序這個(gè)可以用來(lái)為jBPM管理員.
jBPM調(diào)度程序所有定時(shí)器的執(zhí)行.調(diào)度程序在新手工具箱里配置成了
一個(gè)servlet.這個(gè)Servlet會(huì)為產(chǎn)生一個(gè)線程來(lái)監(jiān)視每個(gè)定時(shí)器的執(zhí)行.
一介流程例子已經(jīng)發(fā)布進(jìn)了jBPM數(shù)據(jù)庫(kù).
1.3.JBossjBPM圖形化流程設(shè)計(jì)器
JBossjBPM也包括一個(gè)圖形化的流程設(shè)計(jì)工具.這個(gè)設(shè)計(jì)器是用來(lái)創(chuàng)作商業(yè)流
程的
JBossjBPM圖形設(shè)計(jì)器是一個(gè)Eclipse插件.獨(dú)立安裝版本的設(shè)計(jì)器工具已經(jīng)
在開(kāi)發(fā)路線圖里了.
圖形化設(shè)計(jì)工具最重要的特性是它同時(shí)支持業(yè)務(wù)分析員和技術(shù)開(kāi)發(fā)人員.這樣
就可以在業(yè)務(wù)流程建模和實(shí)際執(zhí)行之間平滑轉(zhuǎn)換.
插件可用做為本地的updatesite(Eclipse純粹的zip文件),用做符合Eclipse軟
件更新機(jī)制的安裝包.當(dāng)然你也可以把它展開(kāi)到你的Eclipse的安裝目錄.
1.4JBossjBPM核心組件
JBossjBPM核心組件是純粹的Java(J2SE)軟件,來(lái)處理流程定義和運(yùn)行時(shí)的流
程實(shí)例執(zhí)行.
JBossjBPM是一個(gè)Java庫(kù).因此它可以用在任何java環(huán)境比如web應(yīng)用程
序,Swing應(yīng)用程序,EJB,WebService等等.jBPM庫(kù)可以被打包作為sateless
sessionEJB(無(wú)狀態(tài)會(huì)話EJB).這可以用做集群的發(fā)布具有極高的吞吐量可伸縮
性.無(wú)狀態(tài)會(huì)話EJB根據(jù)J2EEL3規(guī)范重新寫(xiě)過(guò)所以可以發(fā)布到任何應(yīng)用服務(wù)器
上.
JBossjBPM核心組件被打包成一個(gè)簡(jiǎn)單的Java庫(kù)文件.依賴你所使用的功能
性,庫(kù)jbpm-3.0.jar及一些相關(guān)的第三方的庫(kù)比如.hibernate,dom4j等等.這些
相關(guān)性在第五章發(fā)布有清晰的描述
永久性方面,jBPM內(nèi)部使用hibernate.除了傳統(tǒng)的0/R映射外,hibernate也
分析不同數(shù)據(jù)庫(kù)系統(tǒng)的SQL方言,這使jBPM在當(dāng)前所有的數(shù)據(jù)庫(kù)上都可以移
植.
JBossjBPMAPI可以從項(xiàng)目中任意編寫(xiě)的Java軟件訪問(wèn),比如Web應(yīng)用程
序,EJB,或webService組件,消息bean或其他java組件.
1.5.JBossjBPM控制臺(tái)web應(yīng)用程序
jBPM控制臺(tái)web應(yīng)用程序是為兩個(gè)目的服務(wù)的.首先,它作為流程執(zhí)行運(yùn)行時(shí)
間任務(wù)生成的中央用戶接口.其次,它也是一個(gè)管理和監(jiān)視控制臺(tái)允許檢查和操
作運(yùn)行中的流程實(shí)例.
1.6.JBossjBPM身份組件
JBossjBPM可以集成進(jìn)任何包含公司用戶和組織信息的目錄.對(duì)項(xiàng)目來(lái)說(shuō)從那
里得到組織信息組件不是容易得到的,JBossjBPM就包含這個(gè)組件.身份組件
使用的模型比通常的servlet,ejb和門戶模型跟富有.
更多信息可參考章節(jié)信9,"身份組件"
1.7.JBossjBPM調(diào)度程序
JBossjBPM調(diào)度程序是用來(lái)監(jiān)視和運(yùn)行已經(jīng)計(jì)劃到時(shí)執(zhí)行流程的定時(shí)器的組
件.
定時(shí)器組件被打包在核心jbpm庫(kù)中,但是它需要被發(fā)布到下面的任一環(huán)境中:
要不你把調(diào)度程序Servlet來(lái)產(chǎn)生監(jiān)視線程或者就必須用獨(dú)立的JVM來(lái)調(diào)用調(diào)
度程序的main方法.
1.8.JBossjBPM數(shù)據(jù)庫(kù)兼容包
JBossjBPM數(shù)據(jù)庫(kù)兼容包包括所有支持?jǐn)?shù)據(jù)庫(kù)的相關(guān)信息JDBC驅(qū)動(dòng)程序和
數(shù)據(jù)庫(kù)初始化腳本.
1.9.JBossjBPMBPEL擴(kuò)展
JBossjBPMBPEL擴(kuò)展是獨(dú)立的擴(kuò)展包用來(lái)支持BPEL(BusinessProcess
ExecutionLanguage商業(yè)流程執(zhí)行語(yǔ)言).BPEL的基本要素是xmlScripting
語(yǔ)言用來(lái)寫(xiě)其他webserver的webservices.
前一頁(yè)Up后一頁(yè)
JBossjBPM3.0首取第二章:開(kāi)始
第二章開(kāi)始
前一頁(yè)后一頁(yè)
第二章開(kāi)始
本章將帶你如何獲得JBossjBPM的第一步并且提供
立即運(yùn)行的初始提示.
2.1.下載包一覽
下面是當(dāng)前可用的不同jBPM包清單.這些包中的每一個(gè)都包含一個(gè)或多個(gè)可下
載的文件.同這些文件一起的包含一個(gè)描述它的內(nèi)容及相關(guān)安裝的指示
所有下面下載的描述都可以在thesourceforgejbpm下載頁(yè)面.上找到
2.1.1.jBPM3
這是主要的發(fā)行包,包括了主要核心引擎和數(shù)個(gè)額外的你使用jBPM的時(shí)候可能
用得上的包.下載這個(gè)包的文件從這里.
.新手工具箱
如果你想盡快開(kāi)始運(yùn)行jBPM,那么這就是你想下載的文件.工具箱包含了所有
jBPM的模塊以及圖形化的設(shè)計(jì)工具在一個(gè)單獨(dú)下載的文件里名字為:
'jbpm-starters-kit-<version>.zip'.展開(kāi)這個(gè)壓縮文件到目錄下閱讀
,readme.html,獲取更多信息、.有了這個(gè)工具箱,你可以立即開(kāi)始進(jìn)入第三章
講座.
.核心引擎和身份組件
下載文件名為‘jbpm-<version>.zip,包含jBPM核心引擎也包含角色和組管
理的身份組件.開(kāi)始工作前,展開(kāi)文件到一個(gè)目錄下,然后‘jbpm-〈version〉,文
件夾下找到包含重要的參考信息的‘readme.html,文件
2.1.13.數(shù)據(jù)庫(kù)擴(kuò)展
如果你想改變jBPM的默認(rèn)數(shù)據(jù)庫(kù)(HypersonicHSQLDB),你需要下載這個(gè)
包.文件名為‘jbpm-db-<version>.zip,包含你改變數(shù)據(jù)庫(kù)需要的各種資源.包
含,數(shù)據(jù)庫(kù)建立腳本,hibernate屬性文件及數(shù)據(jù)庫(kù)JDBC驅(qū)動(dòng)程序.如何操作
的步驟包含在'readme.html,文件里,它在你展開(kāi)這個(gè)壓縮包的最上層的目錄
下.
2.1.2.jBPM流程設(shè)計(jì)器
ThesecondpackagecontainsthedownloadsrelatedtothejBPM
GraphicalProcesDesigner.Thedesignerenablesyoutoauthoryour
processdefinitionsandtoeasilydeploythem.Youcanfindthese
downloadshere.Thedesignerisaplug-infortheEclipseplatformwhich
isavailablefordownloadeitherasazippedEclipsefeatureorasazipped
Eclipseupdatesite.Thereisnodifferenceincontent,theonlydifference
isinthewayyouhavetodotheinstallation.
.Eclipse更新站點(diǎn)
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擴(kuò)展
第三個(gè)也是最后一個(gè)包包含jBPMBPEL擴(kuò)展.它只包含一個(gè)文件:
'jbpm-bpel-<version>.zip'.你可以找到這個(gè)包在這里.要開(kāi)始BPEL擴(kuò)展,在
doc目錄下找到User'sGuide.
2.2.JBossjBPM項(xiàng)目號(hào)碼簿
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.公開(kāi)的CVS訪問(wèn)
另外,你可以通過(guò)JBossjBPMcvs服務(wù)器得到j(luò)BPM
服務(wù)器的信息如下
Connectiontype:pserver
User:anonymous
Password:
Host:
Port:2401(whichisthedefault)
Repositorypath:/cvsroot/jbpm
Label::pserver:anonymous@/cvsroot/jbpm
第三章.講座
前一頁(yè)后一頁(yè)
第三章.講座
這個(gè)講座將展示如何建造一個(gè)jpdl和如何使用API的方法來(lái)管理運(yùn)行時(shí)的執(zhí)行.
這個(gè)講座的方式是解釋一系列的例子.每個(gè)例子將集中關(guān)注特別的主題和額外
的說(shuō)明.這些例子可以在jBPM包的examples目錄下找到.
最好的方法就是學(xué)著來(lái)建立一個(gè)Project實(shí)驗(yàn)所給的例子.
eclipse用戶注意:下載jbpm-3.0-[version].zip并且解壓縮到系統(tǒng).然后從菜單
"File"-->"Import..."-->"ExistingProjectintoWorkspace".點(diǎn)"Next"然
后瀏覽jBPM根目錄然后點(diǎn)擊"Finish".現(xiàn)在你的有了jbpm3project了.你
可以發(fā)現(xiàn)這個(gè)講座目錄在目錄src/java.examples/….你打開(kāi)這些例子后,可以運(yùn)
行它們"Run""RunAs..."->"JUnitTest"
jBPM包括一個(gè)圖形設(shè)計(jì)器來(lái)產(chǎn)生例子中的XML.你可以從這里下載和學(xué)習(xí)有
關(guān)圖形設(shè)計(jì)器的說(shuō)明節(jié)2.1,"下載一覽"
3.1.HelloWorld例子
一個(gè)流程是有一個(gè)定向圖(directedgraph)來(lái)定義,由節(jié)點(diǎn)和變換組成.hello
world流程有3個(gè)節(jié)點(diǎn).如下看如何組合起來(lái),我們先開(kāi)始一個(gè)簡(jiǎn)單的流程不使
用圖形設(shè)計(jì)器.下面的圖形表示helloworld流程:
Figure3.1.helloworld流程圖
publicvoidtestHelloWorldProcess(){
//這個(gè)方法展現(xiàn)流程定義和流程執(zhí)行的定義
//流程定義有3個(gè)節(jié)點(diǎn).
//一個(gè)未命名的開(kāi)始狀態(tài)start-state,一個(gè)狀態(tài),s'
//一個(gè)結(jié)束狀態(tài)名字為'end.
//下面行解析一個(gè)xmltext為一個(gè)ProcessDefinition對(duì)象(流
程定義)
//ProcessDefinition把流程定義形式描述為java對(duì)象
ProcessDefinitionprocessDefinition=
ProcessDefinition.parseXmlString(
"<process-definition>"+
"<start-state>"+
〈transitionto='s'/>"+
"</start-state>"+
"<statename='s'>"+
"〈transitionto='end'/>"+
"</state>"+
"<end-statename='end'/>"+
"</process-definition>"
);
//下一行建立了一個(gè)流程執(zhí)行定義.
〃在構(gòu)造后,流程執(zhí)行有一個(gè)主要的執(zhí)行路徑
//(=roottoken根令牌)此時(shí)位置在start-state處
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
//在構(gòu)造后流程執(zhí)行有一個(gè)主要的執(zhí)行路徑
//(=roottoken根令牌).
Tokentoken=processInstance.getRootToken();
//構(gòu)造后,位置處于流程定義執(zhí)行路徑start-state的位置
assertSame(processDefinition.getStartState(),token.getNodeO);
//現(xiàn)在開(kāi)始流程執(zhí)行,離開(kāi)start-state結(jié)束默認(rèn)的轉(zhuǎn)換(transition)
token.signal();
//這個(gè)signal方法將會(huì)阻塞直到流程執(zhí)行進(jìn)入wait狀態(tài)
//流程執(zhí)行在狀態(tài)'s'進(jìn)入第一個(gè)等待狀態(tài)
//因此執(zhí)行主路徑現(xiàn)在位置在狀態(tài)'s'
assertSame(processDefinition.getNode("s"),token.getNode());
//我們?cè)偎土硗庖粋€(gè)信號(hào)signal.這將繼續(xù)執(zhí)行離開(kāi)狀態(tài)M結(jié)束默
認(rèn)的轉(zhuǎn)換(transition)
token.signal();
//現(xiàn)在信號(hào)signal方法將返回,因?yàn)榱鞒虒?shí)例到達(dá)了end-state結(jié)
束狀態(tài)
assertSame(processDefinition.getNode("end"),token.getNode());
)
32數(shù)據(jù)庫(kù)例子
jBPM一個(gè)基本的特性是當(dāng)流程處于等待狀態(tài)時(shí)候可以把流程執(zhí)行永久化到數(shù)
據(jù)庫(kù)中.下一個(gè)例子想你展示了如何存儲(chǔ)一個(gè)流程實(shí)例到j(luò)BPM數(shù)據(jù)庫(kù)中.例
子給出一個(gè)將會(huì)發(fā)生的上下文.分開(kāi)的方法用來(lái)建立不同部分的用戶代碼.比如
一部分用戶代碼在web應(yīng)用程序中開(kāi)始一個(gè)流程并永久化執(zhí)行到數(shù)據(jù)庫(kù)中.然
后,messagedrivebean從數(shù)據(jù)庫(kù)中載入流程實(shí)例并繼續(xù)它的執(zhí)行
jBPM永久化的更多內(nèi)容可以參看第六章,永久化.
publicclassHelloWorldDbTestextendsTestCase{
//我們?cè)诿總€(gè)應(yīng)用程序中需要一個(gè)JbpmSessionFactory.因
此我們把它放在一個(gè)靜態(tài)變量中
//JbpmSessionFactory在test方法中來(lái)建立一個(gè)
JbpmSession's.
staticJbpmSessionFactoryjbpmSessionFactory=
JbpmSessionFactory.buildJbpmSessionFactoryO;
static{
//因?yàn)镠SQLDBin-memory數(shù)據(jù)庫(kù)是干凈的數(shù)據(jù)庫(kù),
//在我們開(kāi)始測(cè)試前,我們需要建立table.
//Thenextlinecreatesthedatabasetablesandforeignkey
//constraints.
jbpmSessionFactory.getJbpmSchema().createSchema();
)
publicvoidtestSimplePersistence(){
〃在3個(gè)方法調(diào)用下面方法中間,所有數(shù)據(jù)被寫(xiě)入數(shù)據(jù)庫(kù)
//在單元測(cè)試中,這3個(gè)方法被正確執(zhí)行在每個(gè)方法之后
//因?yàn)槲覀兿胪瓿蓽y(cè)試流程場(chǎng)景
//但在實(shí)際中這些方法代表著server不同的請(qǐng)求
//因?yàn)槲覀冮_(kāi)始的數(shù)據(jù)庫(kù)是個(gè)干凈的數(shù)據(jù)庫(kù),我們需要首先發(fā)
布流程在里面
//在真實(shí)中,這個(gè)是由流程開(kāi)發(fā)人員完成的
deployProcessDefinition();
〃假定我們想開(kāi)始流程實(shí)例(=流程執(zhí)行)
//當(dāng)用戶提交一個(gè)Web表單的時(shí)候.
processInstancelsCreatedWhenllserSubmitsWebappFormO;
//然后,到達(dá)的異步消息將繼續(xù)執(zhí)行
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
)
publicvoiddeployProcessDefinition(){
〃定義一個(gè)流程,包括三個(gè)及點(diǎn),一個(gè)未命名的start-state,一個(gè)狀態(tài)‘s'
〃一個(gè)結(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>
);
//打開(kāi)新的永久層會(huì)話
JbpmSessionjbpmSession=
jbpmSessionFactory.openJbpmSession();
//并且在永久層會(huì)話上開(kāi)啟事務(wù)
jbpmSession.beginTransaction();
〃保存流程定義到數(shù)據(jù)庫(kù)中
jbpmSession
.getGraphSession()
.saveProcessDefinition(processDefinition);
//提交事務(wù)
jbpmSmitTransaction();
//關(guān)閉會(huì)話.
jbpmSession.close();
)
publicvoid
processInstancelsCreatedWhenUserSubmitsWebappFormO{
//這個(gè)方法里的代碼可以放在structsaction或JSF管理bean
里
//打開(kāi)一個(gè)新的永久層會(huì)話
JbpmSessionjbpmSession=
jbpmSessionFactory.openJbpmSession();
//啟動(dòng)事務(wù).
jbpmSession.beginTransaction();
//查詢數(shù)據(jù)庫(kù)得到我們?cè)谏厦娌襟E發(fā)布的流程定義
ProcessDefinitionprocessDefinition=
jbpmSession
,getGraphSession()
,findLatestProcessDefinition("helloworld");
//有了從數(shù)據(jù)庫(kù)中的得到的processDefinition,
〃我們就可以建立流程執(zhí)行定義比如helloworld例子(它沒(méi)有永久
化).
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
Tokentoken=processInstance.getRootToken();
assertEquals("start",token.getNode().getName());
//開(kāi)始流程執(zhí)行
token.signal();
//流程在狀態(tài)'S'.
assertEquals("s",token.getNode().getName());
//流程實(shí)例被保存在數(shù)據(jù)庫(kù)
//所以當(dāng)前流程執(zhí)行的狀態(tài)被保存進(jìn)數(shù)據(jù)庫(kù)
jbpmSession
.getGraphSession()
.saveProcessInstance(processInstance);
〃Themethodbelowwillgettheprocessinstancebackout
//ofthedatabaseandresumeexecutionbyprovidinganother
//externalsignal.
//web應(yīng)用程序動(dòng)作結(jié)束出,事務(wù)被提交.
jbpmSmitTransaction();
//關(guān)閉jbpmSession.
jbpmSession.close();
)
publicvoid
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived(){
//這個(gè)代碼可以包含在messagedrivenbean中.
//打開(kāi)新的永久性的會(huì)話.
JbpmSessionjbpmSession=
jbpmSessionFactory.openJbpmSession();
//永久化會(huì)話上開(kāi)始事務(wù)
〃說(shuō)明它也可能使用應(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)在,我們搜索這個(gè)流程定義的所有流程實(shí)例.
Listprocessinstances=
graphSession.findProcessInstances(processDefinition.getId());
//Weknowthatinthecontextofthisunittestthereis
〃onlyoneexecution.Inreallife,theprocesslnstanceldcanbe
//extractedfromthecontentofthemessagethatarrivedor
from
//theusermakingachoice.
Processinstanceprocessinstance=
(Processinstance)processInstances.get(O);
//我們可以繼續(xù)執(zhí)行.說(shuō)明流程實(shí)例委托信號(hào)到執(zhí)行主路徑(=
theroottoken)
processlnstance.signal();
//在singal后,我們知道流程執(zhí)行應(yīng)該到end-state
assertTrue(processInstance.hasEnded());
//現(xiàn)在我們可以更新執(zhí)行狀態(tài)到數(shù)據(jù)庫(kù)中
graphSession.saveProcessInstance(processInstance);
〃MDB結(jié)束,事務(wù)被提交.
jbpmSmitTransaction();
//jbpmSession被關(guān)閉.
jbpmSession.closeQ;
)
)
3.3.上下文例子:流程變量
在流程執(zhí)行時(shí)候流程變量包含上下文信息.流程變量同java.util.Map相似映射
名字到值,值可能是個(gè)java對(duì)象.流程變量被永久化作為流程實(shí)例的一部分.為
了讓事情簡(jiǎn)單,這個(gè)例子中我們僅僅展示使用變量的API而沒(méi)有永久化.
關(guān)于變量的更多信息可以參看第8章上下文
//這個(gè)例子也是從helloworld流程開(kāi)始.
//甚至沒(méi)有修改.
ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlString(
"<process-definition>"+
"<start-state>"+
"<transitionto='s'/>"+
"</start-state>"+
"<statename='s'>"+
"<transitionto='end'/>"+
"</state>"+
"<end-statename='end'/>"+
"</process-definition>"
);
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
//從流程實(shí)例中為流程變量獲得上下文實(shí)例
Contextinstancecontextinstance=
processInstance.getContextlnstanceO;
//在開(kāi)始之前流程離開(kāi)了start-state,
//我們準(zhǔn)備設(shè)置一些流程變量在流程實(shí)例上下文中
contextInstance.setVariable("amount",newInteger(500));
contextInstance.setVariable("reason","imetmydeadline");
//從現(xiàn)在開(kāi)始,這些變量同流程實(shí)例關(guān)聯(lián)
//流程變量可以從用戶代碼中通過(guò)下面展示的API來(lái)訪問(wèn)
//可可以在動(dòng)作Action和節(jié)點(diǎn)的實(shí)現(xiàn)中訪問(wèn)
//流程變量也作為流程實(shí)例的一部分保存進(jìn)數(shù)據(jù)庫(kù)
processlnstance.signal();
//訪問(wèn)變量通過(guò)contextinstance.
assertEquals(newInteger(500),
contextinstance.getVariable("amount"));
assertEquals("imetmydeadline",
contextinstance.getVariable("reason"));
3.4.任務(wù)分派例子
在下個(gè)例子里我們將要展示你怎么才能分派一個(gè)任務(wù)給一個(gè)用戶因?yàn)閖BPM工
作流引擎和組織模型是分開(kāi)的,一種用來(lái)計(jì)算參與者表達(dá)語(yǔ)言總是受限的.因此,
你不得不指定AssignmentHandler的實(shí)現(xiàn)來(lái)計(jì)算任務(wù)的參與者.
publicvoidtestTaskAssignment(){
//這個(gè)流程展示基于helloworld流程.
//狀態(tài)節(jié)點(diǎn)被task-node代替.task-node在JPDL中是表示一
個(gè)等待狀態(tài)并且
//產(chǎn)生一個(gè)在流程繼續(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)生一個(gè)流程執(zhí)行定義.
Processinstanceprocessinstance=
newProcessInstance(processDefinition);
Tokentoken=processInstance.getRootToken();
//開(kāi)始流程執(zhí)行,完整默認(rèn)的轉(zhuǎn)換后離開(kāi)start-state
token.signal();
//signal方法將被阻塞知道流程執(zhí)行進(jìn)入等待狀態(tài).
//在這個(gè)case中是指task-node.
assertSame(processDefinition.getNode("t"),token.getNode());
//當(dāng)執(zhí)彳亍至U達(dá)task-node,彳壬務(wù)'changenappy'
//被建立并且NappyAssignmentHandler被調(diào)用來(lái)決定任務(wù)將分派給睡
//NappyAssignmentHandler返回'papa'
//在真實(shí)環(huán)境中,任務(wù)將會(huì)從數(shù)據(jù)庫(kù)中獲取,通過(guò)or
g.jbpm.db.TaskMgmtSession.
//因此這個(gè)例子中我們不想包括復(fù)雜的永久化
//我們只是得到這個(gè)流程實(shí)例的第一個(gè)task-實(shí)例
(weknowthereisonlyoneinthistest
//我們知道在這介測(cè)試場(chǎng)景中這里只有一個(gè)).
Taskinstancetaskinstance=(Taskinstance)
processinstance
.getTaskMgmtInstance()
,getTaskInstances()
,iterator().next();
//現(xiàn)在,我們檢查taskinstance實(shí)際分配給了‘papa'.
assertEquals("papa",taskinstance.getActorId());
〃現(xiàn)在,我們期望'papa,完成了他的任務(wù)并且標(biāo)記任務(wù)是完成
的
tasklnstance.end();
//因?yàn)檫@是最后(唯一的)要做的任務(wù),這個(gè)任務(wù)的完成觸發(fā)
//流程實(shí)例的繼續(xù)執(zhí)行.
assertSame(processDefinition.getNode("end"),token.getNode());
}
3.5.客戶化動(dòng)作例子
動(dòng)作action是綁定你自己的定制java代碼和jBPM流程的一種機(jī)制.動(dòng)作可以
同它自己的節(jié)點(diǎn)關(guān)聯(lián)起來(lái)(如果它們?cè)诹鞒虉D表示中相關(guān)).動(dòng)作也可以放在事
件event上比如.takingatransition,leavinganode或者enteringanode.
在這個(gè)case,動(dòng)作不是圖表的一部分,但是它們?cè)诹鞒虉?zhí)行產(chǎn)生事件的時(shí)候,也會(huì)
被執(zhí)行.
我們將用一個(gè)例子:MyActionHandler來(lái)觀察動(dòng)作的實(shí)現(xiàn).這個(gè)動(dòng)作handler實(shí)
現(xiàn)不是什么非常特別的事情.它只是設(shè)置boolean變量isExecuted為true.變
量isExecuted是靜態(tài)的因此它可以在actionhandler內(nèi)部被訪問(wèn).
關(guān)于動(dòng)作action的內(nèi)容可以參看7.4節(jié),"動(dòng)作"
//MyActionHandler就是一個(gè)class可以在jBPM流程執(zhí)行時(shí)候在某
些用戶代碼里被執(zhí)行
publicclassMyActionHandlerimplementsActionHandler{
//在測(cè)試之前,isExecuted被設(shè)置為
false.
publicstaticbooleanisExecuted=false;
//動(dòng)作將設(shè)置true因此當(dāng)動(dòng)作被執(zhí)行
//unittest將會(huì)展示
publicvoidexecute(ExecutionContextexecutioncontext){
isExecuted=true;
)
)
//每次測(cè)試開(kāi)始都要設(shè)置MyActionHandler的成員static
isExecuted為
false.
publicvoidsetUp(){
MyActionHandler.isExecuted=false;
)
我們將要在轉(zhuǎn)換時(shí)開(kāi)始一個(gè)動(dòng)作
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還沒(méi)有被執(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);
)
下一個(gè)例子是同樣的動(dòng)作,但動(dòng)作被分別放在enter-node和leave-node事件.
注意節(jié)點(diǎn)同轉(zhuǎn)換相比有超過(guò)一個(gè)事件類型(eventtype)轉(zhuǎn)換(transition)只有一
個(gè)事件.
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è)計(jì)
前一頁(yè)后一頁(yè)
第四章.面向圖的程序設(shè)計(jì)
當(dāng)前工作流和業(yè)務(wù)流程管理(BPM)的總體發(fā)展來(lái)說(shuō)是極其零碎的.在一些工具,規(guī)
范和學(xué)術(shù)界發(fā)現(xiàn)很少的統(tǒng)一意見(jiàn).傳統(tǒng)方法導(dǎo)致笨重的,單系統(tǒng)把大量的功能包
含在一個(gè)單一的系統(tǒng)中
Java開(kāi)發(fā)語(yǔ)言中缺少的特性導(dǎo)致在這個(gè)范圍產(chǎn)生了完整系列的解決方法.這個(gè)
文章將標(biāo)識(shí)缺少的特性并且提出一個(gè)簡(jiǎn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年資產(chǎn)收購(gòu)框架協(xié)議
- 2024年量子通信技術(shù)合作協(xié)議
- 2025年度25噸汽車吊車租賃及現(xiàn)場(chǎng)施工支持合同3篇
- 《椎動(dòng)脈發(fā)育不全的血流動(dòng)力學(xué)改變及與后循環(huán)缺血性腦卒中的相關(guān)性研究》
- 《加筋土擋墻臨界高度研究》
- 《基于MOFs材料與過(guò)渡金屬硫化物異質(zhì)結(jié)的構(gòu)筑及光解水制氫性能研究》
- 《河北省盲人乒乓球運(yùn)動(dòng)發(fā)展困境與對(duì)策研究》
- 《基于決策樹(shù)技術(shù)的遙感影像分類研究》
- 《民生財(cái)政支出與居民消費(fèi)關(guān)系研究》
- 《信息不對(duì)稱條件下我國(guó)信貸市場(chǎng)利率影響因素的研究》
- 2024年度國(guó)有企事業(yè)單位標(biāo)準(zhǔn)化房屋租賃服務(wù)合同范本3篇
- 天安門地區(qū)地下空間開(kāi)發(fā)利用策略-洞察分析
- 湖北省黃石市大冶市2023-2024學(xué)年八年級(jí)上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 村衛(wèi)生站衛(wèi)生信息管理制度模版(3篇)
- 《基層管理者職業(yè)素養(yǎng)與行為規(guī)范》考核試題及答案
- 2024-2025學(xué)年 語(yǔ)文二年級(jí)上冊(cè)統(tǒng)編版期末測(cè)試卷(含答案)
- 《爆破理論基礎(chǔ)》課件
- 中國(guó)成人失眠診斷與治療指南(2023版)解讀
- 小兒咳嗽推拿治療
- 產(chǎn)品質(zhì)量知識(shí)培訓(xùn)課件
- 乳腺旋切手術(shù)
評(píng)論
0/150
提交評(píng)論