Activiti入门案例
一、流程定义
Activiti-Designer 使用
Palette(画板)
在eclipse 或 idea 中安装activiti-designer 插件即可使用,画板中包括以下结点:
Connection—连接Event---事件Task---任务Gateway---网关Container—容器
Boundary event—边界事件Intermediate event- -中间事件
流程图设计完毕保存生成.bpmn 文件。
1、新建流程(IDEA 工具)
首先选中存放图形的目录(本次我们选择resources 下的bpmn 目录),点击菜单:New-BpmnFile,如下图所示:

2、创建hoilday.bpmn,绘制流程

3、生成流程图
①首先将.bpmn文件改为.xml文件

②然后右键该xml文件Diagrams--->show BPMN 2.0 Designer就能生成一张流程图,将流程图导出保存到项目对应目录即可

③然后将.xml改回.bpmn即可

注意:
流程图生成前须设置编码格式然后重启IDEA!!!
-Dfile.encoding=UTF-8

二、部署流程定义
部署流程定义就是要将上边绘制的图形即流程定义(.bpmn)部署在工作流引擎activiti中
1、使用ProcessEngine创建RepositoryService
package com.zn; import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test; public class ActivitiTest { /*流程部署
* `act_ge_bytearray` 流程定义的资源信息,包含bpmn和png流程文件信息
* `act_re_deployment` 流程部署信息 包含流程名称,ID,key等
* `act_re_procdef` 流程定义信息
* */
@Test
public void deployment(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象进行流程部署
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
Deployment deployment = repositoryService.createDeployment()
//加载流程文件
.addClasspathResource("bpmnFiles/holiday.bpmn")
.addClasspathResource("bpmnFiles/holiday.png")
//设置流程名称
.name("请假流程")
.key("holidayKey")
//部署
.deploy();
//输出部署信息
System.out.println("流程名称:"+deployment.getName());
System.out.println("流程ID:"+deployment.getId());
System.out.println("流程Key:"+deployment.getKey());
}
}
2、执行操作控制台效果

3、数据库展示
执行操作后activiti会将上边代码中执行的bpmn文件和图片文件保存在activiti数据库中;

三、启动一个流程实例
流程定义部署在activiti后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流程可以使用了;
针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于java类与java对象的关系,类定义好后需要new创建一个对象使用,当然可以new多个对象;对于请假申请流程,张三发起一个请假申请需要启动一个流程实例,请假申请单发起一个请假单也需要启动一个流程实例;
1、代码实现
package com.zn; import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test; public class ActivitiTest { /**
* 启动流程实例
* `act_hi_actinst` 已开始和执行完毕的活动信息
* `act_hi_identitylink` 历史参与者信息
* `act_hi_procinst` 流程实例信息
* `act_hi_taskinst` 历史任务实例
* act_ru_execution 任务执行信息
* act_ru_identitylink 当前任务参与者
* `act_ru_task` 任务信息
*
*/
@Test
public void startInstance(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取到RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//创建流程实例
ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday");
//输出实例信息
System.out.println("流程部署ID:"+holiday.getDeploymentId());
System.out.println("流程实例ID:"+holiday.getId());
System.out.println("活动ID:"+holiday.getActivityId());
}
}
2、执行操作控制台效果

3、数据库展示

四、任务查询
流程启动后,各个任务的负责人就可以查看自己当前需要处理的任务,查询出来的任务都是该用户的代办任务;
1、代码实现
package com.zn; import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.List; public class ActivitiTest { /**
* 查看代办任务
*/
@Test
public void getTask(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个TaskService对象
TaskService taskService=processEngine.getTaskService();
//查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执行者 processDefinitionKey:查询流程
/**
* taskCandidateOrAssigned匹配规则:1.Assigned 2.配置bpmn文件中定义的值
* taskAssignee匹配规则:1.Assigned
*/
//List<Task> list=taskService.createTaskQuery().taskCandidateOrAssigned("zhangsan").processDefinitionKey("holiday").list();
//taskAssignee查看当前指定人的指定任务
List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("holiday").list();
//分页:List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").listPage(i,j);
for (Task task:list){
System.out.println("任务名称:"+task.getName());
System.out.println("任务执行人:"+task.getAssignee());
System.out.println("任务ID:"+task.getId());
System.out.println("流程实例ID:"+task.getProcessInstanceId()); }
}
}
2、执行操作控制台效果

3、数据库

五、任务处理
任务负责人查询代办任务,选择任务进行处理,完成任务;
1、代码实现
package com.zn; import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.List; public class ActivitiTest { /*任务处理
* `act_hi_identitylink` 历史参与者信息
* `act_hi_taskinst` 历史任务信息
* `act_ru_execution` 任务执行信息
* `act_ru_task` 任务信息
* 当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看该信息
* */
@Test
public void completeTask(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个TaskService对象
TaskService taskService = processEngine.getTaskService();
//任务处理
taskService.complete("35005");
}
}
2、执行操作控制台效果

3、数据库展示

4、任务查询(经理审批)控制台效果

5、任务处理(经理审批)后数据库显示

6、任务查询(总经理审批)控制台效果

7、再次任务处理(总经理审批)后数据库显示
8、任务查询(人事审批)控制台效果

9、再次任务处理(人事审批)后数据库显示

10、至此流程结束
六、查看历史任务
1、代码实现
package com.zn; import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test; import java.util.List; public class ActivitiTest { /**
* 查看历史任务
*/
@Test
public void getHistory() {
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取HistoryService接口
HistoryService historyService = processEngine.getHistoryService();
//获取历史任务
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
//获取指定流程实例的任务
historicActivityInstanceQuery.processInstanceId("35001");
//获取任务列表
List<HistoricActivityInstance> list = historicActivityInstanceQuery.list();
for (HistoricActivityInstance ai : list) {
System.out.println("任务节点ID:"+ai.getActivityId());
System.out.println("任务节点名称:"+ai.getActivityName());
System.out.println("流程实例ID信息:"+ai.getProcessDefinitionId());
System.out.println("流程实例ID信息:"+ai.getProcessInstanceId());
System.out.println("==============================");
}
}
}
2、控制台效果

Activiti入门案例的更多相关文章
- SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)
SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...
- SpringMvc核心流程以及入门案例的搭建
1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...
- Struts2第一个入门案例
一.如何获取Struts2,以及Struts2资源包的目录结构的了解 Struts的官方地址为http://struts.apache.org 在他的主页当中,我们可以通过左侧的Apache ...
- MyBatis入门案例、增删改查
一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...
- Hibernate入门案例及增删改查
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
- Quartz应用实践入门案例二(基于java工程)
在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...
- Quartz应用实践入门案例一(基于Web环境)
Quartz是一个完全由java编写的开源作业调度框架,正是因为这个框架整合了许多额外的功能,所以在使用上就显得相当容易.只是需要简单的配置一下就能轻松的使用任务调度了.在Quartz中,真正执行的j ...
- MyBatis入门案例 增删改查
一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...
- Hibernate入门案例 增删改
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
随机推荐
- Angular总结
angular关键核心点进行总结 1 2 angular中有很多知识点需要学习,学习成本是很大的,我通过平常开发中把一些 很重要知识点总结下来,不管是以后拿来用,或者跳槽面试需要,我都感觉是很有帮助的 ...
- JavaScript 核心学习——继承
本篇博文讲述如何在 JavaScript 中实现继承,以及原型与原型链的知识,在附录中将会讲述 JavaScript 面向对象的常见错误. ##原型与原型链在 JavaScript 中,使用类将会付出 ...
- Spring Boot从入门到精通(五)多数据源配置实现及源码分析
多数据源配置在项目软件中是比较常见的开发需求,Spring和Spring Boot中对此都有相应的解决方案可供大家参考.在Spring Boot中,如MyBatis.JdbcTemplate以及Jpa ...
- jmap的使用以及内存溢出分析
一.jmap的使用以及内存溢出分析 前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容,如:内存使用情况的汇总.对内存溢出的定位与分析 1.查看内存使用情况 jma ...
- go语言指南之切片练习
题目: 实现 Pic.它应当返回一个长度为 dy 的切片,其中每个元素是一个长度为 dx,元素类型为 uint8 的切片.当你运行此程序时,它会将每个整数解释为灰度值(好吧,其实是蓝度值)并显示它所对 ...
- 【Django】接收照片,储存文件 前端代码
后端: from rest_framework.views import APIView from car import settings from django.shortcuts import r ...
- jdbc对 数据库的数据进行增删改(两个类)
1.方法类 package com.com; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Resu ...
- 对HTML语义化的一些理解和记录
什么是HTML语义化 说HTML语义化就要先说说HTML到底负责的什么?下面摘自维基百科: 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页 ...
- java线程组
1 简介 一个线程集合.是为了更方便地管理线程.父子结构的,一个线程组可以集成其他线程组,同时也可以拥有其他子线程组. 从结构上看,线程组是一个树形结构,每个线程都隶属于一个线程组,线程组又有父线程组 ...
- shell编程中星号(asterisk "*")的坑
今天分享一个有关shell编程中由通配符引起的问题. 1. 问题代码 cat test.logs 4567890 * ##*************************************## ...

