一、什么是Activiti?
Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。说白了activiti是一个业务流程管理引擎,会沿着设计者设计好的流程,一步一步的执行下去,直到终点。
二、activiti配置讲解
- 使用idea开发,需要安装bpmn插件
- pom文件
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-model</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-converter</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-json-converter</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-layout</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti.cloud</groupId> <artifactId>activiti-cloud-services-api</artifactId> <version>7.0.0.Beta1</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency>
- activiti配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/> <property name="jdbcUsername" value="root"/> <property name="jdbcPassword" value="root"/> <property name="databaseSchemaUpdate" value="true"/> </bean> </beans>
- activiti所需的25张表
public static void main(String[] args) { // ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); // ProcessEngine processEngine = cfg.buildProcessEngine(); // System.out.println(processEngine); //创建方式二 采用默认配置,xml和bean的id processEngineConfiguration ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine(); System.out.println(defaultProcessEngine); }
ACT_RE_*: RE表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)
ACT_RU_*: RU表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_HI_*: HI表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: GE 表示 general。通用数据, 用于不同场景下。
- activiti提供的service介绍
RepositoryService activiti 的资源管理类
RuntimeService activiti 的流程运行管理类
TaskService activiti 的任务管理类
HistoryService activiti 的历史管理类
ManagerService activiti 的引擎管理类
三、流程图定义
- 流程定制
- 导出图片
导出图片之前需要先将idea的文件配置成utf-8,不然流程定义中的文字会出现乱码的情况
然后将创建的bpmn后缀名给为xml
如果没有提前修改idea配置文件为utf-8的话,这里会出现乱码
然后在将之前修改成xml的后缀名在修改成bpmn
四、单机演示Demo
1、流程定义到数据库中,此操作影响的表
public static void main(String[] args) { //创建ProcessEngine 对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //得到 RepositoryService对象 RepositoryService repositoryService = processEngine.getRepositoryService(); //开始部署 Deployment deployment = repositoryService.createDeployment() //添加资源 .addClasspathResource("bpmn/holiday.xml") .addClasspathResource("bpmn/holiday.png") .name("请假流程审批") .deploy(); System.out.println("流程部署id:" + deployment.getId()); System.out.println("流程部署名称:" + deployment.getName()); }
- 部署信息
- 流程定义的信息,唯一的key
- 定义的bpmn文件和png文件
2、启动流程实例,此操作影响的表
public static void main(String[] args) { //创建ProcessEngine 对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //得到 RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //创建流程实例 需要知道流程定义的key ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday"); System.out.println("流程部署ID "+holiday.getDeploymentId()); System.out.println("流程实例ID "+holiday.getId()); System.out.println("流程的Key "+holiday.getBusinessKey()); System.out.println("活动Id "+holiday.getActivityId()); }
- 已完成的活动信息
- 参与者信息
- 流程实例
- 任务实例
- 执行表
- 参与者信息
- 任务
3、查询任务
public static void main(String[] args) { //创建ProcessEngine 对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //根据流程定义的key和负责人查询当前用户的任务列表 List<Task> list = taskService.createTaskQuery() .processDefinitionKey("holiday") .taskAssignee("wanwu") .list(); for (Task task : list) { System.out.println("流程实例Id "+task.getProcessInstanceId()); System.out.println("任务Id "+task.getId()); System.out.println("负责人名称 "+task.getAssignee()); System.out.println("任务名称 "+task.getName()); } }
4、处理任务
public static void main(String[] args) { //创建ProcessEngine 对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象 TaskService taskService = processEngine.getTaskService(); //处理任务 任务ID2505,上面已经查询到的 taskService.complete("2505"); }
- 影响的表和启动实例的时候差不多
这个表只存储当前流程的下一个执行任务
5、流程定义的查询
public static void main(String[] args) { //创建ProcessEngine 对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //得到RepositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); //得到ProcessDefinitionQuery对象 可以认为是一个查询器 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); //设置流程定义的Key List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("holiday") //设置排序方式 默认是根据流程定义的版本号排序 .orderByProcessDefinitionVersion().desc() .list(); for (ProcessDefinition processDefinition : holiday) { System.out.println("流程定义的ID " +processDefinition.getId()); System.out.println("流程定义名称 " +processDefinition.getName()); System.out.println("流程定义Key " +processDefinition.getKey()); System.out.println("流程定义的版本号 " +processDefinition.getVersion()); System.out.println("流程部署的ID " +processDefinition.getDeploymentId()); } }
6、删除已部署的流程
public static void main(String[] args) { //创建ProcessEngine 对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //得到RepositoryService对象 RepositoryService repositoryService = processEngine.getRepositoryService(); //执行删除 参数是部署ID //repositoryService.deleteDeployment("2501"); //如果流程没有执行完成 删除时候回出错,如果强制删除也是可以的是级联删除 //级联删除 执行但为完成的也是可以删除的 true会先删除没有完成的流程节点,最后删除流程定义信息 repositoryService.deleteDeployment("2501",true); }
流程删除和流程部署影响的表一样的
7、流程定义资源查看
public static void main(String[] args) { //创建ProcessEngine 对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //得到HistoryService HistoryService historyService = processEngine.getHistoryService(); HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery(); //查询条件 historicActivityInstanceQuery.processInstanceId("5001"); //执行流程 List<HistoricActivityInstance> list = historicActivityInstanceQuery .orderByHistoricActivityInstanceStartTime().asc() .list(); for (HistoricActivityInstance historicActivityInstance : list) { System.out.println(historicActivityInstance.getActivityId()); System.out.println(historicActivityInstance.getActivityName()); System.out.println(historicActivityInstance.getProcessDefinitionId()); System.out.println(historicActivityInstance.getProcessInstanceId()); } }
8、使用压缩包部署Activiti
将流程图和bpmn文件压缩成zip格式的
public static void main(String[] args) { //创建ProcessEngine 对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //得到 RepositoryService对象 RepositoryService repositoryService = processEngine.getRepositoryService(); //转换ZipInputStream流对象 InputStream is = ActivitiZipDeployment.class.getClass().getClassLoader().getResourceAsStream("bpmn/holiday.zip"); ZipInputStream zipInputStream = new ZipInputStream(is); //开始部署 Deployment deployment = repositoryService.createDeployment() //添加资源 .addZipInputStream(zipInputStream) .name("请假流程审批Zip") .deploy(); System.out.println("流程部署id:" + deployment.getId()); System.out.println("流程部署名称:" + deployment.getName()); }
五、总结
没有多么厉害的东西,只是简单的activiti入门。具体的概念什么的也没有涉及到。主要是自己也在学习中。后面也会不断的学习,不断的总结吧