Activiti - 新一代的開源 BPM 引擎
Activiti 作為一個遵從 Apache 許可的工作流和業務流程管理開源平臺,其核心是基于 Java 的超快速、超穩定的 BPMN 2.0 流程引擎,強調流程服務的可嵌入性和可擴展性,同時更加強調面向業務人員。本文主要介紹 Activiti 的背景和基礎知識,包括 Activiti 結構、基本服務和功能簡介,開發環境的搭建以及主要功能的代碼示例。
- Activiti 其核心是 BPMN 2.0 的流程引擎。BPMN 是目前被各 BPM 廠商廣泛接受的 BPM 標準,全稱為 Business Process Model and Notation,由 OMG 組織進行維護,2011 年 1 月份發布了其 2.0 的正式版。BPMN 2.0 對比于第一個版本,其最重要的變化在于其定義了流程的元模型和執行語義,即它自己解決了存儲、交換和執行的問題。這代表著 BPMN 2.0 流程定義模型不僅僅可以在任何兼容 BPMN 2.0 的引擎中執行,而且也可以在圖形編輯器間交換。作為一個標準,BPMN 2.0 統一了工作流社區。
- Activiti 是由 jBPM 的創建者 Tom Baeyens 離開 JBoss 之后建立的項目,構建在開發 jBPM 版本 1 到 4 時積累的多年經驗的基礎之上,旨在創建下一代的 BPM 解決方案。同時 Activiti 選擇了 Apache 許可,一方面是希望 Activiti 能有更長久的生命力,因為它不受任何個人或是公司的控制而是屬于整個社區,另一方面更是希望這個寬松的許可能夠讓 Activiti BPM 引擎和 BPMN2.0 被更廣泛的采納、使用和商業化。
- 對于 Java 開發者來說,Activiti 的首席架構師 Tom Baeyens 曾提到,Activiti 的首個目標就是要獲得開發者的青睞。首先它在使用時極為方便,只是個 jar 文件,使用時僅需要將其放在類路徑中,當然,Activiti 也可以作為獨立服務器的方式使用;同時 Activiti 提供了很多 BPM 高級工具,其中還包括開發了協作工具,使得開發人員、業務人員和運維人員能夠更好的協同工作。
- 本文將會介紹 Activiti 的基本概念,同時通過示例來介紹如何通過搭建 Activiti 開發環境和 Activiti API 使用,同時也會接觸到 Activiti 的一些工具,希望通過閱讀這篇文章,Activiti 能成為您在開發 BPM 系統時的一個選擇。
Activiti 流程引擎重點關注在系統開發的易用性和輕量性上。每一項 BPM 業務功能 Activiti 流程引擎都以服務的形式提供給開發人員。通過使用這些服務,開發人員能夠構建出功能豐富、輕便且高效的 BPM 應用程序。
圖 1.Activiti 系統服務結構圖

圖 1 是 Activiti 引擎的系統服務結構圖,該圖顯示了引擎提供的所有功能組件,以下為各個服務的功能簡介:
- RepositoryService: Activiti 中每一個不同版本的業務流程的定義都需要使用一些定義文件,部署文件和支持數據 ( 例如 BPMN2.0 XML 文件,表單定義文件,流程定義圖像文件等 ),這些文件都存儲在 Activiti 內建的 Repository 中。Repository Service 提供了對 repository 的存取服務。
- RuntimeService:在 Activiti 中,每當一個流程定義被啟動一次之后,都會生成一個相應的流程對象實例。Runtime Service 提供了啟動流程、查詢流程實例、設置獲取流程實例變量等功能。此外它還提供了對流程部署,流程定義和流程實例的存取服務。
- TaskService:在 Activiti 中業務流程定義中的每一個執行節點被稱為一個 Task,對流程中的數據存取,狀態變更等操作均需要在 Task 中完成。Task Service 提供了對用戶 Task 和 Form 相關的操作。它提供了運行時任務查詢、領取、完成、刪除以及變量設置等功能。
- IdentityService:Activiti 中內置了用戶以及組管理的功能,必須使用這些用戶和組的信息才能獲取到相應的 Task。Identity Service 提供了對 Activiti 系統中的用戶和組的管理功能。
- ManagementService:Management Service 提供了對 Activiti 流程引擎的管理和維護功能,這些功能不在工作流驅動的應用程序中使用,主要用于 Activiti 系統的日常維護。
- HistoryService: History Service 用于獲取正在運行或已經完成的流程實例的信息,與 Runtime Service 中獲取的流程信息不同,歷史信息包含已經持久化存儲的永久信息,并已經被針對查詢優化。
- FormService: Activiti 中的流程和狀態 Task 均可以關聯業務相關的數據。通過使用 Form Service 可以存取啟動和完成任務所需的表單數據并且根據需要來渲染表單。
Activiti 開發環境的搭建非常簡單,主要分為 Activiti runtime 的安裝以及 Eclipse 開發環境的配置。本文以 Windows 平臺為例介紹 Activiti 5.8 版的開發環境的搭建配置過程。Activiti 的運行時程序可以從 http://www.activiti.org/download.html 下載,目前最新版本為 5.8。為了配置使用 Activiti 還需要使用 Apache Ant。請您在配置 Activiti 之前自行下載安裝 Apache Ant。Ant 的最新版本為 1.8.2,可以從鏈接:http://ant.apache.org/bindownload.cgi 處下載安裝。
Activiti 運行環境的安裝
當 Activiti 5.8 的下載完成后可以獲得安裝文件 activiti-5.8.zip,首先需要將這個文件解壓到指定目錄下,本文中以 D:/activiti-5.8 為例。解壓完成后在該文件夾中將生成三個子目錄和一些項目描述和許可證信息文件。子目錄 docs 中包含 Activiti 的用戶使用指南和 API Java doc。子目錄 workspace 中包含 Activiti 開發示例的 Eclipse 項目,這些項目可以在 Eclipse 中直接導入使用。子目錄 setup 中包含了系統配置和運行所需的 Ant 文件和其他配置文件以及數據文件。Setup 目錄中的 build.xml 中提供了很多 Activiti 的配置管理 Ant 任務,以下為其中常用的幾個任務 ( 可以在 D:/activiti-5.8/setup 目錄中執行“ant – p”命令來獲取所有可用命令的列表 ):
- demo.install:用來安裝和設置 Activiti demo 示例程序的運行環境。當第一次執行這個任務時,Ant 會從網絡下載 Apache Tomcat Web 應用服務器和 H2 內存數據庫,并將它們安裝在 apps 目錄中。之后會在 Tomcat 中部署 Activiti demo 的 web application 并且在 H2 中創建數據庫表,部署示例流程。
- demo.clean:在需要清除 demo 系統中的測試數據時使用,執行后它會除刪除 setup/apps 目錄中已經安裝的 Tomcat 和 H2 的數據文件,清除已部署的流程定義和運行時產生的流程數據。
- demo.start:如果尚未安裝 Tomcat 和 H2,這個任務會調用 demo.install 安裝全部組件并且啟動 Tomcat 和 H2 服務器。如果已經安裝過 Tomcat 和 H2 則直接啟動 demo 程序。
- demo.stop:停止 Tomcat 和 H2 服務器。
初次安裝 Activiti 時只需要在 setup 目錄中執行 ant demo.start 命令即可,Activiti 會自動創建 apps 目錄,并在這個目錄中下載安裝 Tomcat 和 H2 服務器,安裝 Activiti Web 應用程序。安裝完成后可以在 http://localhost:8080/activiti-explorer 處訪問 Activiti Explorer web 應用程序,這個程序是流程引擎的用戶接口,用戶可以使用這個工具來執行啟動新流程,分配用戶任務,瀏覽或領取任務等操作。還可以用來執行 Activiti 引擎的管理工作。圖 2 是這個應用程序的界面截圖。
圖 2.Activiti Explorer 應用程序界面

如果可以在瀏覽器中正常的訪問操作 Activiti Explorer 應用程序,則證明 Activiti Runtime 的安裝已經順利的完成。
Activiti 開發環境的配置
Activiti 提供了基于 Eclipse 插件的開發工具和流程設計工具 ( 需要 Eclipse 的版本為 Helios 或 Indigo,如果尚未安裝 Eclipse,請從 http://www.eclipse.org/downloads/下載安裝最新版本的 Eclipse 集成開發環境。)。這些工具可以使用 Eclipse 的”Install new software”功能在線安裝,安裝方法如下:
在 Eclipse 的 Help 菜單中選擇 Install New Software 選項,在彈出菜單中,點擊 Add Repository 按鈕添加新的遠程 Software Repository,如圖 3 所示,在 Location 中添加 http://activiti.org/designer/update/ 作為 Repository 的遠程地址。當新的 Repository 添加完成后,Eclipse 會自動獲取 Repository 中的軟件列表。如圖 4 所示,Activiti BPMN2.0 Designer 的最新版本為 5.8.1,選擇所有選項然后等待安裝完成即可。
圖 3. 添加 Activiti Eclipse Plugin repository

圖 4.Activiti Eclipse BPMN 2.0 Designer 安裝列表

當 Eclipse 插件安裝完成后,選擇 File ->New project 選項新建一個項目,此時如果可以看到如圖 5 所示的 Activiti 項目選項,證明 Activiti 的 Eclipse 開發環境的配置已經順利完成。
圖 5.Activiti Eclipse 項目選項

使用 Activiti 內置 Eclipse 項目
Activiti 可以和多種 Java 企業級開發技術 (Spring,JPA), 動態開發語言 (groovy) 以及 Web Service 開發工具 (CXF) 結合使用。在 Actitivi 的安裝目錄中的 workspace 文件夾中包含了 Activiti 自身特性和與這些開發技術結合使用的 Eclipse 項目示例 (activiti-engine-examples、activiti-spring-examples、activiti-groovy- examples、activiti-jpa-examples、activiti-cxf-examples 等 Eclipse 項目 )。要使用這些示例項目,只需在 Eclipse 中使用”Import->Existing Projects into Workspace”從文件系統中導入這些項目即可。
activiti-engine-examples 項目中包含了使用 Activiti 大部分主要功能的示例代碼,這些代碼使用的流程定義信息都已經部署在項目使用的 H2 內存數據庫中。流程的執行中產生的信息也都會使用持久化 API 存儲在該 H2 內存數據庫中。
使用 Activiti Eclipse 流程設計器設計 Activiti 流程定義
Activiti 使用標準的 BPMN2.0 流程定義文件來描述工作流的定義。BPMN2.0 流程定義文件是一個符合行業標準的 XML 格式的文件。在這個文件中包含了流程的流轉序列,步驟節點以及各個節點上相關的用戶,變量信息等流程元素。在 BPMN2.0 XML 流程定義文件中還包含了各個流程元素在定義中的顯示位置等信息,從而可以以圖形化的方式來顯示或編輯流程定義文件。目前已經有多種 BPMN2.0 流程定義文件的可視化編輯器。Activiti 中提供了 2 種定義文件的可視化編輯器:Web Application 形式的 Activiti Modeler 和 Eclipse 插件形式的流程編輯器。Activiti Modeler 必須部署在 Web 應用服務器中才能通過 Web 瀏覽器來使用而 Eclipse 插件形式的編輯器可以在 Eclipse 中直接使用,更好的結合了 Activiti 的流程設計和程序編碼。在 Activiti5.6 版之后,Activiti Modeler 已經不再包含在 Activiti 的下載中。本文使用 Eclipse 插件的流程設計工具來介紹 BPMN2.0 流程定義文件的使用。
在 Eclipse 項目中可以直接通過創建 Activiti Diagram 的形式來創建一個流程定義文件并在可視化編輯器中編輯。如果項目中已經存在 BPMN2.0 流程定義 XML 文件,雙擊該文件 Eclipse 插件會自動生成一個后綴為 .activiti 的流程可視化編譯文件。雙擊該文件可在可視化流程編輯器中打開該流程。圖 6 是在可視化編輯器中打開一個流程定義文件的截圖。
圖 6.Activiti 可視化流程編輯器

當流程定義文件設計完成后,可以使用以下的 API 代碼獲取 RepositoryService
,并使用該服務將流程定義文件部署到 Activiti 流程引擎中 ( 本代碼示例中流程定義文件名稱為 FinancialReportProcess.bpmn20.xml
):
清單 1. 部署 BPMN2.0 流程定義文件
// 獲取 RepositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); // 使用 RepositoryService 部署流程定義 repositoryService.createDeployment().addClasspathResource(" FinancialReportProcess.bpmn20.xml").deploy();
Activiti 基本編程
如圖 1 所示 ,Activiti 的 Java 編程模型的核心是 ProcessEngine。所有其他 service 都必須從 ProcessEngine 對象獲取 , 代碼清單 2 展示了如何使用 Activiti Java API 獲取 ProcessEngine 和其他 Service 對象。
清單 2. 使用 Activiti API 獲得各種 Service 對象
// 使用默認配置文件獲取 ProcessEngine 對象實例 ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration().\ buildProcessEngine(); // 通過 ProcessEngine 實例獲得 RepositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); // 通過 ProcessEngine 實例獲得 RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); // 通過 ProcessEngine 實例獲得 TaskService TaskService taskService = processEngine.getTaskService(); HistoryService historyService = processEngine.getHistoryService(); // 通過 ProcessEngine 實例獲得 FormService FormService formService = processEngine.getFormService(); // 通過 ProcessEngine 實例獲得 ManagementService ManagementService managementService = processEngine.getManagementService(); // 通過 ProcessEngine 實例獲得 IdentityService IdentityService identityService = processEngine.getIdentityService();
當獲得了這些 Service 對象后,就可以使用這些 Service 對象來完成各種 Activiti 流程引擎的操作。在實際應用中需要綜合使用各種服務來部署流程定義,啟動流程實例,領取、查詢完成用戶任務以及查詢流程運行歷史紀錄等 Activiti 流程引擎的主要功能。代碼清單 3 展示了如何使用 API 代碼來完成這一系列操作。該示例代碼使用的 BPMN2.0 流程定義文件可以在 activiti-engine-examples 示例 Eclipse 工程中獲取,使用到的用戶和用戶組也已經在 demo 系統初始化時寫入了 Activiti 的后端 H2 數據庫。
清單 3. 使用 Activiti 的各種 Service 對象完成流程引擎的業務功能
// 獲取 RepositoryService 和 RuntimeService 實例 RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); // 使用 RepositoryService 部署流程定義 repositoryService.createDeployment().addClasspathResource(" FinancialReportProcess.bpmn20.xml").deploy(); // 使用 RuntimeService 創建一個流程的實例 String procId = runtimeService.startProcessInstanceByKey("financialReport").getId(); // 獲取 TaskService 實例 TaskService taskService = processEngine.getTaskService(); // 使用 TaskService 獲取指定用戶組的 Task 列表并使用指定用戶領取這些任務 Listtasks = \ taskService.createTaskQuery().taskCandidateGroup("accountancy").list(); for (Task task : tasks) { System.out.println("\ Following task is available for accountancy group: " + task.getName()); // claim it taskService.claim(task.getId(), "fozzie"); } // 使用 TaskService 獲取指定用戶的工作 Task 列表,并完成這些任務 tasks = taskService.createTaskQuery().taskAssignee("fozzie").list(); for (Task task : tasks) { System.out.println("Task for fozzie: " + task.getName()); // Complete the task taskService.complete(task.getId()); } System.out.println("Number of tasks for fozzie: " + taskService.createTaskQuery().taskAssignee("fozzie").count()); // 使用 HistoryService 來查詢指定流程實例的狀態 HistoryService historyService = processEngine.getHistoryService(); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).\ singleResult(); System.out.println("Process instance end time: " + \ historicProcessInstance.getEndTime());
清單 3 代碼首先將流程定義文件 FinancialReportProcess.bpmn20.xml 部署到了 Activiti 引擎中 ( 這個流程是 activiti-engine-examples 示例項目中內置的一個示例流程。共包含了 2 個順序任務。第一個任務是 Write monthly financial report ,關聯的用戶組為 accountancy ,第二個任務為 Verify monthly financial report,關聯的用戶組為 management)。之后使用 RuntimeService 創建了一個流程的實例。實例創建完成后示例代碼使用 TaskService 查詢出該流程實例涉及到的 accountancy 組的任務 , 并使用 accountancy 組中的用戶 fozzie 來領取并完成了該項任務。最后使用 HistoryService 來查詢了該流程的運行狀態。
Activiti 是一個新興的基于 Apache 許可的支持 BPMN 2.0 標準的開源 BPM 產品。它是一個輕量級,可嵌入的 BPM 引擎,并且提供了功能豐富的開發和流程設計工具。本文簡要介紹了 Activiti 的基本架構、開發環境的搭建以及基本的開發流程。通過閱讀參考本文,BPM 系統開發人員可以快速的搭建 Activiti 的開發環境,了解 Activiti 的基本功能。從而為 BPM 應用系統的開發提供一個新的選擇。
文章出處:IBM developerWorks