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