jBPM開發(fā)入門指南_第1頁
jBPM開發(fā)入門指南_第2頁
jBPM開發(fā)入門指南_第3頁
jBPM開發(fā)入門指南_第4頁
jBPM開發(fā)入門指南_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

jBPM開發(fā)入門指南(1)工作流即使還在不成熟發(fā)展階段,甚至還沒有一個公認規(guī)范標(biāo)準。但其應(yīng)用卻已經(jīng)在快速展開,這說明市場對工作流框架需求是緊迫而巨大。我們企業(yè)后臺短信管理系統(tǒng)包括短信編發(fā)、領(lǐng)導(dǎo)層層審核等操作,這是一個比較經(jīng)典工作流系統(tǒng)。過去我們用工作流引擎是shark,然后在使用后發(fā)覺其過于龐大,后臺數(shù)據(jù)庫操作頻繁而未進行優(yōu)化,直接造成后果就是前臺操作遲緩。于是經(jīng)研究決定,將工作流引擎由shark換成jBPM。jBPM之前是一個開源軟件,后加入JBoss組織。恰好我們企業(yè)也是用JBoss。不過jBPM并沒有綁定在JBOSS上,Tomcat等也能夠使用它。jBPM正處于不停發(fā)展中,做為開源軟件特點,其設(shè)計改變往往很大。所以一些過去資料可能已經(jīng)不適用了。于是作者依照自己使用經(jīng)驗,重新整理出這份文檔,以備學(xué)習(xí)參考。注:本文使用jBPM版本為3.1.1環(huán)境準備1、安裝JDK全部JAVA開發(fā)第一個需要安裝,沒什么好說。記得把系統(tǒng)變量JAVA_HOME設(shè)上。2、安裝AntAnt是使用jBPM必須一個工具。jBPM中很多操作都要用到Ant。安裝方法:(1)先下載:,選一個如:apache-ant-1.6.5-bin.zip。(2)解壓到D:\ant(當(dāng)然其余目錄也能夠)。(3)設(shè)置以下系統(tǒng)變量:ANT_HOME=d:\ant。(4)把%ANT_HOME%\bin加入到系統(tǒng)變量PATH中。3、安裝EclipseEclipse不是開發(fā)jBPM必須工具,但它是對jBPM開發(fā)很有幫助工具,尤其是jBPM提供了一個Eclipse插件用來輔助開發(fā)jBPM。關(guān)于Eclipse安裝不贅述了,本文用版本是:Eclipse3.2

安裝jBPMjBPM下載地址:

JBossjBPM是jBPM軟件包

JBossjBPMStartersKit是一個綜合包,它包含了jBPM軟件包、開發(fā)插件、一個配置好了基于JBossjBPM示例、一些數(shù)據(jù)庫配置文件示例。

JBossjBPMProcessDesignerPlugin是輔助開發(fā)jBPMEclipse插件。

JBossjBPMBPELExtensionjBPM關(guān)于BPEL擴展包本指南選擇下載:JBossjBPMStartersKit。下載后解壓到D:\jbpm-starters-kit-3.1,目錄下含有五個子目錄:

jbpmjBPM軟件包

jbpm-bpel只含有一個網(wǎng)頁

jbpm-db各種數(shù)據(jù)庫hibernate配置文件示例,有些還包含了對應(yīng)jdbc驅(qū)動程序。

jbpm-designer輔助開發(fā)jBPMEclipse插件,詳細在jbpm-gpd-feature子目錄中

jbpm-server一個已經(jīng)配置好了基于JBossjBPM示例.

感覺下工作流前面我們說了,在JBossjBPMStartersKitjbpm-server目錄是一個已經(jīng)配置好了jBPM示例,那么讓我們來感覺一下jBPM做出東西吧。

雙擊jbpm-server目錄下start.bat文件,開啟JBoss服務(wù)。這時會打開一個DOS窗口,開啟完成后,日志會不停輸出,其中最終一句是“13:55:39,937DEBUG[StaticNotifier]goingtowaitfor(CMD_EXECUTOR,java.lang.Object@1df59bd)”,這表示jBPM在開始工作了,它不停進行輪詢。打開網(wǎng)頁:http://localhost:8080/jbpm/得到以下畫面

這是一個已經(jīng)用jBPM開發(fā)好用戶定單流程,具備下單、審核、估價等流程。它所用數(shù)據(jù)庫是一個內(nèi)置數(shù)據(jù)庫。以cookiemonster用戶登錄,選擇“createnewwebsaleorder”能夠創(chuàng)建一個定單。以下列圖所表示,在圖左邊是填寫定單情況,右邊一整個定貨流程示意圖,紅色框表示流程進行到哪一步了。填寫好定單好,選擇“SaveandCloseTask”,完成定單提交。

選擇右上角“Loginasanotheruser”以另外一個用戶名ernie登錄。這時能夠看到ernie用戶任務(wù)列表中多了一項。

點進去后,顯示以下畫面。這個示例對漢字支持不好,全都顯示成了unicode碼了。不論這什么多,反正知道是這么回事就行了。在comment項填寫意見,選OK按鈕,進入到下一步。假如選擇moreinfoneeded按鈕,則打回給cookiemonster用戶修改定單。

下面流程,這里就不再贅述了。在這個很標(biāo)準工作流示例中,我們基本能夠看到j(luò)BPM應(yīng)用范圍還是比較廣。而且從這個示例,我們是看不出有jBPM,也就是說jBPM在后臺起著作用。從這個例子,還看不出jBPM優(yōu)勢。不過,假如在一個流程不確定,經(jīng)常需要變動項目中,jBPM好處將會顯然出來。應(yīng)用jBPM后,改變流程只需改變流程描述文件,這將在后面內(nèi)容提到。這是一個已做好示例,接下來我們將仿造這個實例來開發(fā)一個請假流程。4數(shù)據(jù)庫初始化jBPM需要數(shù)據(jù)庫支持,jBPM會把自己一個初始化數(shù)據(jù)存放到數(shù)據(jù)庫,同時工作流數(shù)據(jù)也是存放到數(shù)據(jù)庫中。jBPM使用Hibernate來做為自己存放層,所以只要是Hibernate支持數(shù)據(jù)庫,jBPM也就支持。本文先以MySQL為例,然后再以O(shè)racle為例,來談?wù)刯BPM數(shù)據(jù)庫初始化操作。注:在上面JBoss自帶示例中,并沒有設(shè)置數(shù)據(jù)庫,那是因為jBPM默認使用是內(nèi)存數(shù)據(jù)庫hsqldb。4.1MySQL1、首先安裝MySQL。MySQL安裝比較簡單,網(wǎng)上也有很多文章,本文不再贅述。本指南所用MySQL版本為MySQL4.1(forwindows)。再找一個MySQL客戶端,目標(biāo)是方便查看數(shù)據(jù)庫中數(shù)據(jù),本文推薦使用MySQL網(wǎng)站上無償提供“MySQLQueryBrower”,當(dāng)然你用其余客戶端也行,比如MySQL-Front。2、建庫MySQL中創(chuàng)建一個庫,庫名:jbpm3、生成建表SQL語句并建表將jbpm-starters-kit-3.1.1下子目錄jbpm更名為jbpm.3,不然在執(zhí)行下面ant命令時會報如jbpm.3目錄不存在錯誤:D:\jbpm-starters-kit-3.1.1\jbpm-db\build.xml:361:Thefollowingerroroccurredwhileexecutingthisline:D:\jbpm-starters-kit-3.1.1\jbpm-db\build.xml:68:BasedirD:\jbpm-starters-kit-3.1.1\jbpm.3doesnotexist在DOS窗下,進入D:\jbpm-starters-kit-3.1.1\jbpm-db目錄,執(zhí)行以下命令:antmysql.scripts執(zhí)行成功后,在D:\jbpm-starters-kit-3.1.1\jbpm-db\build\mysql\scripts目錄里生成了四個sql文件,它們做什么用一看名字就知道了。在MySQL客戶端中執(zhí)行“mysql.create.sql”腳本,這么將在jbpm庫中創(chuàng)建一個個數(shù)據(jù)表。4.2Oracle先安裝好Oracle服務(wù)器。我們企業(yè)有現(xiàn)存Oracle服務(wù)器,也提供給了我一個屬于我自己用戶名,一登錄就能夠任意在我?guī)熘聞?chuàng)建表了。所以這一步就省了,沒有自個先裝好吧。訪問Oracle推薦用“PLSQLDeveloper”。不過要連接Oracle還要在本機上裝上Oracle自己客戶端程序,里面提供了JDBC包和一些配置。要連接服務(wù)器還得配置一下,我通常都是不用GUI而直接改tnsnames.ora文件,在我電腦里此文件目錄地址是:D:\oracle\ora92\network\ADMIN\tnsnames.ora,內(nèi)容以下(兩面有兩個配置了):#TNSNAMES.ORANetworkConfigurationFile:E:\oracle\ora92\network\admin\tnsnames.ora#GeneratedbyOracleconfigurationtools.WXXRDB_=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521)))(CONNECT_DATA=(SID=wxxrDB)(SERVER=DEDICATED)))WXXRDB_=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521)))(CONNECT_DATA=(SID=wxxrDB)(SERVER=DEDICATED)))前面都是Oracle一些知識,不會谷歌一下吧。最終配置好后,用PLSQLDeveloper輸入你用戶名和密碼聯(lián)接到Oracle,就算OK了。參考上面MySQL步驟,基本一樣:(1)

將jbpm更名為jbpm.3(2)

再執(zhí)行antoracle.scripts(3)

用jbpm-db\build\oracle\scripts目錄oracle.create.sql腳本,在Oracle中生成jBPM全部表。在“PLSQLDeveloper”中能夠新建一個CommandWindows窗口然后輸入命令:@D:\jbpm-starters-kit-3.1.1\jbpm-db\build\oracle\scripts\oracle.create.sql5安裝jBPMEclipse開發(fā)插件有個輔助工具開發(fā)起來方便一點,只不過現(xiàn)在jBPM開發(fā)工具插件功效還不算太強,也就一個“項目創(chuàng)建向?qū)А惫πВ屇悖海?)不用再去配置classpath庫引用了(2)直接得到了一個jBPM項目初始結(jié)構(gòu)其實吧,開發(fā)jBPM也不需要什么插件工具,在熟練了以后,庫引用了項目初始結(jié)構(gòu)都能夠手工創(chuàng)建。插件不用再去下載了,jbpm-starters-kit-3.1.1包里就有,目錄地址以下:D:\jbpm-starters-kit-3.1.1\jbpm-designer\jbpm-gpd-feature\eclipse,插件安裝方式是鏈接式還是直接復(fù)制式,任選吧。不懂就去看看《Eclipse從入門精通》這本書,在前面章節(jié)都有講到。另外,注明一下Eclipse版本我是用3.2,插件和Eclispe版本相關(guān),要注意了。假如安裝成功,則Eclipse首選項里多了一個JBossjBPM,另外我們也需要到這個jBPM首選項里做一些配置工作――指定jBPM安裝路徑(以下列圖所表示)。這個配置主要是為了找到j(luò)bpm下各種jar包,好讓Eclipse設(shè)置項目標(biāo)庫引用。本文指向路徑是d:\jbpm-starters-kit-3.1.1\jbpm.36jBPMHelloWorld6.1新建jBPM項目主菜單“文件->新建->項目”,在彈出對話框里,有“ProcessProject”項,以下列圖所表示:

選上好,單擊“下一步”,起個名“myjbpm”,然后就能夠單擊“完成”了。然后就生成了以下列圖所表示一個項目結(jié)構(gòu):

這個項目和通常Eclipse項目結(jié)構(gòu)有點不一樣,不過這是一個現(xiàn)在非常流行項目結(jié)構(gòu),src/java存放源文件,test/java存放對應(yīng)JUnit單元測試代碼。假如你用Maven來編譯構(gòu)建項目,對這種目錄結(jié)構(gòu)一定不陌生。項目創(chuàng)建起了,介紹一下里面文件吧:

MessageActionHandler,自動生成一個ActionHandler。不想要能夠刪掉。

ehcache.xmlcache配置文件,里面有很詳解英文說明。沒有必要能夠不用改它。

hibernate.cfg.xmljBPM是用Hibernate進行工作流數(shù)據(jù)存放,這個就是Hibernate配置文件。后面我們將講到怎樣配置這個文件。

jbpm.cfg.xmljbpm本身配置文件。現(xiàn)在是空,它用是缺省配置,你想知道有哪些配置就去看這個文件D:\jbpm-starters-kit-3.1.1\jbpm.3\src\java.jbpm\org\jbpm\default.jbpm.cfg.xml

perties這個是日志API包log4j配置文件,用過log4j都知道。

SimpleProcessTest.java這個是對最主要流程配置文件processdefinition.xml單元測試代碼。這里褒揚一點,jBPM優(yōu)良設(shè)計使得它可測試性非常之高,喜歡寫t單元測試人有福了。

gpd.xml用于生成流程圖定義文件。都是一些方框坐標(biāo)和長寬

processdefinition.xml這個是對最主要流程配置文件,以后寫流程要經(jīng)常和它打交道。

processimage.jpg一個流程圖

從項目結(jié)構(gòu)來看,我們沒有看到JSP網(wǎng)頁程序,也沒有看到GUI客戶端程序,這些代碼都是要我們以后開發(fā)中來寫。但本文不準備用JSP、GUI(Swing、SWT)來做示例,而是用JUnit代碼來做使用jBPM客戶端來演示。因為jBPM實際上是一個后臺框架,至于前臺是JSP還是Swing還是無界面java.class都是無關(guān)緊要。在教程里用無界面java.class來做客戶端則更方便一些,假如深入采取JUnit,則這么java.class同時還具備了單元測試功效。以后就是用JSP寫了WEB頁面,我們還是能夠用這些JUnit程序來做單元測試,防止了頻繁鼠標(biāo)點按WEB頁面這么力氣活。所以在jBPM自帶英文教程里都是一個JUnit程序,不仔佃看還真摸不著頭腦。6.2修改hibernate.cfg.xml hibernate.cfg.xml默認設(shè)置是用HSQL,這是一個內(nèi)存數(shù)據(jù)庫,這種內(nèi)存數(shù)據(jù)庫用來代替項目實際所用數(shù)據(jù)庫來做單元測試挺不錯。不過我們這里是要試試用MySQL、Oracle,那就改一下設(shè)置吧。注:配置值可參考D:\jbpm-starters-kit-3.1.1\jbpm-db對應(yīng)子目錄下perties文件。1、MySQL更改以下:<propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><propertyname="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpm</property><propertyname="hibernate.connection.username">root</property><propertyname="hibernate.connection.password">123456</property>2、Oracle更改以下:<propertyname="hibernate.dialect">org.hibernate.dialect.OracleDialect</property><propertyname="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property><propertyname="hibernate.connection.url">jdbc:oracle:thin:@0:1521:wxxrDB</property><propertyname="hibernate.connection.username">chengang</property><propertyname="hibernate.connection.password">chengang</property>假如你裝了Oracle客戶端,而且D:\oracle\ora92\network\ADMIN\tnsnames.ora里做了以下設(shè)置WXXRDB_0=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=0)(PORT=1521)))(CONNECT_DATA=(SID=wxxrDB)(SERVER=DEDICATED)))

則Oraclehibernate.connection.url項也能夠設(shè)為:jdbc:oracle:oci:@WXXRDB_06.3完善庫引用 即使jBPM在創(chuàng)建項目之初給我們設(shè)置好了庫引用,以下列圖但后面運行時還是報一些NoClassDefFoundError異常,如沒有對hibernate3.jar引用造成下面錯誤java.lang.NoClassDefFoundError:org/hibernate/Session atorg.jbpm.persistence.db.DbPersistenceServiceFactory.openService(DbPersistenceServiceFactory.java:55) atorg.jbpm.svc.Services.getService(Services.java:136) .......所以我們要為本文實例完善庫引用。主要是把MySQL和OracleJDBC庫、以及Hibernatehibernate3.jar加入到項目標(biāo)庫引用中。(1)

找到缺乏jar包

mysqljdbc包,在D:\jbpm-starters-kit-3.1.1\jbpm-db\mysql\lib目錄里

oraclejdbc包,jbmp中沒有包含(可能是沒拿到oracle授權(quán)),我們能夠自已去oracle網(wǎng)站上下載,或者去oracle安裝目錄D:\oracle\ora92\jdbc\lib找ojdbc14.jar(我們企業(yè)用是Oracle9i)

Hibernate3.jar在目錄D:\jbpm-starters-kit-3.1.1\jbpm.3\lib\hibernate里。(2)

在項目里創(chuàng)建一個lib目錄,將這三個jar復(fù)制到lib目錄。(3)

以下列圖設(shè)置三jar包庫引用6.4開始HellorWorld這里是一個很簡單請假流程,請假人提交假單給經(jīng)理審批,經(jīng)理審批后結(jié)束。要說明是,這個流程并不嚴謹,比如經(jīng)理不經(jīng)過流程應(yīng)該到哪?不過這并不防礙拿它來做示例,螃蟹還得一個一個吃。我們先拿這一桿子捅到底流程做一個最簡單示例,從整體上對jBPM工作流開發(fā)有概念先。然后我們再慢慢豐富。1、定義流程流程定義文件是processdefinition.xml,這個是一個關(guān)鍵文件,jBPM很大一部份內(nèi)容都是關(guān)于它。在這里我們把原來自動生成內(nèi)容,稍做改動:<?xmlversion="1.0"encoding="GBK"?><process-definitionxmlns="urn::jpdl-3.1"name="helloworld"> <!--申請--> <start-statename="request"> <task> <controller> <variablename="name"/> <variablename="day"/> <variablename="note"/> </controller> </task> <!--流程轉(zhuǎn)向--> <transitionname="to_confirm"to="confirm"> <actionname="requestAction" class=".chengang.jbpm.RequestAction"> <reason>我要請假</reason> </action> </transition> </start-state> <!--審批--> <statename="confirm"> <transitionname="to_end"to="end"> <actionname="finishAction" class=".chengang.jbpm.ConfirmAction"/> </transition> </state> <!--結(jié)束--> <end-statename="end"/></process-definition>

說明:流程名稱改成了helloworld。(呵呵,也就是這里和helloworld關(guān)于了)<controller>標(biāo)簽定義了三個數(shù)據(jù):姓名、請假天數(shù)、說明。<transition>標(biāo)簽定了request節(jié)點一個流程轉(zhuǎn)向,這里是轉(zhuǎn)到confirm節(jié)點。<action>標(biāo)簽定義了流程由一個節(jié)點轉(zhuǎn)到另一個節(jié)點時,所要執(zhí)行動作,動作封裝在一個ActionHandler類中。比如這里當(dāng)request到confirm結(jié)點時將執(zhí)行RequestAction類execute方法。FinishAction下面還有一個<reason>(請假理由),它對應(yīng)于FinshAction屬性Stringreason。2、編寫ActionHandler 在上面processdefinition.xml里我們定義了兩個ActionHandler:RequestAction、ConfirmAction。其代碼以下:package.chengang.jbpm;importorg.jbpm.graph.def.ActionHandler;importorg.jbpm.graph.exe.ExecutionContext;publicclassRequestActionimplementsActionHandler{ privatestaticfinallongserialVersionUID=1L; privateStringreason; publicStringgetReason(){ returnreason; } publicvoidsetReason(Stringreason){ this.reason=reason; } publicvoidexecute(ExecutionContextcontext)throwsException{ context.getContextInstance().setVariable("note",reason); }}說明:ExecutionContext是一個貫通流程容器。它是個大寶箱,里面啥玩意都有,后面將更深入提到。這里reasion就是processdefinition.xml中”我要請假”package.chengang.jbpm;importorg.jbpm.graph.def.ActionHandler;importorg.jbpm.graph.exe.ExecutionContext;publicclassConfirmActionimplementsActionHandler{ privatestaticfinallongserialVersionUID=1L; publicvoidexecute(ExecutionContextcontext)throwsException{ context.getContextInstance().setVariable("note","準假"); }}OK,后臺程序就算寫完了(前臺客戶端程序還沒寫),下面開始布署。6.5布署processdefinition.xml 我們要把processdefinition.xml流程定義數(shù)據(jù)布署到數(shù)據(jù)庫中,因為jBPM在正式運行時候不是去讀processdefinition.xml文件,而是去讀數(shù)據(jù)庫中流程定義。 這里寫了一個個JUnit程序來布署processdefinition.xml,當(dāng)然你用普通JavaMain也能夠。packagecom.sample;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.InputStream;importjunit.framework.TestCase;importorg.jbpm.JbpmConfiguration;importorg.jbpm.JbpmContext;importorg.jbpm.graph.def.ProcessDefinition;/***布署processdefinition.xml**@authorchengang**/publicclassDeployProcessTestextendsTestCase{ /** *在本方法執(zhí)行完成后,檢驗jbpm_processdefinition表會多了一條統(tǒng)計 * *@throwsFileNotFoundException */ publicvoidtestDeployProcessDefinition()throwsFileNotFoundException{ //從jbpm.cfg.xml取得jbpm配置 JbpmConfigurationconfig=JbpmConfiguration.getInstance(); //創(chuàng)建一個jbpm容器 JbpmContextjbpmContext=config.createJbpmContext(); //由processdefinition.xml生成相對應(yīng)流程定義類ProcessDefinition InputStreamis=newFileInputStream("processes/simple/processdefinition.xml"); ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlInputStream(is); //利用容器方法將流程定義數(shù)據(jù)布署到數(shù)據(jù)庫上 jbpmContext.deployProcessDefinition(processDefinition); //關(guān)閉jbpmContext jbpmContext.close(); }}運行此程序,在控制臺打印了一些日志,經(jīng)過。假如犯錯,仔佃閱讀犯錯信息以判斷錯誤原因,并確定你按照前面兩節(jié):“修改hibernate.cfg.xml”和“完善庫引用”內(nèi)容做好了設(shè)置。6.6從數(shù)據(jù)庫中查看布署效果不論是MySQL還是Oracle,查詢jbpm_processdefinition表,你會發(fā)覺多了一條統(tǒng)計,以下列圖(以PLSQLDeveloper顯示為例)依次檢驗各表我們能夠發(fā)覺有以下改變:

并由此簡單判斷出各表作用,表中各字段作用由字段名也能知曉一二。jbpm_processdefinition一個流程定義文件對應(yīng)一條統(tǒng)計,可統(tǒng)計多個流程定義文件,可統(tǒng)計一個流程定義文件對個版本。jbpm_action統(tǒng)計ActionHandler對象實例(以名稱為標(biāo)識)jbpm_delegation統(tǒng)計了ActionHandler全類名,方便于用反射方式來加載jbpm_envent它transition引用了Jbpm_transition表id,再看其它字段,估量此表是表示流程轉(zhuǎn)向事件一個實例,或者是一個各表之間聯(lián)接表。jbpm_node流程結(jié)點jbpm_transition流程轉(zhuǎn)向定義jbpm_variableaccess流程中攜帶變量。ACCESS字段是這些變量讀寫權(quán)限7jBPM客戶端開發(fā)有了前面HelloWorld后臺流程,我們就要開始客戶端程序了。正如前面提到,本文不寫JSP,而改采取JUnit形式,輸出則用System.out.println。舉一反三,知道在方法中輸入及用println輸出,在JSP和SWING等GUI界面還不是一樣嘛。這個JUnit客戶端,我們就借用創(chuàng)建項目時自動生成SimpleProcessTest.java了,改寫后以下:packagecom.sample;importjunit.framework.TestCase;importorg.jbpm.JbpmConfiguration;importorg.jbpm.JbpmContext;importorg.jbpm.context.exe.ContextInstance;importorg.jbpm.graph.def.ProcessDefinition;importorg.jbpm.graph.exe.ProcessInstance;publicclassSimpleProcessTestextendsTestCase{ privateJbpmConfigurationconfig=JbpmConfiguration.getInstance(); privateJbpmContextctx=config.createJbpmContext(); //helloworld對應(yīng)于jbpm_processdefinition表name字段值,也即processdefinition.xmlname //這個值得取比較耗時,實際項目里最好和“數(shù)據(jù)庫JDBC連接”一樣,讓它共享,不要頻繁打開關(guān)閉。 privateProcessDefinitionprocessDefinition=ctx.getGraphSession().findLatestProcessDefinition("helloworld"); publicvoidtestNewRequest(){ longid=newRequest(); System.out.println("id="+id); checkNewRequest(id); confirmRequest(id); checkconfirmRequest(id); ctx.close();//關(guān)閉jbpm容器 } /** *創(chuàng)建一個請假單 * *@return */ privatelongnewRequest(){ //創(chuàng)建一個新流程 ProcessInstancepi=processDefinition.createProcessInstance(); //取得流程數(shù)據(jù)環(huán)境 ContextInstanceci=pi.getContextInstance(); //創(chuàng)建一張請假單 ci.setVariable("name","陳剛."); ci.setVariable("day",2); assertEquals(null,ci.getVariable("note")); //請假申請結(jié)束,轉(zhuǎn)到下一個流程結(jié)點 pi.signal(); returnpi.getId(); } /** *檢驗請假單數(shù)據(jù) * *@paramid */ privatevoidcheckNewRequest(longid){ //從數(shù)據(jù)庫提取原流程 ProcessInstancepi=ctx.loadProcessInstance(id); //取得流程數(shù)據(jù)環(huán)境 ContextInstanceci=pi.getContextInstance(); //創(chuàng)建一張請假單 assertEquals("陳剛.",ci.getVariable("name")); assertEquals(Integer.valueOf(2),ci.getVariable("day")); assertEquals("我要請假",ci.getVariable("note")); //當(dāng)前是結(jié)點為confirm assertEquals(pi.getRootToken().getNode().getName(),"confirm"); //流程還沒結(jié)束 assertFalse(pi.hasEnded()); } /** *審批陳剛請假申請 * *@paramid */ privatevoidconfirmRequest(longid){ ProcessInstancepi=ctx.loadProcessInstance(id); ContextInstanceci=pi.getContextInstance(); //不經(jīng)過 ci.setVariable("note","不準請假,繼續(xù)加班"); //審批結(jié)束,到下一個流程結(jié)點 pi.signal(); } privatevoidcheckConfirmRequest(longid){ ProcessInstancepi=ctx.loadProcessInstance(id); ContextInstanceci=pi.getContextInstance(); //ConfirmAction類在signal后執(zhí)行,所以覆蓋了經(jīng)理審批意見 assertEquals("準假",ci.getVariable("note")); //當(dāng)前是結(jié)點為end assertEquals(pi.getRootToken().getNode().getName(),"end"); //流程結(jié)束了 assertTrue(pi.hasEnded()); }}這個例子還是很簡單,而且關(guān)鍵是缺乏用戶、組、權(quán)限等工作流系統(tǒng)必須東西,不過沒關(guān)系。下面內(nèi)容我將完成一個更完整實例。前篇說起要講在JBPM中實現(xiàn)用戶權(quán)限,但這段時間比較忙,一直拖著。這里先把jbpm自帶websale例子放上來,大家先將就看看。這個例子我已經(jīng)把它抽取了出去,網(wǎng)頁部份丟棄了。在看時候主要看WebsaleTest.java,看看它用戶權(quán)限是怎么用。

幾個重點:

(1)jBPM沒有角色概念!!!很多人把ActorID了解成角色,那是相當(dāng)錯誤。jBPM只有參加者概念,也就是ActorID,它能夠是用戶ID,也能夠是角色ID,也能夠什么都不是。你要自己去把用戶角色等東東和ActorID映射起來。不過通常我們把ActorID設(shè)置成角色,但jbpmwebsale卻是設(shè)置成用戶。

(2)用戶信息入口是JbpmContext,里面有一個setActorID方法。你用戶登錄時候,把一些用戶信息set進去。

(3)泳道概念:你去看看UML中帶泳道活動圖,那就是象一個游泳池里泳道一樣。

安裝提醒:

<classpathentrykind="con"path="JBPM/jBPM3.1.2"/>

.classpath這一句很可能和你電腦設(shè)置不符,這是jbpm插件一個設(shè)置,指向jbpmHOME目錄,方便找到j(luò)bpmjar包。你按照你電腦上設(shè)置對應(yīng)修改一下這一行。

websaleeclipse項目ZIP包:postedon-09-1619:09陳剛閱讀(1043)評論(5)

編輯

收藏引用收藏至365Key所屬分類:jBPM評論\o"permalink:re:jBPM開發(fā)入門指南(5)"#

re:jBPM開發(fā)入門指南(5)

回復(fù)

哈哈。。看看哈~~-09-1809:06|ktm\o"permalink:re:jBPM開發(fā)入門指南(5)"#

re:jBPM開發(fā)入門指南(5)

回復(fù)

說實在,這些都沒有太大用,我看JBPM都能看到這些內(nèi)容,關(guān)鍵是詳細跟業(yè)務(wù),詳細組織架構(gòu)聯(lián)絡(luò)在一起時怎么處理,有些系統(tǒng)是完全基于工作流系統(tǒng)(連表單也是工作流產(chǎn)生),業(yè)務(wù)隸屬于工作流,但大業(yè)務(wù)系統(tǒng)不可能這么作,工作流應(yīng)該為業(yè)務(wù)服務(wù),這是我愚見,也是我迷惑!-09-2211:11|ivor\o"permalink:re:jBPM開發(fā)入門指南(5)"#

re:jBPM開發(fā)入門指南(5)

回復(fù)

陳大哥,問個問題,我看了你這幾篇入門指南之后,照你步驟運行了一下,大致都還算順利.不過每次在調(diào)用JbpmContext.close();方法時候,總是會拋出異常:

NewPooledConnection:AThrowableoccurredwhiletryingtoresetthetypeMappropertyofourConnectiontoCollections.EMPTY_MAP!

java.sql.SQLException:TheConnection.setTypeMap(Map)methodisnotimplemented.

atnet.sourceforge.jtds.jdbc.ConnectionJDBC2.notImplemented(ConnectionJDBC2.java:1519)

atnet.sourceforge.jtds.jdbc.ConnectionJDBC2.setTypeMap(ConnectionJDBC2.java:2123)

是什么原因呢,是jtds包版本不對嗎?-09-2717:49|xiaoshi\o"permalink:re:jBPM開發(fā)入門指南(5)"#

re:jBPM開發(fā)入門指南(5)

回復(fù)

另外,我看了下ConnectionJDBC2.java里面代碼,其中setTypeMap方法以下:

publicvoidsetTypeMap(Mapmap)throwsSQLException{

checkOpen();

notImplemented("Connection.setTypeMap(Map)");

}

它里面調(diào)用了notImplemented方法,而notImplemented方法是這么:

/**

*Reportsthatusertriedtocallamethodwhichhasnotbeenimplemented.

*

*@parammethodthemethodnametoreportintheerrormessage

*@throwsSQLExceptionalways,withthenotimplementedmessage

*/

staticvoidnotImplemented(Stringmethod)throwsSQLException{

thrownewSQLException(

Messages.get("error.generic.notimp",method),"HYC00");

}

看注釋意思是調(diào)用了一個還沒有實現(xiàn)方法,為何會出現(xiàn)這種情況呢??

從JbpmContext.close()方法,調(diào)用棧以下:

atnet.sourceforge.jtds.jdbc.ConnectionJDBC2.notImplemented(ConnectionJDBC2.java:1519)

atnet.sourceforge.jtds.jdbc.ConnectionJDBC2.setTypeMap(ConnectionJDBC2.java:2123)

atcom.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConne

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論