工作流與JBPM開發(fā)實例精解_第1頁
工作流與JBPM開發(fā)實例精解_第2頁
工作流與JBPM開發(fā)實例精解_第3頁
工作流與JBPM開發(fā)實例精解_第4頁
工作流與JBPM開發(fā)實例精解_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

1/1工作流與JBPM開發(fā)實例精解1.工作流與JBPM開發(fā)實例

前幾天發(fā)了一篇文章,沒幾個人看也沒人留言,看來我這功夫差的還是遠(yuǎn)啊,今天來一個實際點的吧??赡苌匣氐膹U話太多。說說這個jbpm應(yīng)該怎么來用。

首先當(dāng)你想學(xué)一個框架的時候一定是你要有項目來用他了,OK,那么你項目當(dāng)中的流程是什么你應(yīng)該清楚吧,那么當(dāng)你清楚了這些的時候我們就開始我們這個最簡單的例子吧。

假如我們現(xiàn)在有這么一個例子,公司員工想報銷點出差費,那么他要將他的申請?zhí)峤唤o他的第一級領(lǐng)導(dǎo)——部門主管去審批,然后部門主管審批完了之后還要交給這個部門主管的上級公司老總進(jìn)行審批。那么針對這個簡單的流程,我們應(yīng)該從哪里下手呢?

首先第一件事情就是寫流程定義文件,那么這個文件我們用什么來寫呢,他就是一個符合某個語法的xml文件,幸運的是jbpm給我們提供了一個集成的開發(fā)環(huán)境讓我們來用。

首先去官網(wǎng)上下一個jbpm-jpdl-suite-3.2.GA包,解壓后你會發(fā)現(xiàn)他里面有一個designer文件夾,那個里面就是我們寫流程定義文件的開發(fā)環(huán)境,他是一個eclipse的插件,但是好像他給我們的那個eclipse版本有問題,建議大家從新下一個eclipse-SDK-3.2.1-win32.zip這個版本的eclipse,然后覆蓋他給我們提供的那個。

準(zhǔn)備工作做完了,那么我們就開始吧,首先我們打開解壓目錄下的designer文件夾中的designer.bat文件,他彈出一個eclipse,然后我們就用這個東西來開發(fā)我們的流程定義文件了。

打開之后你就會看見一個他的小例子,不過我們不去用他,我們自己新建一個工程。右鍵-new-other-jBossjbpm-processproject。這個時候你會看見他彈出一個對話框,輸入你的工程名字,然后點擊next,這個時候你會發(fā)現(xiàn)他已經(jīng)把jbpm加載進(jìn)去了,記住要選中Generatesimple。

工程建立完了,我們開始建立我們的流程定義文件。在工程里面你會發(fā)現(xiàn)src/main/jpdl這個sourcefolder,然后你會看見他里面已經(jīng)有了一個流程定義文件了,但是我們不去用他的,我們自己建立一個,右鍵src/main/jpdl,然后new-other-jBossjbpm-processdefinition。這個時候他就會彈出一個對話框,起一個你要寫的流程定義文件的名字輸入進(jìn)去,OK,可以了。這個時候你打開你建立的那個文件夾,里面就有processdefinition.xml文件,ok,打開他。

在右面的圖里面你就可以看到一張什么都沒有的白紙,我們看看這部分左面的那些東西,什么start啊,end啊,tasknode啊,fork啊,join啊。那我們來解釋一下這是個什么東西呢,我們看看我們的需求,員工要寫一個報銷單,然

后交給部門主管來處理,那么部門主管就應(yīng)該算是一個tasknode,他就是一個任務(wù)節(jié)點。start和end其實就是一個虛狀態(tài),當(dāng)我們寫完報銷單的時候我們就提交了,這個時候他就到了第一個tasknode這個節(jié)點了。然后他審批完了還要交給總經(jīng)理審批,那么他又是一個tasknode,然后總經(jīng)理審批完了結(jié)束,ok,是一個end。

start--》tasknode(部門主管審批)--》tasknode(總經(jīng)理審批)--》end。

如果覺得看的有點模糊可以看看我傳上來的那個圖。然后你在這個試圖框的下面可以看到有個source,點擊一下,就會發(fā)現(xiàn)他已經(jīng)自動的給你生成xml代碼了。但是這樣還是有點不夠,我們只是定義了一個tasknode節(jié)點,并沒有定義tasknode節(jié)點的任務(wù)由誰來做。那么我們還要定義一個tasknode節(jié)點是由誰來做的:

那么這段代碼是這么寫的:

Java代碼

1.

2.

3.4.xmlns=""name="test1">

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

這樣的話我們的流程定義文件就定義完了,但是這只是把文件定義完了,系統(tǒng)并不知道啊,所以我們還要把我們的文件部署到系統(tǒng)中去,那么這個過程是這樣的:

首先我們在src/main/java里面新建立一個包,然后建立一個class,隨便

起個名字,就叫TestJBPM_01吧,那么在這個類里面我們要做的是什么呢?我們要先導(dǎo)入表,因為jbpm要運行就要用到很多個表,ok,那么我們這個里面導(dǎo)入表和hibernate導(dǎo)入表是差不多的,它的代碼是這樣的:

Java代碼

1.packagecom.jbpm.test;

2.

3.importjunit.framework.TestCase;

4.

5.importorg.jbpm.JbpmConfiguration;

6.

7.publicclassTestJbpm_01extendsTestCase{

8.

9.publicvoidtestJbpm(){

10.

11.//創(chuàng)建jbpm數(shù)據(jù)庫表。他就像hibernate里面的哪個export

一樣。實際上他就是hibernate里面的哪個export。

12.//應(yīng)為他映射了很多個表,所以我們就能創(chuàng)建那么多個表。

13.JbpmConfiguration.getInstance().createSchema();

14.

15.}

16.}

然后呢我們就開始部署我們的流程定義文件,我們將這個文件當(dāng)中的內(nèi)容呢放到數(shù)據(jù)庫當(dāng)中去,當(dāng)我們以后再用的時候呢我們就隨時的將它加載出來。

Java代碼

1.packagecom.jbpm.test;

2.

3.importjunit.framework.TestCase;

4.

5.importorg.jbpm.JbpmConfiguration;

6.importorg.jbpm.JbpmContext;

7.importorg.jbpm.graph.def.ProcessDefinition;

8.

9.publicclassTestJbpm_02extendsTestCase{

10.

11.//jbpmConfiguration對象的創(chuàng)建

12.staticJbpmConfigurationjbpmConfiguration=JbpmConfigurat

ion.getInstance();

13.

14.publicvoidtestJbpm(){

15.

16.//然后我們把processDefinition里面相關(guān)的對象持久化到數(shù)

據(jù)庫里面去。

17.//流程定義文件里面有很多個概念,他有node,有transition,

還有processDefinition,那么我們不需要一個

18.//一個保存,jbpm把保存這么多對象的方法封裝成一個接口,

叫做deployProcessDefinition。我們只要調(diào)用這個

19.//方法,傳一個processDefinition對象,我們就能將他們存入

到數(shù)據(jù)庫里面去。

20.

21.//這個首先第一步我們要得到一個processDefinition對象,然

后我們把他部署到流程中去。

22.ProcessDefinitionprocessDefinition=ProcessDefinition

.parseXmlResource("testJBPM/testJbpm.xml");

23.//我們要存就必須獲得一個session對象,而jbpm已經(jīng)把

session對象封裝到一個JbpmContext對象里面了。

24.//那么這個jbpmContext對象是怎么得到的呢,我們要先有一個

jbpmConfiguration對象,我們要對數(shù)據(jù)庫進(jìn)行

25.//操作的時候一定要有jbpmConfiguration這個對象,用他來創(chuàng)

建一個類似于hibernate當(dāng)中的session一樣的

26.//對象——jbpmContext。他是我們對數(shù)據(jù)庫所有的操作的一個

接口。

27.JbpmContextjbpmContext=jbpmConfiguration.createJbpmC

ontext();

28.try{

29.//然后部署的操作已經(jīng)由jbpmContext給我們創(chuàng)建好了,我

們只需要調(diào)一下他的一個方法就可以了。

30.jbpmContext.deployProcessDefinition(processDefiniti

on);

31.}finally{

32.//最后我們還要對他close一下,就像我們用hibernate

的時候要closesession一樣。

33.jbpmContext.close();

34.}

35.}

36.}

Ok,第二步我們也做完了,那么現(xiàn)在我們開始做第三步,也就是說,我們流程定義文件寫好了,現(xiàn)在我們的系統(tǒng)當(dāng)中有了這樣一個報銷流程,那么就開始實際的去用她吧,一個人小報銷了,那么她就要寫一個報銷的申請,但是這個報銷的申請寫完了存到數(shù)據(jù)庫當(dāng)中了還不能算完了,應(yīng)該和我們的這個流程關(guān)聯(lián)起來啊,那么她應(yīng)該怎么去關(guān)聯(lián)呢,嘿嘿,是這樣地:我們在建立這個申請單這個類的時候應(yīng)該定義一個processInstanceId屬性,她是一個long型的,她就記錄這我們的這個流程實例的id,那么什么是流程實例(processInstance)呢,她是我

們工作流當(dāng)中第二重要的概念,他和流程定義的關(guān)系就相當(dāng)于對象和類之間的關(guān)系,類是一個抽象的東西,她定義完了是什么也干不了的,要想用她內(nèi)部定義的東西我們就要new出一個實例來,當(dāng)然這個里面也是這樣的。

那么也就是說,當(dāng)我們創(chuàng)建這個報銷申請的時候我們就要先根據(jù)這個流程

‘new’出一個流程實例來存到數(shù)據(jù)庫當(dāng)中,然后在把她的id傳給報銷申請對象然后再將這個報銷申請對象存到數(shù)據(jù)庫當(dāng)中。那么這個代碼是這樣的:

Java代碼

1.packagecom.jbpm.test;

2.

3.importjunit.framework.TestCase;

4.

5.importorg.hibernate.Session;

6.

7.publicclassTestJbpm_03extendsTestCase{

8.

9.publicvoidtestJbpm(){

10.Sessionsession=null;

11.try{

12.session=HibernateUtil.getSession();

13.session.beginTransaction();

14.

15.Documentdoc=newDocument();

16.doc.setTitle("title3");

17.doc.setContent("thisiscontent3");

18.session.save(doc);

19.session.getTransaction().commit();

20.}catch(Exceptione){

21.e.printStackTrace();

22.session.getTransaction().rollback();

23.}finally{

24.HibernateUtil.closeSession(session);

25.}

26.}

27.}

Java代碼

1.packagecom.jbpm.test;

2.

3.importjunit.framework.TestCase;

4.

5.importorg.jbpm.JbpmConfiguration;

6.importorg.jbpm.JbpmContext;

7.importorg.jbpm.graph.def.ProcessDefinition;

8.importorg.jbpm.graph.exe.ProcessInstance;

9./**

10./*

11./*將申請單和流程實例綁定

12./*

13.publicclassTestJbpm_04extendsTestCase{

14.

15.staticJbpmConfigurationjbpmConfiguration=JbpmConfigurat

ion.getInstance();

16.

17.publicvoidtestJbpm(){

18.

19.JbpmContextjbpmContext=jbpmConfiguration.createJbpmC

ontext();

20.jbpmContext.setSessionFactory(HibernateUtil.getSessionF

actory());

21.try{

22.ProcessDefinitionprocessDefinition=jbpmContext.g

etGraphSession().findLatestProcessDefinition("testJbpm");

23.ProcessInstanceprocessInstance=newProcessInstan

ce(processDefinition);

24.jbpmContext.save(processInstance);

25.

26.

27.//將我們的document和instance綁定。

28.longprocessInstanceId=processInstance.getId();

29.Documentdocument=(Document)jbpmContext.getSessio

n().load(Document.class,1);

30.document.setProcessInstanceId(processInstanceId);

31.jbpmContext.getSession().update(document);

32.processInstance.getContextInstance().setVariable("d

ocument",document.getId());

33.}catch(Exceptione){

34.e.printStackTrace();

35.}finally{

36.jbpmContext.close();

37.}

38.

39.}

40.}

現(xiàn)在我們的申請已經(jīng)和實例關(guān)聯(lián)起來了,那么接下來的下一步就開始用啦,就是讓這個申請流轉(zhuǎn)起來吧,那么她應(yīng)該怎么去流轉(zhuǎn)呢,嘿嘿,jbpm給我們提供一個signal方法,每當(dāng)執(zhí)行一次這個方法的時候她就流轉(zhuǎn)一下到下一個節(jié)點,你可以打印出當(dāng)前節(jié)點試一下,看看是不是執(zhí)行一次你的當(dāng)前節(jié)點就換一下。這段代碼是這樣的:

Java代碼

1.packagecom.jbpm.test;

2.

3.importjunit.framework.TestCase;

4.

5.importorg.jbpm.JbpmConfiguration;

6.importorg.jbpm.JbpmContext;

7.importorg.jbpm.graph.exe.ProcessInstance;

8.

9.publicclassTestJbpm_05extendsTestCase{

10.

11.staticJbpmConfigurationjbpmConfiguration=JbpmConfigurat

ion.getInstance();

12.

13.publicvoidtestJbpm(){

14.JbpmContextjbpmContext=jbpmConfiguration.createJbpmC

ontext();

15.jbpmContext.setSessionFactory(HibernateUtil.getSessionF

actory());

16.try{

17.

18.Documentdocument=(Document)jbpmContext.getSessio

n().load(Document.class,3);

19.longprocessInstanceId=document.getProcessInstanc

eId();

20.ProcessInstanceprocessInstance=jbpmContext.getPr

ocessInstance(processInstanceId);

21.processInstance.signal();

22.}finally{

23.jbpmContext.close();

24.}

25.}

26.}

好啦,jbpm的簡單例子就到這里了,有什么問題大家可以給我留留言,還請大家多多指教小弟啊。后面我還會寫點更具體的一些問題,比如說列出提交到這個人這還沒有審批的公文啊,還有如果有多個分支的話應(yīng)該怎么去做啊等等等等。

2.一個完整的spring+jbpm+mysql整合例子

說明:例子jbpm版本為3.1.2。實現(xiàn)完全整合,并且由spring管理jbpmContext的session,此實例運行環(huán)境為tomcat5.5.17。

一、創(chuàng)建MySql數(shù)據(jù)庫:

設(shè)jbpm3.1.2解壓文件夾為jbpm-starters-kit-3.1.2,查看目錄

\jbpm-db\build\mysql\scripts是否存在,是否有4個SQL文件,有就不必費話了??疵志椭栏魑募淖饔?。不存在進(jìn)行如下操作:

1.配置好ANT,改根目錄下文件夾jbpm為jbpm.3。

2.打開CMD進(jìn)入根目錄下的jbpm-db目錄,輸入:antmysql.scripts,回車運行后會在\jbpm-db\build\mysql\scripts下產(chǎn)生4個MySql文件,在現(xiàn)有工程的數(shù)據(jù)庫中添加jbpm表。

二、下載springmodules,新增spring配置文件。

把jbpm整合到spring中,一般都用springmodules。新增spring配置文件,如本人的工程中有一文件springframework-plugins.xml,增加,文件內(nèi)容:

key="hibernate.dialect">${hibernate.dialect}

${hibernate.show_sql}

classpath:org/jbpm/taskmgmt/log/TaskCreateLog.hbm.xml

ref="hibernateTransactionManager"/>

PROPAGATION_REQUIRED,readOnly這句。DAO類內(nèi)容節(jié)選:

importorg.springmodules.workflow.jbpm31.*;

importorg.jbpm.JbpmContext;

importorg.jbpm.taskmgmt.exe.TaskInstance;

importorg.jbpm.graph.def.ProcessDefinition;

importorg.jbpm.graph.exe.ProcessInstance;

importjava.util.List;

importorg.springmodules.workflow.jbpm31.support.JbpmDaoSupport;

publicclassJbpmProcessDaoextendsJbpmDaoSupport{

publicvoiddeployProcessDefinition(finalProcessDefinitionpd){getTemplate().execute(newJbpmCallback(){

publicObjectdoInJbpm(JbpmContextcontext){

context.deployProcessDefinition(pd);

returnnull;

}

});

}

publicTaskInstancegetStartProcessDefinit

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論