1 基本概念
1.1 核心组件
1.1.1 流程引擎(Process Engine)
负责流程的解析、执行和管理。
提供 API 用于与流程进行交互。
1.1.2 BPMN 2.0 文件
用 XML 定义的流程文件,描述流程的步骤、条件和参与者。
1.1.3 数据库
存储流程定义、运行时数据和历史记录(默认支持 H2、MySQL、PostgreSQL 等)。
1.1.4 API
提供与流程引擎交互的接口,例如启动流程、完成任务。
1.1.5 用户界面
官方提供了 Activiti Explorer、Activiti Modeler 等工具(可选)。
1.2 基本对象
1.2.1 流程定义(Process Definition):
使用 BPMN 2.0 标准定义的业务流程模板,通常用 BPMN 2.0 XML 文件描述。包含流程的各个环节、决策点、任务等。
是流程的只读元数据,不需要对其进行直接的操作(也不一定)。所有的Model、XML、BpmnModel 动态创建,都只有被部署为ProcessDefinition才能运行。
距离:
- 标准化流程(如请假审批、报销审批):
这些流程固定不变,可以直接用 BPMN XML 部署:repositoryService.createDeployment() .addClasspathResource("processes/leave.bpmn20.xml") .deploy(); - 代码定义的流程(BpmnModel 动态创建):
BpmnModel bpmnModel = new BpmnModel(); Process process = new Process(); process.setId("myProcess"); bpmnModel.addProcess(process); repositoryService.createDeployment() .addBpmnModel("dynamic-process.bpmn", bpmnModel) .deploy(); - 从Model读取
@Override public String deployModel(String modelId) throws IOException { // 获取模型 Model modelData = repositoryService.getModel(modelId); // 读取模型编辑器源 ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId())); // 转换模型为BpmnModel(BPMN 2.0 XML 的内存表示),再转换为BPNM XML byte[] bpmnBytes; BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(modelNode); bpmnBytes = new BpmnXMLConverter().convertToXML(bpmnModel); // 创建部署 String processName = modelData.getName() + ".bpmn20.xml"; Deployment deployment = repositoryService.createDeployment(). name(modelData.getName()).addString(processName, new String(bpmnBytes, "UTF-8")).deploy(); //更新model的部署ID //校验工单类型是否存在 modelData.setDeploymentId(deployment.getId()); repositoryService.saveModel(modelData); return deployment.getId(); }
1.2.2 流程实例(Process Instance):
流程定义的具体执行实例。
每个流程实例代表一次具体的业务流程执行。
- 定义:
- 流程实例是流程定义的具体执行。可以将其视为根据流程蓝图(流程定义)创建的一个实际运行的“副本”。
- 它代表着一个完整的业务流程的执行过程,从开始到结束。
- 作用:
- 跟踪整个流程的执行状态。
- 管理流程中所有活动的执行顺序。
- 存储流程的全局数据(流程变量)。
- 控制流程的启动、暂停、恢复和终止。
- 关系:
- 一个流程定义可以有多个流程实例同时运行。
- 一个流程实例可以包含多个任务实例。
1.2.3 任务(Task):
流程中的一个执行步骤,通常需要人工参与。
可以分配给特定的用户或用户组。
1.2.4 任务实例(TaskInstance)
- 定义:
- 任务实例是流程实例中的一个执行步骤。
- 它代表着流程中需要人工或系统执行的一个具体工作单元。
- 作用:
- 分配给用户或系统执行具体任务。
- 跟踪任务的执行状态(例如,已创建、已分配、已完成)。
- 存储任务的局部数据(任务变量)。
- 提供任务的领取、完成、委托等操作。
- 关系:
- 任务实例存在于流程实例中,是流程实例的一部分。
- 一个流程实例可以包含零个或多个任务实例,具体取决于流程定义。
简单来说:
ProcessInstance是整个业务流程的运行实例。TaskInstance是流程实例中的一个具体工作步骤,或者说流程中的一个节点。
1.2.5 变量(Variable)
流程运行时的数据,例如表单输入或状态。
1.2.6 模型(Model)
用户通过 Flowable/Activiti Modeler 设计的流程,必须用 Model 创建。
// 模型基本信息
repositoryService.saveModel(model);
// 流程信息
repositoryService.addModelEditorSource(modelId, jsonXml.getBytes("UTF-8"));
// 缩略图
repositoryService.addModelEditorSourceExtra(modelId, pngBytes[]);
1.2.7 网关(Gateway)
控制流程的分支,例如条件判断(Exclusive Gateway)或并行执行(Parallel Gateway)。
1.3 核心服务(API)
1.3.1 ProcessEngine
ProcessEngine 是Activiti引擎的核心,通过它来创建、管理和获取其他服务类的实例。
- 获取服务实例:
ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault().buildProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
1.3.2 RuntimeService
管理流程实例和执行流程操作。
- 启动流程实例:
runtimeService.startProcessInstanceByKey("processKey");
- 查询流程实例:
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
1.3.3 TaskService
管理任务(如用户任务)的生命周期,提供了创建、查询和处理任务的功能。
- 查询任务
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
- 完成任务
taskService.complete(taskId);
- 为任务分配候选人
taskService.addCandidateUser(taskId, "userId");
- 添加评论
taskService.addComment(taskId, processInstanceId, str);
1.3.4 RepositoryService
管理流程定义(ProcessDefinition)以及模型(Model)的部署、查询、删除等操作。
- 部署流程定义
repositoryService.createDeployment().addInputStream("process.bpmn", bpmnStream).deploy();
- 查询流程定义
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
- 获取 BPMN 资源文件
List<String> resourceNames = repositoryService.getDeploymentResourceNames("deploymentId");
for (String resourceName : resourceNames) {
System.out.println("资源名称:" + resourceName);
}
- 读取 BPMN XML 文件内容
InputStream inputStream = repositoryService.getResourceAsStream("deploymentId", "my-process.bpmn");
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
- 创建模型
Model model = repositoryService.newModel();
// 设置基本信息
model.setKey("myProcess");
model.setName("我的流程模型");
model.setCategory("category1");
model.setVersion(1);
// 保存 Model
repositoryService.saveModel(model);
System.out.println("Model ID: " + model.getId());
- 查询模型
Model model = repositoryService.createModelQuery()
.modelKey("modelKey")
.singleResult();
- Model 与 BPMN XML 关联
//Model 本身不存流程数据,需要将 BPMN XML 以 byte[] 形式存入 ModelEditorSource:
String bpmnXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> ..."; // BPMN XML 字符串
repositoryService.addModelEditorSource(model.getId(), bpmnXml.getBytes(StandardCharsets.UTF_8));
1.3.5 HistoryService
负责查询历史数据,包括历史任务、历史流程实例、变量等。它通常用于查看已完成流程的状态和细节。
- 查询历史任务:
List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).list();
- 查询历史流程实例:
List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).list();
- 查询历史流程变量:
List<HistoricVariableInstance> variables = historyService.createHistoricVariableInstanceQuery()
.processInstanceId(processInstanceId).list();
1.3.6 IdentityService
用于管理用户、组、角色等身份信息,用来创建用户、查询用户信息等。
- 创建用户
identityService.newUser("userId");
- 查询用户
User user = identityService.createUserQuery().userId("userId").singleResult();
- 设置当前用户身份
identityService.setAuthenticatedUserId("userId");
1.3.7 FormService
处理与任务表单的相关操作,通常用于动态生成表单并与用户交互。表单可以用于用户任务中,允许用户输入信息。
- 获取任务表单:
FormData formData = formService.getTaskFormData(taskId);
- 提交表单数据:
formService.submitTaskFormData(taskId, formFields);
1.3.8 ManagementService
执行与引擎管理相关的任务,允许你对引擎进行控制,例如清除历史数据、获取引擎状态等。
- 清理历史数据:
managementService.deleteHistoricProcessInstances("processInstanceId");
- 获取引擎状态:
ProcessEngineConfiguration configuration = processEngine.getProcessEngineConfiguration();
1.3.9 EventService
管理和监听引擎中的事件,用于监听流程中的事件(例如任务完成、流程实例结束等)。
- 注册事件监听器:
eventService.addEventListener(new TaskEventListener());
1.3.10 TaskListener 和 ExecutionListener
事件监听器用于在任务和流程执行的特定时刻进行自定义操作,可以在任务创建、任务完成、流程结束等时刻执行自定义操作。
- 定义任务监听器:
TaskListener taskListener = new TaskListener() {
public void notify(DelegateTask delegateTask) {
// 自定义任务操作
}
};
- 定义执行监听器:
ExecutionListener executionListener = new ExecutionListener() {
public void notify(DelegateExecution delegateExecution) {
// 自定义执行操作
}
};
2 应用流程
2.1 示例
假设一个请假审批流程:
- 流程设计:
- 开始 → 员工提交请假申请(User Task) → 经理审批(User Task) → 结束。
- 使用网关判断:如果经理拒绝,流程结束;如果同意,通知 HR。
- BPMN XML(简版):
<process id="leaveProcess" name="请假流程"> <startEvent id="start"/> <userTask id="submitRequest" name="提交申请"/> <userTask id="managerApprove" name="经理审批"/> <exclusiveGateway id="decision"/> <endEvent id="end"/> </process> - JAVA代码
// 部署流程 RepositoryService repositoryService = processEngine.getRepositoryService(); repositoryService.createDeployment() .addClasspathResource("leaveProcess.bpmn20.xml") .deploy(); // 启动流程 RuntimeService runtimeService = processEngine.getRuntimeService(); runtimeService.startProcessInstanceByKey("leaveProcess"); // 完成任务 TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().taskAssignee("employee").singleResult(); taskService.complete(task.getId());