一、簡介
Activiti是一個輕量級的基於Java的開源工作流引擎,它實現了BPMN 2.0規範,提供了豐富的API和工具,以幫助開發人員輕鬆創建、部署和審批工作流。Activiti由Alfresco軟件公司於2010年創建,現在已經成為一個獨立的項目,是Apache基金會的一部分。下面我們來具體了解一下Activiti的特點及其主要組件。
二、特點
1、輕便:Activiti是基於Java的輕量級工作流引擎,易於集成和使用。
2、BPMN 2.0兼容:Activiti實現了BPMN 2.0標準,提供了完整的BPMN模型和元素支持,開發人員可以通過圖形化的方式設計和定義流程。
3、豐富的API:Activiti提供了豐富的API,支持流程定義、實例化、執行以及任務處理等功能。開發人員可以通過API靈活地對流程進行控制。
4、可視化工具:Activiti提供了基於Web的流程設計器,可以方便地創建、編輯和測試流程。
5、擴展性:Activiti支持流程擴展,可以通過引入自定義的Java類和流程變量來增加業務邏輯和處理能力。
三、主要組件
Activiti主要由以下組件組成:
1、流程引擎(Process Engine)
流程引擎是Activiti的核心組件,它負責管理流程定義、流程實例和任務等對象。流程引擎提供了執行流程的 API,可以通過 API 來啟動、停止、完成任務以及監控流程執行狀態等。在Activiti中流程引擎的實現是ProcessEngineImpl。
2、流程定義(Process Definition)
流程定義是Activiti中的一種重要對象,它描述了一個完整的流程,包括流程中的所有節點、連線、執行順序等。在Activiti中流程定義是由BPMN 2.0文件生成的,一個BPMN文件對應一個流程定義。流程定義通常包含了一組流程變量和表單定義。
3、流程實例(Process Instance)
流程實例是Activiti中的另一個重要對象,它代表了一次具體的流程執行實例,是流程定義的實例化。在流程啟動時,一個流程實例被創建,一個流程實例可以生成多個任務,直到流程結束。
4、任務(Task)
任務代表了流程中的一個步驟,通常需要被用戶或者系統完成,比如網頁審批、報銷審核等。在Activiti中,任務是流程實例中的一個節點,它有自己的執行人和執行狀態。
四、代碼示例
1、流程定義
// 創建流程引擎配置對象 ProcessEngineConfiguration engineConfiguration = ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration(); // 設置jdbc連接信息 engineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti"); engineConfiguration.setJdbcUsername("root"); engineConfiguration.setJdbcPassword("123456"); // 設置數據庫schema的管理策略 engineConfiguration.setDatabaseSchemaUpdate("create-drop"); // 構建流程引擎對象 ProcessEngine processEngine = engineConfiguration.buildProcessEngine(); // 部署流程定義 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("processes/leave.bpmn").deploy();
2、流程實例
// 啟動流程實例,並設置流程參數 Map<String, Object> variables = new HashMap<String, Object>(); variables.put("applyUser", "Tom"); variables.put("days", 3); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave", variables); // 獲取流程中需要執行的任務 Task task = taskService.createTaskQuery() .processInstanceId(processInstance.getId()) .singleResult(); // 處理任務,並設置任務參數 Map<String, Object> taskVariables = new HashMap<String, Object>(); taskVariables.put("approved", true); taskService.complete(task.getId(), taskVariables);
3、任務分配
// 多用戶任務分配 Task task = taskService.newTask(); task.setName("MultiAssignee Task"); task.setOwner("admin"); taskService.saveTask(task); taskService.addCandidateUser(task.getId(), "user1"); taskService.addCandidateUser(task.getId(), "user2"); taskService.addCandidateUser(task.getId(), "user3"); // 角色任務分配 List<IdentityLink> identityLinks = new ArrayList<IdentityLink>(); identityLinks.add(taskService.newTaskIdentityLink("task1", "group1", "assignee")); identityLinks.add(taskService.newTaskIdentityLink("task2", "group2", "assignee")); taskService.saveIdentityLinksForTask("taskId", IdentityLinkType.CANDIDATE, identityLinks);
4、流程展示
Activiti提供了基於Web的流程設計器,可以方便地創建、編輯和測試流程。這裡我們展示一個Activiti流程的BPMN 2.0文件樣例:
<bpmn:process id="leave" name="請假流程"> <bpmn:startEvent id="start" name="開始"> <bpmn:outgoing>Flow_0x3rz3l</bpmn:outgoing> </bpmn:startEvent> <bpmn:userTask id="usertask1" name="請假申請"> <bpmn:extensionElements> <activiti:formProperty id="applyUser" name="申請人" type="string"> <activiti:value>"${applyUser}"</activiti:value> </activiti:formProperty> <activiti:formProperty id="days" name="請假天數" type="integer"> <activiti:value>"${days}"</activiti:value> </activiti:formProperty> </bpmn:extensionElements> <bpmn:incoming>Flow_0x3rz3l</bpmn:incoming> <bpmn:outgoing>Flow_0j1k99y</bpmn:outgoing> </bpmn:userTask> <bpmn:exclusiveGateway id="gateway1" name="請假天數檢查"> <bpmn:incoming>Flow_0j1k99y</bpmn:incoming> <bpmn:outgoing>Flow_1ek20e2</bpmn:outgoing> <bpmn:outgoing>Flow_0zbzcqt</bpmn:outgoing> </bpmn:exclusiveGateway> <bpmn:userTask id="usertask2" name="部門經理審批"> <bpmn:incoming>Flow_1ek20e2</bpmn:incoming> <bpmn:outgoing>Flow_04lw733</bpmn:outgoing> <bpmn:outgoing>Flow_1y9yr2h</bpmn:outgoing> </bpmn:userTask> <bpmn:userTask id="usertask3" name="總經理審批"> <bpmn:incoming>Flow_0zbzcqt</bpmn:incoming> <bpmn:outgoing>Flow_0rtn4j7</bpmn:outgoing> </bpmn:userTask> <bpmn:endEvent id="end" name="結束"> <bpmn:incoming>Flow_04lw733</bpmn:incoming> <bpmn:incoming>Flow_1y9yr2h</bpmn:incoming> <bpmn:incoming>Flow_0rtn4j7</bpmn:incoming> </bpmn:endEvent> <bpmn:sequenceFlow id="Flow_0x3rz3l" sourceRef="start" targetRef="usertask1" /> <bpmn:sequenceFlow id="Flow_0j1k99y" sourceRef="usertask1" targetRef="gateway1" /> <bpmn:sequenceFlow id="Flow_1ek20e2" name="天數≤3天" sourceRef="gateway1" targetRef="usertask2"> <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${days <= 3}</bpmn:conditionExpression> </bpmn:sequenceFlow> <bpmn:sequenceFlow id="Flow_0zbzcqt" name="天數>3天" sourceRef="gateway1" targetRef="usertask3"> <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${days > 3}</bpmn:conditionExpression> </bpmn:sequenceFlow> <bpmn:sequenceFlow id="Flow_04lw733" sourceRef="usertask2" targetRef="end" /> <bpmn:sequenceFlow id="Flow_1y9yr2h" sourceRef="usertask2" targetRef="end" /> <bpmn:sequenceFlow id="Flow_0rtn4j7" sourceRef="usertask3" targetRef="end" /> </bpmn:process>
總結
本文對工作流引擎Activiti進行了全面的介紹,從其特點、主要組件入手,詳細介紹了Activiti的各種使用場景及相關代碼示例。希望本文對大家學習和使用Activiti有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/241351.html