<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小菜毛毛技術(shù)分享

    與大家共同成長(zhǎng)

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks


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

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

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

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

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

        打開(kāi)之后你就會(huì)看見(jiàn)一個(gè)他的小例子,不過(guò)我們不去用他,我們自己新建一個(gè)工程。右鍵-new-other-jBoss jbpm-process project。這個(gè)時(shí)候你會(huì)看見(jiàn)他彈出一個(gè)對(duì)話框,輸入你的工程名字,然后點(diǎn)擊next,這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)他已經(jīng)把jbpm加載進(jìn)去了,記住要選中Generate simple ......。

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

        在右面的圖里面你就可以看到一張什么都沒(méi)有的白紙,我們看看這部分左面的那些東西,什么start啊,end啊,tasknode啊,fork 啊,join啊。那我們來(lái)解釋一下這是個(gè)什么東西呢,我們看看我們的需求,員工要寫(xiě)一個(gè)報(bào)銷(xiāo)單,然后交給部門(mén)主管來(lái)處理,那么部門(mén)主管就應(yīng)該算是一個(gè) tasknode,他就是一個(gè)任務(wù)節(jié)點(diǎn)。start和end其實(shí)就是一個(gè)虛狀態(tài),當(dāng)我們寫(xiě)完報(bào)銷(xiāo)單的時(shí)候我們就提交了,這個(gè)時(shí)候他就到了第一個(gè) tasknode這個(gè)節(jié)點(diǎn)了。然后他審批完了還要交給總經(jīng)理審批,那么他又是一個(gè)tasknode,然后總經(jīng)理審批完了結(jié)束,ok,是一個(gè)end。

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

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

    Java代碼
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2.   
    3. <process-definition  
    4.   xmlns=""  name="test1">  
    5.    <start-state name="start">  
    6.       <transition name="" to="部門(mén)經(jīng)理審批"></transition>  
    7.    </start-state>  
    8.    <task-node name="部門(mén)經(jīng)理審批">  
    9.       <task>  
    10.         <assigment actorId="部門(mén)經(jīng)理"></assigment>  
    11.       </task>  
    12.       <transition name="" to="總經(jīng)理審批"></transition>  
    13.    </task-node>  
    14.    <task-node name="總經(jīng)理審批">  
    15.       <task>  
    16.         <assigment actorId="總經(jīng)理"></assigment>  
    17.       </task>  
    18.       <transition name="" to="end1"></transition>  
    19.    </task-node>  
    20.    <end-state name="end1"></end-state>  
    21. </process-definition>  

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

        首先我們?cè)趕rc/main/java里面新建立一個(gè)包,然后建立一個(gè)class,隨便起個(gè)名字,就叫TestJBPM_01吧,那么在這個(gè)類(lèi)里面我們要做的是什么呢?我們要先導(dǎo)入表,因?yàn)?span id="ceuzegb" class="hilite1">jbpm要運(yùn)行就要用到很多個(gè)表,ok,那么我們這個(gè)里面導(dǎo)入表和hibernate導(dǎo)入表是差不多的,它的代碼是這樣的:
    Java代碼
    1. package com.jbpm.test;  
    2.   
    3. import junit.framework.TestCase;  
    4.   
    5. import org.jbpm.JbpmConfiguration;  
    6.   
    7. public class TestJbpm_01 extends TestCase {  
    8.       
    9.     public void testJbpm(){  
    10.           
    11.         //創(chuàng)建jbpm數(shù)據(jù)庫(kù)表。他就像hibernate里面的哪個(gè)export一樣。實(shí)際上他就是hibernate里面的哪個(gè)export。  
    12.         //應(yīng)為他映射了很多個(gè)表,所以我們就能創(chuàng)建那么多個(gè)表。  
    13.         JbpmConfiguration.getInstance().createSchema();  
    14.           
    15.     }  
    16. }  

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

    Java代碼
    1. package com.jbpm.test;  
    2.   
    3. import junit.framework.TestCase;  
    4.   
    5. import org.jbpm.JbpmConfiguration;  
    6. import org.jbpm.JbpmContext;  
    7. import org.jbpm.graph.def.ProcessDefinition;  
    8.   
    9. public class TestJbpm_02 extends TestCase {  
    10.       
    11.     //jbpmConfiguration對(duì)象的創(chuàng)建  
    12.     static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();  
    13.       
    14.     public void testJbpm(){  
    15.           
    16.         //然后我們把processDefinition里面相關(guān)的對(duì)象持久化到數(shù)據(jù)庫(kù)里面去。  
    17.         //流程定義文件里面有很多個(gè)概念,他有node,有transition,還有processDefinition,那么我們不需要一個(gè)  
    18.         //一個(gè)保存,jbpm把保存這么多對(duì)象的方法封裝成一個(gè)接口,叫做deployProcessDefinition。我們只要調(diào)用這個(gè)  
    19.         //方法,傳一個(gè)processDefinition對(duì)象,我們就能將他們存入到數(shù)據(jù)庫(kù)里面去。  
    20.           
    21.         //這個(gè)首先第一步我們要得到一個(gè)processDefinition對(duì)象,然后我們把他部署到流程中去。  
    22.         ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("testJBPM/testJbpm.xml");  
    23.         //我們要存就必須獲得一個(gè)session對(duì)象,而jbpm已經(jīng)把session對(duì)象封裝到一個(gè)JbpmContext對(duì)象里面了。  
    24.         //那么這個(gè)jbpmContext對(duì)象是怎么得到的呢,我們要先有一個(gè)jbpmConfiguration對(duì)象,我們要對(duì)數(shù)據(jù)庫(kù)進(jìn)行  
    25.         //操作的時(shí)候一定要有jbpmConfiguration這個(gè)對(duì)象,用他來(lái)創(chuàng)建一個(gè)類(lèi)似于hibernate當(dāng)中的session一樣的  
    26.         //對(duì)象——jbpmContext。他是我們對(duì)數(shù)據(jù)庫(kù)所有的操作的一個(gè)接口。  
    27.         JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();  
    28.         try{  
    29.             //然后部署的操作已經(jīng)由jbpmContext給我們創(chuàng)建好了,我們只需要調(diào)一下他的一個(gè)方法就可以了。  
    30.             jbpmContext.deployProcessDefinition(processDefinition);  
    31.         }finally{  
    32.             //最后我們還要對(duì)他close一下,就像我們用hibernate的時(shí)候要close session一樣。  
    33.             jbpmContext.close();  
    34.         }  
    35.     }  
    36. }  

    Ok,第二步我們也做完了,那么現(xiàn)在我們開(kāi)始做第三步,也就是說(shuō),我們流程定義文件寫(xiě)好了,現(xiàn)在我們的系統(tǒng)當(dāng)中有了這樣一個(gè)報(bào)銷(xiāo)流程,那么就開(kāi)始 實(shí)際的去用她吧,一個(gè)人小報(bào)銷(xiāo)了,那么她就要寫(xiě)一個(gè)報(bào)銷(xiāo)的申請(qǐng),但是這個(gè)報(bào)銷(xiāo)的申請(qǐng)寫(xiě)完了存到數(shù)據(jù)庫(kù)當(dāng)中了還不能算完了,應(yīng)該和我們的這個(gè)流程關(guān)聯(lián)起來(lái) 啊,那么她應(yīng)該怎么去關(guān)聯(lián)呢,嘿嘿,是這樣地:我們?cè)诮⑦@個(gè)申請(qǐng)單這個(gè)類(lèi)的時(shí)候應(yīng)該定義一個(gè)processInstanceId屬性,她是一個(gè)long 型的,她就記錄這我們的這個(gè)流程實(shí)例的id,那么什么是流程實(shí)例(processInstance)呢,她是我們工作流當(dāng)中第二重要的概念,他和流程定義 的關(guān)系就相當(dāng)于對(duì)象和類(lèi)之間的關(guān)系,類(lèi)是一個(gè)抽象的東西,她定義完了是什么也干不了的,要想用她內(nèi)部定義的東西我們就要new出一個(gè)實(shí)例來(lái),當(dāng)然這個(gè)里面 也是這樣的。

    那么也就是說(shuō),當(dāng)我們創(chuàng)建這個(gè)報(bào)銷(xiāo)申請(qǐng)的時(shí)候我們就要先根據(jù)這個(gè)流程‘new’出一個(gè)流程實(shí)例來(lái)存到數(shù)據(jù)庫(kù)當(dāng)中,然后在把她的id傳給報(bào)銷(xiāo)申請(qǐng)對(duì)象然后再將這個(gè)報(bào)銷(xiāo)申請(qǐng)對(duì)象存到數(shù)據(jù)庫(kù)當(dāng)中。那么這個(gè)代碼是這樣的:
    Java代碼
    1. package com.jbpm.test;  
    2.   
    3. import junit.framework.TestCase;  
    4.   
    5. import org.hibernate.Session;  
    6.   
    7. public class TestJbpm_03 extends TestCase {  
    8.       
    9.     public void testJbpm(){  
    10.         Session session = null;  
    11.         try{  
    12.             session = HibernateUtil.getSession();  
    13.             session.beginTransaction();  
    14.               
    15.             Document doc = new Document();  
    16.             doc.setTitle("title3");  
    17.             doc.setContent("this is content3");  
    18.             session.save(doc);                        
    19.             session.getTransaction().commit();  
    20.         }catch(Exception e){  
    21.             e.printStackTrace();  
    22.             session.getTransaction().rollback();  
    23.         }finally{  
    24.             HibernateUtil.closeSession(session);  
    25.         }  
    26.     }  
    27. }  

    Java代碼
    1. package com.jbpm.test;  
    2.   
    3. import junit.framework.TestCase;  
    4.   
    5. import org.jbpm.JbpmConfiguration;  
    6. import org.jbpm.JbpmContext;  
    7. import org.jbpm.graph.def.ProcessDefinition;  
    8. import org.jbpm.graph.exe.ProcessInstance;  
    9. /**  
    10. /*  
    11. /*將申請(qǐng)單和流程實(shí)例綁定  
    12. /*  
    13. public class TestJbpm_04 extends TestCase {  
    14.       
    15.     static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();  
    16.       
    17.     public void testJbpm(){  
    18.           
    19.         JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();  
    20.         jbpmContext.setSessionFactory(HibernateUtil.getSessionFactory());  
    21.         try {  
    22.             ProcessDefinition processDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("testJbpm");  
    23.             ProcessInstance processInstance = new ProcessInstance(processDefinition);  
    24.             jbpmContext.save(processInstance);    
    25.               
    26.               
    27.             //將我們的document和instance綁定。  
    28.             long processInstanceId = processInstance.getId();  
    29.             Document document = (Document)jbpmContext.getSession().load(Document.class,1);  
    30.             document.setProcessInstanceId(processInstanceId);  
    31.             jbpmContext.getSession().update(document);  
    32.             processInstance.getContextInstance().setVariable("document", document.getId());  
    33.         }catch(Exception e){  
    34.             e.printStackTrace();  
    35.         }finally{  
    36.             jbpmContext.close();  
    37.         }  
    38.           
    39.     }  
    40. }  


    現(xiàn)在我們的申請(qǐng)已經(jīng)和實(shí)例關(guān)聯(lián)起來(lái)了,那么接下來(lái)的下一步就開(kāi)始用啦,就是讓這個(gè)申請(qǐng)流轉(zhuǎn)起來(lái)吧,那么她應(yīng)該怎么去流轉(zhuǎn)呢,嘿嘿,jbpm給我們提供一個(gè)signal方法,每當(dāng)執(zhí)行一次這個(gè)方法的時(shí)候她就流轉(zhuǎn)一下到下一個(gè)節(jié)點(diǎn),你可以打印出當(dāng)前節(jié)點(diǎn)試一下,看看是不是執(zhí)行一次你的當(dāng)前節(jié)點(diǎn)就換一下。這段代碼是這樣的:
    Java代碼
    1. package com.jbpm.test;  
    2.   
    3. import junit.framework.TestCase;  
    4.   
    5. import org.jbpm.JbpmConfiguration;  
    6. import org.jbpm.JbpmContext;  
    7. import org.jbpm.graph.exe.ProcessInstance;  
    8.   
    9. public class TestJbpm_05 extends TestCase {  
    10.       
    11.     static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();  
    12.       
    13.     public void testJbpm(){  
    14.         JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();  
    15.         jbpmContext.setSessionFactory(HibernateUtil.getSessionFactory());  
    16.         try{  
    17.               
    18.             Document document = (Document)jbpmContext.getSession().load(Document.class3);  
    19.             long processInstanceId = document.getProcessInstanceId();  
    20.             ProcessInstance processInstance = jbpmContext.getProcessInstance(processInstanceId);  
    21.             processInstance.signal();  
    22.         }finally{  
    23.             jbpmContext.close();  
    24.         }  
    25.     }  
    26. }  


    好啦,jbpm的簡(jiǎn)單例子就到這里了,有什么問(wèn)題大家可以給我留留言,還請(qǐng)大家多多指教小弟啊。后面我還會(huì)寫(xiě)點(diǎn)更具體的一些問(wèn)題,比如說(shuō)列出提交到這個(gè)人這還沒(méi)有審批的公文啊,還有如果有多個(gè)分支的話應(yīng)該怎么去做啊等等等等。
    posted on 2009-05-05 15:05 小菜毛毛 閱讀(3602) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): JBPM

    Feedback

    # re: 工作流與JBPM開(kāi)發(fā)實(shí)例精解(二)(轉(zhuǎn)) 2009-10-20 08:52 evan365
    寫(xiě)的非常好
    學(xué)習(xí)了  回復(fù)  更多評(píng)論
      

    # re: 工作流與JBPM開(kāi)發(fā)實(shí)例精解(二)(轉(zhuǎn))[未登錄](méi) 2013-08-29 10:28 123
    jar包?  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 免费看美女午夜大片| 免费在线人人电影网| 一级免费黄色毛片| 2015日韩永久免费视频播放| 麻豆国产人免费人成免费视频| 国产亚洲精品成人AA片新蒲金| 亚洲国产美女精品久久久久| 又大又硬又粗又黄的视频免费看 | 免费看无码自慰一区二区| 国产亚洲精品免费视频播放 | 亚洲精品国产国语| 黄色网址免费在线观看| 国产在线观看免费观看不卡| 2022中文字字幕久亚洲| 激情综合亚洲色婷婷五月APP| 久久毛片免费看一区二区三区| 成人女人A级毛片免费软件| 在线观看亚洲精品福利片| 在线亚洲午夜片AV大片| 在线成人精品国产区免费| 国产精品国产自线拍免费软件| 老汉色老汉首页a亚洲| 国产综合成人亚洲区| 麻豆国产精品免费视频| 亚洲最大AV网站在线观看| 亚洲熟妇av午夜无码不卡| 一级毛片aaaaaa免费看| 亚洲Av无码乱码在线观看性色| 亚洲人成电影青青在线播放| 国产精品偷伦视频观看免费| 免费一看一级毛片| 亚洲人成网站在线播放2019| 免费国产污网站在线观看15| 国产精品亚洲玖玖玖在线观看| 亚洲熟妇无码AV不卡在线播放| 91青青青国产在观免费影视| 奇米影视亚洲春色| 色欲aⅴ亚洲情无码AV| 中文字幕人成无码免费视频| 亚洲人成电影福利在线播放| 亚洲视频在线免费|