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 統一了工做流社區。html
Activiti 是由 jBPM 的建立者 Tom Baeyens 離開 JBoss 以後創建的項目,構建在開發 jBPM 版本 1 到 4 時積累的多年經驗的基礎之上,旨在建立下一代的 BPM 解決方案。同時 Activiti 選擇了 Apache 許可,一方面是但願 Activiti 能有更長久的生命力,由於它不受任何我的或是公司的控制而是屬於整個社區,另外一方面更是但願這個寬鬆的許可可以讓 Activiti BPM 引擎和 BPMN2.0 被更普遍的採納、使用和商業化。java
對於 Java 開發者來講,Activiti 的首席架構師 Tom Baeyens 曾提到,Activiti 的首個目標就是要得到開發者的青睞。首先它在使用時極爲方便,只是個 jar 文件,使用時僅須要將其放在類路徑中,固然,Activiti 也能夠做爲獨立服務器的方式使用;同時 Activiti 提供了不少 BPM 高級工具,其中還包括開發了協做工具,使得開發人員、業務人員和運維人員可以更好的協同工做。ios
本文將會介紹 Activiti 的基本概念,同時經過示例來介紹如何經過搭建 Activiti 開發環境和 Activiti API 使用,同時也會接觸到 Activiti 的一些工具,但願經過閱讀這篇文章,Activiti 能成爲您在開發 BPM 系統時的一個選擇。web
回頁首spring
Activiti 流程引擎重點關注在系統開發的易用性和輕量性上。每一項 BPM 業務功能 Activiti 流程引擎都以服務的形式提供給開發人員。經過使用這些服務,開發人員可以構建出功能豐富、輕便且高效的 BPM 應用程序。數據庫
圖 1 是 Activiti 引擎的系統服務結構圖,該圖顯示了引擎提供的全部功能組件,如下爲各個服務的功能簡介:apache
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 是這個應用程序的界面截圖。
若是能夠在瀏覽器中正常的訪問操做 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,選擇全部選項而後等待安裝完成便可。
當 Eclipse 插件安裝完成後,選擇 File ->New project 選項新建一個項目,此時若是能夠看到如圖 5 所示的 Activiti 項目選項,證實 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 是在可視化編輯器中打開一個流程定義文件的截圖。
當流程定義文件設計完成後,可使用如下的 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 對象。
// 使用默認配置文件獲取 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 數據庫。
// 獲取 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 列表並使用指定用戶領取這些任務 List<Task> tasks = \ 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 應用系統的開發提供一個新的選擇。