六、開發(fā)自己的工作流(Hello World)
1. eclipse插件安裝
jbpm提供了在eclipse下的一個可視化插件,通過它我們可以方便的定義工作流,打開jbpm-starters-kit-3.1.4jbpm-designer\jbpm-gpd-feature目錄,我們可以看到下面有一個eclipse文件夾,這里我們通過link的方式為eclipse添加該插件。
在{eclipse_home}/link文件夾下新建jbpm-designer.link文件,用記事本打開該文件加入如下一行:
path=D:\\jbpm-starters-kit-3.1.4\\jbpm-designer\\jbpm-gpd-feature
后面的路徑即為該插件的存放路徑,根據(jù)個人情況修改。注意,這里的分隔符使用雙斜杠\\。
2. 新建jbpm項(xiàng)目
主菜單“文件->新建->項(xiàng)目”,在彈出的對話框里,有“ Process Project ”項(xiàng),如下圖所示:
選上,單擊“下一步”,工程起名“myjbpm”,點(diǎn)擊下一步為此工程指定一個jbpm location,如果時第一次運(yùn)行該插件,系統(tǒng)會提示你設(shè)置一個jbpm location。這里我們將location設(shè)置為D:\jbpm-starters-kit-3.1.4\jbpm.3。然后就可以單擊“完成”了。然后就生成了如下圖所示的一個項(xiàng)目結(jié)構(gòu):
這個項(xiàng)目和通常Eclipse的項(xiàng)目結(jié)構(gòu)有點(diǎn)不同,不過這是一個現(xiàn)在非常流行的項(xiàng)目結(jié)構(gòu),src/main/java存放源文件,src/test/java存放相應(yīng)的JUnit單元測試代碼,src/main/jpdl存放我們定義的工作流文件。
項(xiàng)目創(chuàng)建起了,介紹一下里面的文件吧:
l MessageActionHandler,自動生成的一個 ActionHandler。
l hibernate.cfg.xml jBPM是用Hibernate進(jìn)行工作流的數(shù)據(jù)存儲的,這個就是Hibernate 的配置文件。后面我們將講到如何配置這個文件。
l jbpm.cfg.xml jbpm本身的配置文件。現(xiàn)在是空的,它用的是缺省配置,你想知道有哪些配置就去看這個文件
D:\jbpm-starters-kit- 3.1.4\jbpm.3\src\java.jbpm\org\jbpm\default.jbpm.cfg.xml
l log4j.properties 這個是日志 API 包 log4j 的配置文件,用過 log4j 的都知道。
l SimpleProcessTest.java 這個是對最重要的流程配置文件的processdefinition.xml單元測試代碼。
l gpd.xml 用于生成流程圖的定義文件。都是一些方框的坐標(biāo)和長寬
l processdefinition.xml 這個是對最重要的流程配置文件,以后寫流程要經(jīng)常和它打交道。
l processimage.jpg 一個流程圖
3. 簡單工作流定義
展開myjbpm工程,選中src/main/jpdl包,單擊鼠標(biāo)右鍵,new->other,如下圖:
新建一個Process Definition,process命名為HelloWorld,單擊finish,結(jié)果如下圖:
右面的窗口為工作流定義的可視化窗口。選中該窗口單擊eclipse菜單欄view->show Grid為該窗口添加網(wǎng)格,方便后面開發(fā)。
1) 定義基本流程
分別向編輯區(qū)拖入,start、task node、end節(jié)點(diǎn),用transition將他們依次連起來,并分別修改task node名為show message,end節(jié)點(diǎn)名為end,兩個transition分別命名為send和ok,得到如下所示結(jié)果:
2) 定義泳道(swimlane)
我們?yōu)樵摿鞒潭x一個名為user的泳道(swimlane),點(diǎn)擊編輯窗口左下角的swimlanes按鈕,得到添加泳道界面,單擊add按鈕,按照下圖配置相關(guān)信息,這樣我們就將用戶grover加入到了泳道user中:
3) 定義節(jié)點(diǎn)任務(wù)
打開eclipse中的outline視圖,我們可以看到一個名為HelloWorld的process節(jié)點(diǎn),展開該節(jié)點(diǎn),如下圖:
右擊start節(jié)點(diǎn),選擇add task
我們看到start節(jié)點(diǎn)下多出了一個名為task的task節(jié)點(diǎn):
雙擊該節(jié)點(diǎn),打開節(jié)點(diǎn)編輯窗口,將該task改名為input message,如下:
選擇左邊的controller我們?yōu)樵摿鞒潭x一個名為message的變量,這個變量就是我們后面要傳遞的信息,照下圖配置該變量:
點(diǎn)擊ok,完成start節(jié)點(diǎn)下的任務(wù)定義。
按照以上步驟,我們再為message show節(jié)點(diǎn)定義一個名為show message的任務(wù),這里的變量名也為message,但是屬性只有read,我們通過這個任務(wù)讀取前面所輸入的message信息。注意兩個任務(wù)的變量名要相對應(yīng),如下圖:
下來點(diǎn)擊assignment菜單,配置該任務(wù)的分配方式,如下圖所示,將該任務(wù)分配給名為user的swimlane,此swimlane包含了grover用戶。結(jié)果如下圖:
單擊ok,我們就完成了該流程的任務(wù)定義。這里我們看到多出了兩個task,如圖:
4) 保存流程定義
單擊保存按鈕,我們保存該流程定義。保存成功后我們可以看到,在流程定義的包中多出了一個名為processimage.jpg的圖像文件,該文件為我們定義流程的流程圖,如下:
點(diǎn)擊編輯窗口下的source按鈕,我們可以查看通過圖形編輯界面自動生成的該流程的xml定義,即processdefinition.xml中的內(nèi)容。如下:
xml 代碼
- <?xml version="1.0" encoding="UTF-8"?>
- <process-definition
- xmlns="urn:jbpm.org:jpdl-3.1" name="HelloWorld">
- <swimlane name="user">
- <assignment expression="user(grover)"></assignment>
- </swimlane>
- <start-state name="start">
- <task name="input message">
- <controller>
- <variable name="message" access="read,write,required"></variable>
- </controller>
- </task>
- <transition name="send" to="message show"></transition>
- </start-state>
- <task-node name="message show">
- <task name="show message" swimlane="user">
- <controller>
- <variable name="message" access="read"></variable>
- </controller>
- </task>
- <transition name="OK" to="end"></transition>
- </task-node>
- <end-state name="end"></end-state>
- </process-definition>
對照剛才的流程定義,我們很容易可以看出各個xml標(biāo)簽所對應(yīng)的意義。具體細(xì)節(jié)我們將在后面介紹。
5) 部署流程定義
首先我們要啟動jboss服務(wù),待服務(wù)啟動成功后單擊編輯窗口下的deployment按鈕,按照下圖配相應(yīng)參數(shù),然后點(diǎn)擊test connection,如果彈出成功窗口,說明服務(wù)器連接正常,否則請檢查你的參數(shù)設(shè)置。
測試連接成功后,我們點(diǎn)擊下面的deploy process archive按鈕,如果得到成功信息,恭喜你,說明我們定義的工作流已經(jīng)成功的部署到了jboss上,如下圖:
6) 使用工作流
打開IE瀏覽器,在地址欄中輸入http://localhost:8080/jbpm,以cookie monster身份登陸系統(tǒng)。我們看到Start New Process Execution里面多了一項(xiàng)Hello World,這就是我們剛才部署過的工作流。
點(diǎn)擊input message我們會看到以下畫面:
注意到左面有個一名為message的文本框,這個文本框就是我們在流程定義里定義的變量message。右面是本流程的流程圖,紅色的框代表該流程現(xiàn)在運(yùn)行到哪一步。我們在文本框內(nèi)輸入Hello!Congratulations!。然后點(diǎn)擊save and close task按鈕,提交該內(nèi)容。之后頁面跳轉(zhuǎn),我們會在上面看到這樣一行提示信息:A new task has been assigned to ‘grover’。說明第一步流程已完成,將下一步任務(wù)委派給泳道user中的grover。我們點(diǎn)擊屏幕左上角的login as another user。如圖所示:
以grover身份登陸系統(tǒng),我們可以看到在grover的主界面下的tasklist里多出了一項(xiàng):
單擊該任務(wù),我們可以看到同樣有一個名為message的文本框,但是他的內(nèi)容是不可編輯的,這和我們定義工作流變量時的設(shè)置有關(guān),并且里面的內(nèi)容正是上一步中cookie monster用戶所輸入的內(nèi)容。我們還可以注意到,右面流程圖中標(biāo)明該流程已經(jīng)進(jìn)入第二步。
繼續(xù)點(diǎn)擊save and close task按鈕,頁面跳轉(zhuǎn),得到信息:The process has finished。并且tasklist中剛才的任務(wù)項(xiàng)也不存在了。至此,整個工作流程執(zhí)行完畢。
7) 工作流管理
Jbpm為我們提供了簡單的工作流管理,單擊左面菜單欄的monitoring進(jìn)入monitoring界面,點(diǎn)擊鏈接Process Definitions list,如下:
得到如下界面,這里我們可以看到目前為止所有的工作流定義以及他們所擁有的實(shí)例數(shù)。通過該圖可以得知Hello World目前只有一個實(shí)例,即我們剛才執(zhí)行過的那個實(shí)例。
我們點(diǎn)擊實(shí)例數(shù)1,得到Hello World下所有的實(shí)例列表,如下圖:
我們只初始化過一個實(shí)例,因此這里只有一項(xiàng),start和end分別表示該實(shí)例開始和結(jié)束的時間,我們點(diǎn)擊前面的Id號,查看該實(shí)例的詳細(xì)信息:
其中,task列表列出了該實(shí)例所有的task,其中name表示task的名字,actorId表示由誰執(zhí)行該task,date表示該task結(jié)束的時間。Variables列表列出了該task中所有的變量及其值。我們在流程定義里只定義了一項(xiàng)變量,因此這里只有message,它的值即為剛才輸入的內(nèi)容。我們還可以通過update按鈕向列表中添加修改變量。
下面的圖,即為該流程的流程圖。紅色的框標(biāo)明此實(shí)例已經(jīng)結(jié)束。
至此,一個簡單的工作流就完成了,相信大家從中可以大致的了解jbpm定義工組流的基本過程,在后面的章節(jié)我們將進(jìn)一步介紹更多的內(nèi)容。