Activiti - 新一代的開源 BPM 引擎

iteye_2881發表於2015-03-18

背景介紹

  1. 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 統一了工作流社群。
  2. Activiti 是由 jBPM 的建立者 Tom Baeyens 離開 JBoss 之後建立的專案,構建在開發 jBPM 版本 1 到 4 時積累的多年經驗的基礎之上,旨在建立下一代的 BPM 解決方案。同時 Activiti 選擇了 Apache 許可,一方面是希望 Activiti 能有更長久的生命力,因為它不受任何個人或是公司的控制而是屬於整個社群,另一方面更是希望這個寬鬆的許可能夠讓 Activiti BPM 引擎和 BPMN2.0 被更廣泛的採納、使用和商業化。
  3. 對於 Java 開發者來說,Activiti 的首席架構師 Tom Baeyens 曾提到,Activiti 的首個目標就是要獲得開發者的青睞。首先它在使用時極為方便,只是個 jar 檔案,使用時僅需要將其放在類路徑中,當然,Activiti 也可以作為獨立伺服器的方式使用;同時 Activiti 提供了很多 BPM 高階工具,其中還包括開發了協作工具,使得開發人員、業務人員和運維人員能夠更好的協同工作。
  4. 本文將會介紹 Activiti 的基本概念,同時通過示例來介紹如何通過搭建 Activiti 開發環境和 Activiti API 使用,同時也會接觸到 Activiti 的一些工具,希望通過閱讀這篇文章,Activiti 能成為您在開發 BPM 系統時的一個選擇。
 

Activiti 基本架構和服務元件介紹

Activiti 流程引擎重點關注在系統開發的易用性和輕量性上。每一項 BPM 業務功能 Activiti 流程引擎都以服務的形式提供給開發人員。通過使用這些服務,開發人員能夠構建出功能豐富、輕便且高效的 BPM 應用程式。

圖 1.Activiti 系統服務結構圖

圖 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 開發環境的搭建非常簡單,主要分為 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 應用程式介面

圖 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

圖 3. 新增 Activiti Eclipse Plugin repository

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

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

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

圖 5.Activiti Eclipse 專案選項

圖 5.Activiti Eclipse 專案選項

 

Activiti 功能示例

使用 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 視覺化流程編輯器

圖 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 列表並使用指定使用者領取這些任務
 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 應用系統的開發提供一個新的選擇。

相關文章