一、簡介
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-hant/n/241351.html
微信掃一掃
支付寶掃一掃