您的位置:

全面介绍工作流引擎activiti

一、简介

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有所帮助。