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