Java使用Activiti做流程示例

引言

Activiti是一个开源的、用于处理业务流程管理的工作流引擎。它是基于Java的,可以帮助开发者快速构建复杂的工作流应用。本文将介绍如何使用Java和Activiti来创建一个简单的流程示例,并提供相应的代码示例。

概述

在本示例中,我们将创建一个请假流程,包含开始节点、请假申请节点、审批节点、结束节点等。用户可以发起请假申请,经过审批后,流程将结束。我们将使用Activiti的Java API来定义和管理流程,以及对流程进行操作。

安装和配置

要使用Activiti,首先需要将其添加到项目的依赖中。在pom.xml文件中添加以下依赖项:

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-engine</artifactId>
    <version>7.1.0</version>
</dependency>

然后,我们需要配置Activiti引擎。可以在项目的配置文件中添加以下内容:

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
    <property name="dataSource" ref="dataSource" />
    <property name="databaseSchemaUpdate" value="true" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="jobExecutorActivate" value="false" />
</bean>

创建流程定义

首先,我们需要定义流程的各个节点和连接。可以通过编写一个BPMN 2.0流程定义文件来实现,也可以使用Activiti的API来动态创建流程定义。

在本示例中,我们使用API来创建流程定义。以下是一个简单的示例代码:

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;

public class ProcessDefinitionCreator {

    public static void main(String[] args) {
        // 创建流程引擎
        ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration()
                .buildProcessEngine();

        // 获取仓库服务
        RepositoryService repositoryService = processEngine.getRepositoryService();

        // 部署流程定义
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("leave-process.bpmn")
                .deploy();

        // 获取流程定义
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .deploymentId(deployment.getId())
                .singleResult();

        System.out.println("流程定义ID: " + processDefinition.getId());
        System.out.println("流程定义名称: " + processDefinition.getName());
    }
}

上述代码创建了一个简单的流程定义,并将其部署到Activiti引擎中。我们可以通过调用repositoryService.createProcessDefinitionQuery()方法来获取已部署的流程定义。

流程实例化和操作

在创建了流程定义后,我们可以使用Activiti的API来实例化流程,并对流程进行操作。以下是一个示例代码:

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

public class ProcessExecutionExample {

    public static void main(String[] args) {
        // 创建流程引擎
        ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration()
                .buildProcessEngine();

        // 获取运行时服务
        RuntimeService runtimeService = processEngine.getRuntimeService();

        // 启动流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess");

        // 获取待办任务
        Task task = processEngine.getTaskService().createTaskQuery()
                .processInstanceId(processInstance.getId())
                .singleResult();

        System.out.println("待办任务ID: " + task.getId());
        System.out.println("待办任务名称: " + task.getName());

        // 完成任务
        processEngine.getTaskService().complete(task.getId());

        System.out.println("流程实例已完成。");
    }
}

上述代码创建了一个流程实例,并获取了待办任务。我们可以通过调用processEngine.getTaskService().complete(task.getId())方法来完成任务。

状态图

下图是示例流程的状态图:

stateDiagram
    [*] --> Start
    Start --> ApplyLeave