????? 由于最近比較空閑,偶爾看到之前桌上的一本《深入淺出jBMP》的書,便想學(xué)習(xí)一下,熟悉workflow,這系列文章也算是對于整個學(xué)習(xí)過程的記錄,希望能時刻起備忘作用,更希望能為和我一樣的初學(xué)者提供第一手的學(xué)習(xí)資料。
????? 學(xué)前準備工作:
??????????? 1、Java開發(fā)環(huán)境
??????????? 2、jbpm-jpdl-suite-3.2.3.zip,網(wǎng)上有很多可下載的站點
??????????? 3、eclipse,我用的是3.6版本
????? 主要就是這些,jbpm-jpdl-suite-3.2.3.zip解壓縮到任意盤符,里面有針對eclipse的插件包,按照安裝插件的方式將對應(yīng)文件夾拷貝到對應(yīng)的eclipse目的文件夾中,重啟即可。(具體環(huán)境配置方法這里不多說,網(wǎng)上有很多)
????? 準備就緒,進行第一個示例的展示,我是按照樹上的例子來學(xué)習(xí)的,helloworld,哈哈,是不是很熟悉,感覺不管到哪都能看見它。使用剛才在eclipse集成好的designer插件之后,就可以通過拖
拽的方式來流程部署,很簡單!
????? 拖拽完流程之后,就可以寫和test方法進行測試,書上的例子是寫main方法,個人覺得junit更方便。我的代碼如下:
package com.sample; import junit.framework.TestCase; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.graph.exe.Token; /** * 流程的測試方法 * * @author zhang_lei * */ public class HelloWorldTest extends TestCase { public void testHelloWorldProcess() throws Exception { ProcessDefinition processDefinition = ProcessDefinition .parseXmlResource("helloworld/processdefinition.xml"); assertNotNull("Definition should not be null", processDefinition); ProcessInstance instance = new ProcessInstance(processDefinition); Token token = instance.getRootToken(); /** * 因為只是建立了流程實例,流程實例并沒有向下流轉(zhuǎn) * 所以該實例應(yīng)該停留在start-state1節(jié)點上 */ System.out.println("1 當前流程所處的節(jié)點名稱:" + token.getNode().getName()); assertSame(processDefinition.getStartState(), token.getNode()); /** * 讓流程實例向下流轉(zhuǎn)一步 */ token.signal(); /** * 再次打印流程實例所處的節(jié)點名 * 因為流程實例向下走了一步,所以流程應(yīng)該走到state1節(jié)點上 * 而state1節(jié)點屬于等待節(jié)點,所以流程走到這應(yīng)該停下來 */ System.out.println("2 當前流程所處的節(jié)點名稱:" + token.getNode().getName()); assertSame(processDefinition.getNode("state1"), token.getNode()); /** * 讓流程繼續(xù)向下流轉(zhuǎn) */ token.signal(); /** * 因為state1下面是一個Node節(jié)點, * Node節(jié)點是一個流程自動執(zhí)行的節(jié)點,所以流程執(zhí)行到這里不會停留在 * node1節(jié)點上,而是自動執(zhí)行node1節(jié)點,流程向下流轉(zhuǎn),停留在state2 */ System.out.println("3 當前流程所處的節(jié)點名稱:" + token.getNode().getName()); /** * TODO: * 此處用assertSame出處, * 不知是否為Node的取對象與state不一樣 * ps:此處流程不停止,可能token.getNode()無效 */ System.out.println("***"+processDefinition.getNode("node1").getName()); // assertSame(processDefinition.getNode("node1"), token.getNode()); /** * 再次打印流程實例所處的節(jié)點名 * 因為流程實例向下走了一步,所以流程應(yīng)該走到state2節(jié)點上 * 而state2節(jié)點屬于等待節(jié)點,所以流程走到這應(yīng)該停下來 */ System.out.println("4 當前流程所處的節(jié)點名稱:" + token.getNode().getName()); assertSame(processDefinition.getNode("state2"), token.getNode()); /** * 讓流程繼續(xù)向下流轉(zhuǎn),這是就應(yīng)該到達end-state1節(jié)點 * 整個helloworld流程就運行結(jié)束了,這時的狀態(tài)應(yīng)該為結(jié)束 */ token.signal(); System.out.println("5 當前流程所處的節(jié)點名稱:" + token.getNode().getName()); assertSame(processDefinition.getNode("end-state1"), token.getNode()); /** * 打印出當前流程是否結(jié)束 */ System.out.println("6 當前流程的狀態(tài):"+token.getProcessInstance().hasEnded()); assertTrue(token.getProcessInstance().hasEnded()); } }
????? 上面的代碼是我修改之后的。開始是按照書上的來寫,就是簡單的System打印語句,貌似不能滿足測試方法的要求。另外,書上的代碼一直沒調(diào)通,debug的半天,再結(jié)合一些基本概念,發(fā)現(xiàn)原來是書上寫錯了,唉,不可全信書本。錯誤的原因就在名為“node1”的node節(jié)點上,node節(jié)點處若沒有action,則不會停留,繼續(xù)往下走,但是書上在此處使用了token.signal()讓其繼續(xù)向下,根本是多此一舉,甚至是導(dǎo)致了錯誤。state節(jié)點需要調(diào)用方法繼續(xù)進行,這個問題可是費了我挺長時間,對于我這種初學(xué)者,這種錯誤可是很頭疼的啊!
????? 基本上第一章的內(nèi)容就是這些,對于常用的元素有了大體的了解,下面的內(nèi)容稍后繼續(xù)哈!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
