Activiti - 新一代的开源BPM引擎
Activiti 背景簡(jiǎn)介、服務(wù)和功能介紹
背景介紹
Activiti架構(gòu)
Activiti 基本架構(gòu)和服務(wù)組件介紹
Activiti 流程引擎重點(diǎn)關(guān)注在系統(tǒng)開發(fā)的易用性和輕量性上。每一項(xiàng) BPM 業(yè)務(wù)功能 Activiti 流程引擎都以服務(wù)的形式提供給開發(fā)人員。通過使用這些服務(wù),開發(fā)人員能夠構(gòu)建出功能豐富、輕便且高效的 BPM 應(yīng)用程序。
圖 1.Activiti 系統(tǒng)服務(wù)結(jié)構(gòu)圖
圖 1 是 Activiti 引擎的系統(tǒng)服務(wù)結(jié)構(gòu)圖,該圖顯示了引擎提供的所有功能組件,以下為各個(gè)服務(wù)的功能簡(jiǎn)介:
- RepositoryService: Activiti 中每一個(gè)不同版本的業(yè)務(wù)流程的定義都需要使用一些定義文件,部署文件和支持?jǐn)?shù)據(jù) ( 例如 BPMN2.0 XML 文件,表單定義文件,流程定義圖像文件等 ),這些文件都存儲(chǔ)在 Activiti 內(nèi)建的 Repository 中。Repository Service 提供了對(duì) repository 的存取服務(wù)。
- RuntimeService:在 Activiti 中,每當(dāng)一個(gè)流程定義被啟動(dòng)一次之后,都會(huì)生成一個(gè)相應(yīng)的流程對(duì)象實(shí)例。Runtime Service 提供了啟動(dòng)流程、查詢流程實(shí)例、設(shè)置獲取流程實(shí)例變量等功能。此外它還提供了對(duì)流程部署,流程定義和流程實(shí)例的存取服務(wù)。
- TaskService:在 Activiti 中業(yè)務(wù)流程定義中的每一個(gè)執(zhí)行節(jié)點(diǎn)被稱為一個(gè) Task,對(duì)流程中的數(shù)據(jù)存取,狀態(tài)變更等操作均需要在 Task 中完成。Task Service 提供了對(duì)用戶 Task 和 Form 相關(guān)的操作。它提供了運(yùn)行時(shí)任務(wù)查詢、領(lǐng)取、完成、刪除以及變量設(shè)置等功能。
- IdentityService:Activiti 中內(nèi)置了用戶以及組管理的功能,必須使用這些用戶和組的信息才能獲取到相應(yīng)的 Task。Identity Service 提供了對(duì) Activiti 系統(tǒng)中的用戶和組的管理功能。
- ManagementService:Management Service 提供了對(duì) Activiti 流程引擎的管理和維護(hù)功能,這些功能不在工作流驅(qū)動(dòng)的應(yīng)用程序中使用,主要用于 Activiti 系統(tǒng)的日常維護(hù)。
- HistoryService: History Service 用于獲取正在運(yùn)行或已經(jīng)完成的流程實(shí)例的信息,與 Runtime Service 中獲取的流程信息不同,歷史信息包含已經(jīng)持久化存儲(chǔ)的永久信息,并已經(jīng)被針對(duì)查詢優(yōu)化。
- FormService: Activiti 中的流程和狀態(tài) Task 均可以關(guān)聯(lián)業(yè)務(wù)相關(guān)的數(shù)據(jù)。通過使用 Form Service 可以存取啟動(dòng)和完成任務(wù)所需的表單數(shù)據(jù)并且根據(jù)需要來渲染表單。
Activiti 開發(fā)環(huán)境搭建
Activiti 開發(fā)環(huán)境的搭建非常簡(jiǎn)單,主要分為 Activiti runtime 的安裝以及 Eclipse 開發(fā)環(huán)境的配置。本文以 Windows 平臺(tái)為例介紹 Activiti 5.8 版的開發(fā)環(huán)境的搭建配置過程。Activiti 的運(yùn)行時(shí)程序可以從?http://www.activiti.org/download.html?下載,目前最新版本為 5.8。為了配置使用 Activiti 還需要使用 Apache Ant。請(qǐng)您在配置 Activiti 之前自行下載安裝 Apache Ant。Ant 的最新版本為 1.8.2,可以從鏈接:http://ant.apache.org/bindownload.cgi?處下載安裝。
Activiti 運(yùn)行環(huán)境的安裝
當(dāng) Activiti 5.8 的下載完成后可以獲得安裝文件 activiti-5.8.zip,首先需要將這個(gè)文件解壓到指定目錄下,本文中以 D:/activiti-5.8 為例。解壓完成后在該文件夾中將生成三個(gè)子目錄和一些項(xiàng)目描述和許可證信息文件。子目錄 docs 中包含 Activiti 的用戶使用指南和 API Java doc。子目錄 workspace 中包含 Activiti 開發(fā)示例的 Eclipse 項(xiàng)目,這些項(xiàng)目可以在 Eclipse 中直接導(dǎo)入使用。子目錄 setup 中包含了系統(tǒng)配置和運(yùn)行所需的 Ant 文件和其他配置文件以及數(shù)據(jù)文件。Setup 目錄中的 build.xml 中提供了很多 Activiti 的配置管理 Ant 任務(wù),以下為其中常用的幾個(gè)任務(wù) ( 可以在 D:/activiti-5.8/setup 目錄中執(zhí)行“ant – p”命令來獲取所有可用命令的列表 ):
- demo.install:用來安裝和設(shè)置 Activiti demo 示例程序的運(yùn)行環(huán)境。當(dāng)?shù)谝淮螆?zhí)行這個(gè)任務(wù)時(shí),Ant 會(huì)從網(wǎng)絡(luò)下載 Apache Tomcat Web 應(yīng)用服務(wù)器和 H2 內(nèi)存數(shù)據(jù)庫(kù),并將它們安裝在 apps 目錄中。之后會(huì)在 Tomcat 中部署 Activiti demo 的 web application 并且在 H2 中創(chuàng)建數(shù)據(jù)庫(kù)表,部署示例流程。
- demo.clean:在需要清除 demo 系統(tǒng)中的測(cè)試數(shù)據(jù)時(shí)使用,執(zhí)行后它會(huì)除刪除 setup/apps 目錄中已經(jīng)安裝的 Tomcat 和 H2 的數(shù)據(jù)文件,清除已部署的流程定義和運(yùn)行時(shí)產(chǎn)生的流程數(shù)據(jù)。
- demo.start:如果尚未安裝 Tomcat 和 H2,這個(gè)任務(wù)會(huì)調(diào)用 demo.install 安裝全部組件并且啟動(dòng) Tomcat 和 H2 服務(wù)器。如果已經(jīng)安裝過 Tomcat 和 H2 則直接啟動(dòng) demo 程序。
- demo.stop:停止 Tomcat 和 H2 服務(wù)器。
初次安裝 Activiti 時(shí)只需要在 setup 目錄中執(zhí)行 ant demo.start 命令即可,Activiti 會(huì)自動(dòng)創(chuàng)建 apps 目錄,并在這個(gè)目錄中下載安裝 Tomcat 和 H2 服務(wù)器,安裝 Activiti Web 應(yīng)用程序。安裝完成后可以在?http://localhost:8080/activiti-explorer?處訪問 Activiti Explorer web 應(yīng)用程序,這個(gè)程序是流程引擎的用戶接口,用戶可以使用這個(gè)工具來執(zhí)行啟動(dòng)新流程,分配用戶任務(wù),瀏覽或領(lǐng)取任務(wù)等操作。還可以用來執(zhí)行 Activiti 引擎的管理工作。圖 2 是這個(gè)應(yīng)用程序的界面截圖。
圖 2.Activiti Explorer 應(yīng)用程序界面
如果可以在瀏覽器中正常的訪問操作 Activiti Explorer 應(yīng)用程序,則證明 Activiti Runtime 的安裝已經(jīng)順利的完成。
Activiti 開發(fā)環(huán)境的配置
Activiti 提供了基于 Eclipse 插件的開發(fā)工具和流程設(shè)計(jì)工具 ( 需要 Eclipse 的版本為 Helios 或 Indigo,如果尚未安裝 Eclipse,請(qǐng)從?http://www.eclipse.org/downloads/下載安裝最新版本的 Eclipse 集成開發(fā)環(huán)境。)。這些工具可以使用 Eclipse 的”Install new software”功能在線安裝,安裝方法如下:
在 Eclipse 的 Help 菜單中選擇 Install New Software 選項(xiàng),在彈出菜單中,點(diǎn)擊 Add Repository 按鈕添加新的遠(yuǎn)程 Software Repository,如圖 3 所示,在 Location 中添加?http://activiti.org/designer/update/?作為 Repository 的遠(yuǎn)程地址。當(dāng)新的 Repository 添加完成后,Eclipse 會(huì)自動(dòng)獲取 Repository 中的軟件列表。如圖 4 所示,Activiti BPMN2.0 Designer 的最新版本為 5.8.1,選擇所有選項(xiàng)然后等待安裝完成即可。
圖 3. 添加 Activiti Eclipse Plugin repository
圖 4.Activiti Eclipse BPMN 2.0 Designer 安裝列表
當(dāng) Eclipse 插件安裝完成后,選擇 File ->New project 選項(xiàng)新建一個(gè)項(xiàng)目,此時(shí)如果可以看到如圖 5 所示的 Activiti 項(xiàng)目選項(xiàng),證明 Activiti 的 Eclipse 開發(fā)環(huán)境的配置已經(jīng)順利完成。
圖 5.Activiti Eclipse 項(xiàng)目選項(xiàng)
Activiti 功能示例
使用 Activiti 內(nèi)置 Eclipse 項(xiàng)目
Activiti 可以和多種 Java 企業(yè)級(jí)開發(fā)技術(shù) (Spring,JPA), 動(dòng)態(tài)開發(fā)語(yǔ)言 (groovy) 以及 Web Service 開發(fā)工具 (CXF) 結(jié)合使用。在 Actitivi 的安裝目錄中的 workspace 文件夾中包含了 Activiti 自身特性和與這些開發(fā)技術(shù)結(jié)合使用的 Eclipse 項(xiàng)目示例 (activiti-engine-examples、activiti-spring-examples、activiti-groovy-examples、activiti-jpa-examples、activiti-cxf-examples 等 Eclipse 項(xiàng)目 )。要使用這些示例項(xiàng)目,只需在 Eclipse 中使用”Import->Existing Projects into Workspace”從文件系統(tǒng)中導(dǎo)入這些項(xiàng)目即可。
activiti-engine-examples 項(xiàng)目中包含了使用 Activiti 大部分主要功能的示例代碼,這些代碼使用的流程定義信息都已經(jīng)部署在項(xiàng)目使用的 H2 內(nèi)存數(shù)據(jù)庫(kù)中。流程的執(zhí)行中產(chǎn)生的信息也都會(huì)使用持久化 API 存儲(chǔ)在該 H2 內(nèi)存數(shù)據(jù)庫(kù)中。
使用 Activiti Eclipse 流程設(shè)計(jì)器設(shè)計(jì) Activiti 流程定義
Activiti 使用標(biāo)準(zhǔn)的 BPMN2.0 流程定義文件來描述工作流的定義。BPMN2.0 流程定義文件是一個(gè)符合行業(yè)標(biāo)準(zhǔn)的 XML 格式的文件。在這個(gè)文件中包含了流程的流轉(zhuǎn)序列,步驟節(jié)點(diǎn)以及各個(gè)節(jié)點(diǎn)上相關(guān)的用戶,變量信息等流程元素。在 BPMN2.0 XML 流程定義文件中還包含了各個(gè)流程元素在定義中的顯示位置等信息,從而可以以圖形化的方式來顯示或編輯流程定義文件。目前已經(jīng)有多種 BPMN2.0 流程定義文件的可視化編輯器。Activiti 中提供了 2 種定義文件的可視化編輯器:Web Application 形式的 Activiti Modeler 和 Eclipse 插件形式的流程編輯器。Activiti Modeler 必須部署在 Web 應(yīng)用服務(wù)器中才能通過 Web 瀏覽器來使用而 Eclipse 插件形式的編輯器可以在 Eclipse 中直接使用,更好的結(jié)合了 Activiti 的流程設(shè)計(jì)和程序編碼。在 Activiti5.6 版之后,Activiti Modeler 已經(jīng)不再包含在 Activiti 的下載中。本文使用 Eclipse 插件的流程設(shè)計(jì)工具來介紹 BPMN2.0 流程定義文件的使用。
在 Eclipse 項(xiàng)目中可以直接通過創(chuàng)建 Activiti Diagram 的形式來創(chuàng)建一個(gè)流程定義文件并在可視化編輯器中編輯。如果項(xiàng)目中已經(jīng)存在 BPMN2.0 流程定義 XML 文件,雙擊該文件 Eclipse 插件會(huì)自動(dòng)生成一個(gè)后綴為 .activiti 的流程可視化編譯文件。雙擊該文件可在可視化流程編輯器中打開該流程。圖 6 是在可視化編輯器中打開一個(gè)流程定義文件的截圖。
圖 6.Activiti 可視化流程編輯器
當(dāng)流程定義文件設(shè)計(jì)完成后,可以使用以下的 API 代碼獲取?RepositoryService,并使用該服務(wù)將流程定義文件部署到 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 對(duì)象獲取 , 代碼清單 2 展示了如何使用 Activiti Java API 獲取 ProcessEngine 和其他 Service 對(duì)象。
清單 2. 使用 Activiti API 獲得各種 Service 對(duì)象
// 使用默認(rèn)配置文件獲取 ProcessEngine 對(duì)象實(shí)例 ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration().\ buildProcessEngine(); // 通過 ProcessEngine 實(shí)例獲得 RepositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); // 通過 ProcessEngine 實(shí)例獲得 RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); // 通過 ProcessEngine 實(shí)例獲得 TaskService TaskService taskService = processEngine.getTaskService(); HistoryService historyService = processEngine.getHistoryService(); // 通過 ProcessEngine 實(shí)例獲得 FormService FormService formService = processEngine.getFormService(); // 通過 ProcessEngine 實(shí)例獲得 ManagementService ManagementService managementService = processEngine.getManagementService(); // 通過 ProcessEngine 實(shí)例獲得 IdentityService IdentityService identityService = processEngine.getIdentityService();?
當(dāng)獲得了這些 Service 對(duì)象后,就可以使用這些 Service 對(duì)象來完成各種 Activiti 流程引擎的操作。在實(shí)際應(yīng)用中需要綜合使用各種服務(wù)來部署流程定義,啟動(dòng)流程實(shí)例,領(lǐng)取、查詢完成用戶任務(wù)以及查詢流程運(yùn)行歷史紀(jì)錄等 Activiti 流程引擎的主要功能。代碼清單 3 展示了如何使用 API 代碼來完成這一系列操作。該示例代碼使用的 BPMN2.0 流程定義文件可以在 activiti-engine-examples 示例 Eclipse 工程中獲取,使用到的用戶和用戶組也已經(jīng)在 demo 系統(tǒng)初始化時(shí)寫入了 Activiti 的后端 H2 數(shù)據(jù)庫(kù)。
清單 3. 使用 Activiti 的各種 Service 對(duì)象完成流程引擎的業(yè)務(wù)功能
// 獲取 RepositoryService 和 RuntimeService 實(shí)例 RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService();// 使用 RepositoryService 部署流程定義 repositoryService.createDeployment().addClasspathResource(" FinancialReportProcess.bpmn20.xml").deploy();// 使用 RuntimeService 創(chuàng)建一個(gè)流程的實(shí)例 String procId = runtimeService.startProcessInstanceByKey("financialReport").getId(); // 獲取 TaskService 實(shí)例 TaskService taskService = processEngine.getTaskService(); // 使用 TaskService 獲取指定用戶組的 Task 列表并使用指定用戶領(lǐng)取這些任務(wù) 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 ittaskService.claim(task.getId(), "fozzie"); }// 使用 TaskService 獲取指定用戶的工作 Task 列表,并完成這些任務(wù) 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 來查詢指定流程實(shí)例的狀態(tài) 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 引擎中 ( 這個(gè)流程是 activiti-engine-examples 示例項(xiàng)目中內(nèi)置的一個(gè)示例流程。共包含了 2 個(gè)順序任務(wù)。第一個(gè)任務(wù)是 Write monthly financial report ,關(guān)聯(lián)的用戶組為 accountancy ,第二個(gè)任務(wù)為 Verify monthly financial report,關(guān)聯(lián)的用戶組為 management)。之后使用 RuntimeService 創(chuàng)建了一個(gè)流程的實(shí)例。實(shí)例創(chuàng)建完成后示例代碼使用 TaskService 查詢出該流程實(shí)例涉及到的 accountancy 組的任務(wù) , 并使用 accountancy 組中的用戶 fozzie 來領(lǐng)取并完成了該項(xiàng)任務(wù)。最后使用 HistoryService 來查詢了該流程的運(yùn)行狀態(tài)。
總結(jié)
Activiti 是一個(gè)新興的基于 Apache 許可的支持 BPMN 2.0 標(biāo)準(zhǔn)的開源 BPM 產(chǎn)品。它是一個(gè)輕量級(jí),可嵌入的 BPM 引擎,并且提供了功能豐富的開發(fā)和流程設(shè)計(jì)工具。本文簡(jiǎn)要介紹了 Activiti 的基本架構(gòu)、開發(fā)環(huán)境的搭建以及基本的開發(fā)流程。通過閱讀參考本文,BPM 系統(tǒng)開發(fā)人員可以快速的搭建 Activiti 的開發(fā)環(huán)境,了解 Activiti 的基本功能。從而為 BPM 應(yīng)用系統(tǒng)的開發(fā)提供一個(gè)新的選擇。
?
本文轉(zhuǎn)自:https://www.ibm.com/developerworks/cn/java/j-lo-activiti1/? ? ? ? ?https://blog.csdn.net/yen_csdn/article/details/54666658
總結(jié)
以上是生活随笔為你收集整理的Activiti - 新一代的开源BPM引擎的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开源源码推荐(一)
- 下一篇: 关于ECMAScript6 的学习01-