JBoss jBPM為設計及開(kāi)發(fā)工作流和業(yè)務(wù)流程管理系統提供了一個(gè)先進(jìn)的平臺。由API、特定領(lǐng)域的語(yǔ)言和圖形建模工具組成的框架讓開(kāi)發(fā)人員和業(yè)務(wù)分析人員能夠使用通用平臺進(jìn)行溝通及操作。
工作流管理和業(yè)務(wù)流程管理(BPM)正在迅速成為企業(yè)獲得軟件敏捷性和適應性的重要方法。JBoss jBPM是一個(gè)面向流程的工作流/BPM框架和工具集,它使業(yè)務(wù)分析人員能夠與軟件組件進(jìn)行交互、有助于獲得有效的業(yè)務(wù)解決方案。
許多企業(yè)在積極尋求一種結構化方法,以便設計業(yè)務(wù)動(dòng)作/事務(wù),并且優(yōu)先使用自動(dòng)化流程加以執行。業(yè)務(wù)流程管理(BPM)和工作流管理使用動(dòng)作、任務(wù)和流程等概念,提供了解決這個(gè)問(wèn)題的辦法。
業(yè)務(wù)流程管理一詞通常是指企業(yè)通過(guò)一系列活動(dòng),以能夠適應動(dòng)態(tài)變化的環(huán)境的方式,自動(dòng)管理及優(yōu)化流程。這些活動(dòng)通常尋求來(lái)自軟件工程和工具的幫助。因而,BPM一詞往往直接用來(lái)指軟件工程技術(shù)和工具。
BPM體現為三個(gè)不同的實(shí)踐
1.流程設計:指設計現有及新的流程這一任務(wù);
2.流程執行:執行自動(dòng)化序列的相關(guān)事件,這些事件涉及軟件流程以及/或者人為活動(dòng);
3.流程監控:觀(guān)察及審查單個(gè)流程的狀態(tài),以便這些流程的統計數字和性能可以加以記錄、報告及優(yōu)化。
BPM力求讓軟件工程師們能夠與業(yè)務(wù)分析人員共享同樣的概念和框架,因而,軟件開(kāi)發(fā)商試圖創(chuàng )建這樣的工具,讓企業(yè)可以通過(guò)使用圖形建模工具、特定領(lǐng)域的語(yǔ)言和專(zhuān)有應用軟件,獲取、設計及優(yōu)化業(yè)務(wù)流程。
JBoss jBPM 3.0提供了這樣的功能:使用業(yè)務(wù)流程執行語(yǔ)言(BPEL)、靈活而且可插入的應用編程接口(API)、本地流程定義語(yǔ)言以及圖形建模工具,利用基于行業(yè)標準的編制機制開(kāi)發(fā)新的自動(dòng)化業(yè)務(wù)流程和工作流。
JBoss jBPM是采用開(kāi)放源代碼(LGPL許可證)的框架,包括了Java API、工具和定義語(yǔ)言,可以充當Web應用或者獨立的Java應用。JBoss jBPM相當于業(yè)務(wù)分析人員和開(kāi)發(fā)人員之間的中介,為他們提供了名為jPDL的通用流程定義語(yǔ)言。
JBoss jBPM架構綜述
JBoss jBPM定義了使用JBoss流程定義語(yǔ)言編寫(xiě)的文件里面的流程定義。jPDL是一種面向圖形編程(GOP)的語(yǔ)言,它基于節點(diǎn)、轉換和動(dòng)作組成的模型。在這種模型里面,節點(diǎn)是在流程定義過(guò)程中彼此相遇時(shí)執行的命令。轉換負責指導流程定義的執行過(guò)程,而動(dòng)作在節點(diǎn)或者轉換事件發(fā)生時(shí)執行特定邏輯。
在jBPM中,流程定義被封裝成流程檔案(process archives)。流程檔案被傳送到jPDL流程引擎加以執行。jPDL流程引擎負責遍歷流程圖、執行定義的動(dòng)作、維持流程狀態(tài),并且記錄所有流程事件。
JBoss jBPM在以下組件里面進(jìn)行封裝:
● 流程引擎: 該組件通過(guò)下列委托組件(delegate component)來(lái)執行定義的流程動(dòng)作、維持流程狀態(tài),并記錄所有流程事件:請求處理程序、狀態(tài)管理程序、日志管理程序、定義加載程序、執行服務(wù)。
● 流程監管器: 該模塊跟蹤、審查及報告流程在執行時(shí)的狀態(tài)。
● 流程語(yǔ)言: 流程定義語(yǔ)言(jPDL)基于GOP。
● 交互服務(wù): 這些服務(wù)把遺留應用提供成流程執行時(shí)所用的功能或者數據。

如圖1所示,含有動(dòng)作處理程序的jBPM流程定義由jBPM流程引擎加以加載及執行。 如果流程引擎在流程定義過(guò)程中遇到擁有相關(guān)動(dòng)作的節點(diǎn),所有相關(guān)的動(dòng)作處理程序就會(huì )被調用。動(dòng)作處理程序是Java代碼的實(shí)例,在執行時(shí)能夠與外部系統進(jìn)行交互。
下面就是簡(jiǎn)單的動(dòng)作處理程序的示例:
import org.jbpm.graph.def.*;
import org.jbpm.graph.exe.*;
public class MyActionHandler
implements ActionHandler
{
public void execute(ExecutionContext executionContext)
{
System.out.println("MyActionHandler has executed: " + executionContext);
}
}
流程檔案里面的PDL文件名為process-definition.xml。該文件含有諸流程的正式描述。以下示子表明了process-definition.xml文件的例子:
< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE process-definition PUBLIC "-//jbpm/jBPM Mapping DTD 2.0//EN" "http://jBPM.org/dtd/processdefinition-2.0.dtd">
< process-definition name="purchase process">
< !--...-->
< !-- START-STATE -->
< start-state name="request a purchase">
< transition to="evaluating"/>
< /start-state>
< !-- NODES -->
< state name="evaluating">
< !--...-->
< transition name="approve" to="purchase approved"/>
< transition name="disapprove" to="done"/>
< /state>
< fork name="purchase approved">
< transition to="decrement inventory" />
< transition to="increment revenue" />
< /fork>
< state name="decrement inventory">
< !--...-->
< transition to="join" />
< /state>
< state name="increment revenue">
< !--...-->
< transition to="join" />
< /state>
< join name="join">
< transition to="done" />
< /join>
< !-- END-STATE -->
< end-state name="done" />
< /process-definition>
流程定義基于定向圖(directed graph)。有向圖由節點(diǎn)、轉換、一個(gè)起始狀態(tài)以及一個(gè)終止狀態(tài)組成。每個(gè)節點(diǎn)的類(lèi)型定義了該節點(diǎn)的運行時(shí)行為。流程定義在執行時(shí),以下實(shí)體就會(huì )起到作用:
● 流程實(shí)例: 流程實(shí)例是流程定義的一次執行。
● 標記: 標記是一條執行路徑。標記是運行時(shí)概念,它含有指向定向圖中節點(diǎn)的指針。一旦創(chuàng )建了流程實(shí)例,就會(huì )創(chuàng )建主要執行路徑的標記。該標記名為流程實(shí)例的根標記,它位于流程定義的起始狀態(tài)。
● 信號: 信號指示標記繼續由轉換實(shí)現的圖像執行。
● 節點(diǎn): 節點(diǎn)負責圖像執行的繼續進(jìn)行。如果標記進(jìn)入節點(diǎn),節點(diǎn)就會(huì )執行。不會(huì )傳播執行的節點(diǎn)被認為是狀態(tài)節點(diǎn)。
● 動(dòng)作:動(dòng)作是流程執行過(guò)程中出現事件時(shí)執行的Java代碼的實(shí)例。主要的事件類(lèi)型有:“進(jìn)入節點(diǎn)”、“離開(kāi)節點(diǎn)”和“進(jìn)行轉換”。 
圖2 jBPM圖形建模設計器
使用jBPM圖形建模設計器,就很容易創(chuàng )建流程定義。設計器目前作為Eclipse插件而安裝。圖2表明了圖形建模設計器的示例屏幕。
圖形設計器可以用來(lái)創(chuàng )建流程定義、把動(dòng)作處理程序與事件連接起來(lái)、編輯定義來(lái)源、創(chuàng )建流程檔案、測試流程定義,等等。
部署JBoss jBPM
JBoss jBPM把流程定義存儲在數據庫中。因而,把流程部署到JBoss jBPM里面需要解析process-definition.xml,并且把它存儲在JBoss jBPM數據庫中??赏ㄟ^(guò)以下方法實(shí)現這項工作:
● 使用由JBoss jBPM提供的par Ant任務(wù)來(lái)創(chuàng )建流程檔案。
● 使用deploypar實(shí)用程序。該實(shí)用程序還可以創(chuàng )建流程檔案,并且把流程檔案部署到jBPM數據庫上。Deploypar實(shí)用程序把jBPM.properties文件作為一個(gè)屬性。該文件指定了配置選項,其中包括流程檔案所要部署到的那個(gè)數據庫。
● 通過(guò)編程解析process-definition.xml,并把它存儲到數據存儲區中。
讓JBoss jBPM完成一些簡(jiǎn)單步驟
JBoss jBPM充當編制引擎,它位于企業(yè)應用的中間,能夠實(shí)現不同應用之間的集成和協(xié)調。
本文使用隨同jBPM交付的示例部署,討論如何利用jBPM和jPDL來(lái)創(chuàng )建及修改具有Web功能的簡(jiǎn)單的訂單處理系統。
1.下載JBoss jBPM
JBoss jBPM入門(mén)套件(http://www.jboss.com/products/jBPM/downloads)包括了執行JBoss jBPM所需的一切,只是沒(méi)有Java開(kāi)發(fā)者工具包(JDK)。JBoss jBPM入門(mén)套件里面的JBoss應用服務(wù)器需要J2SE 1.4或者更新版本。
下載入門(mén)套件后,把它解壓縮到選擇的目錄下面。一旦解壓縮了該入門(mén)套件,就有了類(lèi)似如下的目錄結構:
● Jbpm-starters-kit-3.1。
● Jbpm:含有JBoss jBPM產(chǎn)品的源代碼。
● jbpm-bpel:含有JBoss jBPM的BPEL擴展件方面的信息。
● jbpm-db:含有把JBoss jBPM連接到其他數據庫的示例配置。
● jbpm-designer:含有用于JBoss jBPM可視化流程設計器的Eclipse插件。
● jbpm-server:含有JBoss應用服務(wù)器和JBoss jBPM引擎以及示例流程。
2.執行JBoss jBPM引擎
為了啟動(dòng)部署了jBPM的JBoss應用服務(wù)器,進(jìn)入jbpm-server目錄,執行里面的啟動(dòng)腳本。命令窗口會(huì )隨同jBPM控制臺窗口一起出現,類(lèi)似圖3。 
現在,打開(kāi)瀏覽器窗口,輸入http://localhost:8080/jbpm。就會(huì )看到JBoss jBPM的示例Web應用的登錄頁(yè)面。

實(shí)際的定義文件:processdefinition.xml位于websale.par里面,如以下列表所示:
< ?xml version="1.0"?>
< process-definition name="websale"
xmlns="urn:jbpm.org:jpdl-3.1">
< !-- SWIMLANES (= process roles) -->
< swimlane name="buyer" />
< swimlane name="salesman">
< assignment expression="user(ernie)" />
< /swimlane>
< swimlane name="accountant">
< assignment expression="user(bert)" />
< /swimlane>
< swimlane name="shipper">
< assignment expression="user(grover)" />
< /swimlane>
< !-- NODES -->
< start-state name="create new web sale order">
< task swimlane="buyer">
< controller>
< variable name="item"/>
< variable name="quantity"/>
< variable name="address"/>
< /controller>
< /task>
< transition to="evaluate web order" />
< /start-state>
< task-node name="evaluate web order">
< task swimlane="salesman">
< timer duedate="20 seconds" repeat="10 seconds">
< action class="org.jbpm.websale.RemindActor">
< swimlaneName>salesman< /swimlaneName>
< /action>
< /timer>
< controller>
< variable name="item" access="read"/>
< variable name="quantity" access="read"/>
< variable name="address" access="read"/>
< variable name="comment"/>
< /controller>
< /task>
< transition name="ok" to="salefork" />
< transition name="more info needed" to="fix web order data" />
< /task-node>
< task-node name="fix web order data">
< task swimlane="buyer">
< controller>
< variable name="comment" access="read"/>
< variable name="item" />
< variable name="quantity" />
< variable name="address" />
< /controller>
< /task>
< transition to="evaluate web order" />
< /task-node>
< fork name="salefork">
< transition name="payment" to="wait for money" />
< transition name="shipping" to="ship item" />
< /fork>
< task-node name="wait for money">
< task swimlane="accountant">
< controller>
< variable name="item" access="read" />
< variable name="quantity" access="read" />
< variable name="address" access="read" />
< variable name="money received" />
< /controller>
< /task>
< transition to="update books" />
< /task-node>
< node name="update books">
< action class="org.jbpm.websale.UpdateBooks">
< msg>accountancy application is now informed of the payment< /msg>
< /action>
< transition to="salejoin" />
< /node>
< node name="ship item">
< action class="org.jbpm.websale.ShipItem">
< swimlaneName>shipper< /swimlaneName>
< msg>${shipper} now ships ${item} to ${address}< /msg>
< /action>
< transition to="salejoin" />
< /node>
< join name="salejoin">
< transition to="end" />
< /join>
< end-state name="end" />
< /process-definition>
一旦“創(chuàng )建新的Web銷(xiāo)售訂單”頁(yè)面加載完畢,填寫(xiě)“物品”和“數量”表格字段,其中cookie作為物品,1作為數量。然后選擇“保存”和“結束任務(wù)”,即可完成“創(chuàng )建新的Web銷(xiāo)售訂單”任務(wù)。Web應用會(huì )向jBPM發(fā)出信號,要求把Web銷(xiāo)售流程標記轉移到“評估Web訂單”任務(wù),然后使用輸入數據作為流程變量。這時(shí)候,登錄頁(yè)面會(huì )再次顯示。你會(huì )注意到這樣一則消息:“新的任務(wù)已分配給‘ernie’。”
現在,選擇“以另一個(gè)用戶(hù)登錄”鏈接、以ernie的身份登錄。你會(huì )注意到:“評估Web訂單”任務(wù)呈高亮顯示。把所需地址輸入到注釋字段,然后選擇“需要更多信息”按鈕。這樣就可以把流程標記轉移到“修復Web訂單數據”任務(wù),并且讓瀏覽器回到登錄頁(yè)面。
這時(shí)候,可以以cookie monster用戶(hù)的身份登錄,選擇“修復Web訂單數據”鏈接,就可以查看高亮顯示的任務(wù)如何變化、體現流程標記在執行流程中的位置。
聯(lián)系客服