activiti初步

背景介紹

  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 被更廣泛的採納、使用和商業化。
  1. 對於 Java 開發者來說,Activiti 的首席架構師 Tom Baeyens 曾提到,Activiti 的首個目標就是要獲得開發者的青睞。首先它在使用時極爲方便,只是個 jar 文件,使用時僅需要將其放在類路徑中,當然,Activiti 也可以作爲獨立服務器的方式使用;同時 Activiti 提供了很多 BPM 高級工具,其中還包括開發了協作工具,使得開發人員、業務人員和運維人員能夠更好的協同工作。
  1. 本文將會介紹 Activiti 的基本概念,同時通過示例來介紹如何通過搭建 Activiti 開發環境和 Activiti API 使用,同時也會接觸到 Activiti 的一些工具,希望通過閱讀這篇文章,Activiti 能成爲您在開發 BPM 系統時的一個選擇。

 

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


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 開發環境的搭建非常簡單,主要分爲 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 目錄中執行 antdemo.start 命令即可,Activiti 會自動創建 apps 目錄,並在這個目錄中下載安裝 Tomcat 和 H2 服務器,安裝Activiti Web 應用程序。安裝完成後可以在http://localhost:8080/activiti-explorer 處訪問 ActivitiExplorer 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 選項,在彈出菜單中,點擊 AddRepository 按鈕添加新的遠程 Software Repository,如圖 3 所示,在 Location 中添加http://activiti.org/designer/update/ 作爲 Repository 的遠程地址。當新的 Repository 添加完成後,Eclipse 會自動獲取Repository 中的軟件列表。如圖 4 所示,ActivitiBPMN2.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 功能示例


使用 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 插件形式的流程編輯器。ActivitiModeler 必須部署在 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 列表並使用指定用戶領取這些任務
 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 來查詢了該流程的運行狀態。

 

源文檔 <http://www.ibm.com/developerworks/cn/java/j-lo-activiti1/>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章