一、简介
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有所帮助。