Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作
可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种:
Fatal error warn info debug trace
一、部署流程定义
1,在工程项目下创建源码文件夹process
2,在该文件下下面新创建一个工作流流程定义文件test1.bpmn(NewàActivit Diagram)
3,在test1.bpmn文件定义请假流程或者是报销流程
4,测试代码
- public class ActivitiAPI {
 - //首先获得默认的流程引擎,在创建时会自动加载classpath下得activiti.cfg.xml或者是activiti-context.xml
 - ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
 - /**
 - * 1.部署流程定义
 - * 会在三张表中产生数据:
 - * act_ge_bytearray 产生两条数据
 - *act_re_deployment 产生一条数据
 - *act_re_procdef 产生一条数据
 - * 方式一:读取单个的流程定义文件
 - * 方式二:读取zip压缩文件
 - */
 - @Test
 - public void deploy() {
 - // 获取仓库服务并创建发布配置对象
 - DeploymentBuilder deploymentBuilder = processEngine
 - .getRepositoryService().createDeployment();
 - // 方式一:设置发布信息
 - deploymentBuilder.name("请假流程部署");//添加部署规则的名称
 - // 读取单个的流程定义文件
 - deploymentBuilder.addClasspathResource("test1.bpmn");
 - // 添加规则图片 不添加会自动产生一个图片不推荐
 - deploymentBuilder.addClasspathResource("test1.png");
 - Deployment
 - deployment =deploymentBuilder.deploy();
 - // 方式二:读取zip压缩文件
 - /*ZipInputStream zipInputStream = new ZipInputStream(this.getClass()
 - .getClassLoader().getResourceAsStream("process.zip"));
 - deploymentBuilder.addZipInputStream(zipInputStream);
 - Deployment deployment =deploymentBuilder.deploy();*/
 - }
 - }
 
部署流程定义步骤:
1) 首先获得默认的流程引擎getDefaultProcessEngine(),在创建时会自动加载classpath下得activiti-context.xml或者是activiti.cfg.xml
2) 通过流程引擎获取了一个RepositoryService对象也就是仓库服务对象
3) 由仓库的服务对象创建一个部署对象配置对象,用来封装部署环境的相关配置。
4) 这是一个链式编程,在部署配置对象中设置显示名,上传规则文件相对classpath的地址。
5) 部署,也是往数据库中存储流程定义的过程。
6) 这一步在数据库中将操作三张表:
a) act_re_deployment
存放流程定义的显示名和部署时间,每部署一次增加一条记录
b) act_re_procdef
存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
c) act_ge_bytearray
存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。
二、查询流程定义
- /**
 - * 查询流程定义列表
 - */
 - @Test
 - public void queryProcessDefinition(){
 - // 流程定义查询对象,用于查询表act_re_procdef,添加条件查询
 - ProcessDefinitionQuery query = processEngine.getRepositoryService()
 - .createProcessDefinitionQuery();
 - // 添加过滤条件
 - query.processDefinitionKey("bxlc");
 - // 添加排序条件降序排序
 - query.orderByProcessDefinitionVersion().desc();
 - // 添加分页查询
 - query.listPage(0, 10);
 - List<ProcessDefinition> list =query.list();
 - for(ProcessDefinition pd : list) {
 - System.out.println(pd.getName()+ "" + pd.getId());
 - }
 - }
 
流程定义查询步骤:
1) 因为流程定义的信息存放在仓库中,所以应该获取RepositoryService。
2) 创建流程定义查询对象,可以在ProcessDefinitionQuery上设置查询过滤参数
3) 调用ProcessDefinitionQuery对象的list方法,执行查询,获得符合条件的流程定义列表
4) 由运行结果可以看出:
a) Key和Name的值为:bpmn文件process节点的id和name的属性值
b) key属性被用来区别不同的流程定义。
c) 带有特定key的流程定义第一次部署时,version为1。之后每次部署都会在当前最高版本号上加1
d) Id的值的生成规则为:{processDefinitionKey}:{processDefinitionVersion}:{generated-id},这里的generated-id是一个自动生成的唯一的数字
e) 重复部署一次,deploymentId的值以一定的形式变化
三、删除流程定义
- /**
 - * 删除流程定义(通过删除部署信息达到删除流程定义的目的)
 - *删除act_re_procdef和act_re_deployment表中的一条记录
 - */
 - @Test
 - public void delDeployment() throwsException {
 - // 获取仓库服务对象
 - RepositoryService repositoryService =processEngine.getRepositoryService();
 - // 删除发布信息
 - String deploymentId = "1";
 - // 普通删除,如果当前规则下有正在执行的流程,则抛异常
 - repositoryService.deleteDeployment(deploymentId);
 - // 级联删除,会删除和当前规则相关的所有信息,包括历史
 - repositoryService.deleteDeployment(deploymentId, true);
 - }
 
四、启动流程实例
什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系),比如:已经定义了一个请假流程,张三同学走了一次该流程这就是启动一次流程实例
- /**根据流程定义的id启动一个流程实例,这个流程定义的Id来自act_re_procdef
 - * 启动一次流程实例act_ru_execution表增加一条数据
 - */
 - @Test
 - public void startProcessInstance() {
 - //获取流程定义ID
 - /*
 - *String processDefinitionId = "qjlc:9:1204"; ProcessInstance
 - *processInstance =
 - *processEngine.getRuntimeService().startProcessInstanceById
 - * (processDefinitionId );System.out.println(processInstance.getId());
 - */
 - //自动选择最新版本的流程定义启动流程实例建议使用key来启动
 - String processDefinitionKey = "qjlc";
 - ProcessInstance processInstance = processEngine.getRuntimeService()
 - .startProcessInstanceByKey(processDefinitionKey);
 - System.out.println(processInstance.getId());
 - }
 
五、查询流程实例列表
- /**
 - * 查询流程实例列表,查询act_ru_execution表
 - */
 - @Test
 - public void queryProcessInstance(){
 - //流程实例查询对象,查询act_ru_execution表
 - ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
 - query.processDefinitionKey("qjlc");
 - query.orderByProcessInstanceId().desc();
 - query.listPage(0, 2);
 - List<ProcessInstance> list =query.list();
 - for(ProcessInstance pi : list) {
 - System.out.println(pi.getId()+ " " + pi.getActivityId());
 - }
 - }
 
六、结束流程实例
- /**
 - * 结束流程实例,操作的表
 - * 执行表:act_ru_execution(删除一条数据)
 - * 任务表 act_ru_task(删除一条数据)
 - */
 - @Test
 - public void deleteProcessInstance(){
 - String processInstanceId = "1601";
 - processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "我愿意");
 - }
 
七、查询部署信息
- /**
 - * 查询部署列表(同一个流程定义因为修改会进行多次的部署,版本号不一样version会增加,每次部署act_re_deployment表增加一条记录)
 - */
 - @Test
 - public void queryDeployment() {
 - // 部署查询对象,查询表act_re_deployment
 - DeploymentQuery query = processEngine.getRepositoryService()
 - .createDeploymentQuery();
 - List<Deployment> list =query.list();
 - for (Deploymentdeployment : list) {
 - String id = deployment.getId();
 - System.out.println(id);
 - }
 - }
 
八、删除部署信息
- /**
 - * 删除部署信息,删除act_re_procdef和act_re_deployment表中的一条记录
 - */
 - @Test
 - public void deleteDeployment() {
 - String deploymentId = "101";
 - // processEngine.getRepositoryService().deleteDeployment(deploymentId);
 - //true代表删除级联关联表信息
 - processEngine.getRepositoryService().deleteDeployment(deploymentId,
 - true);
 - }
 
九、查询一次流程部署对应的文件名称(bpmn,png)和输入流
- /**
 - * 查询一次部署对应的流程定义文件名称和对应的输入流(bpmn,png)
 - * @throws Exception
 - */
 - @Test
 - public void queryProcessFile() throws Exception {
 - String deploymentId = "101";
 - List<String> names = processEngine.getRepositoryService()
 - .getDeploymentResourceNames(deploymentId);
 - for (String name :names) {
 - System.out.println(name);
 - InputStream in = processEngine.getRepositoryService()
 - .getResourceAsStream(deploymentId,name);
 - // 将文件保存到本地磁盘
 - /*
 - * OutputStream out = new FileOutputStream(newFile("d:\\" + name));
 - * byte[] b = new byte[1024]; int len= 0; while((len =
 - * in.read(b))!=-1) { out.write(b, 0, len);} out.close();
 - */
 - //使用org.apache.commons.io.FileUtils的工具类
 - FileUtils.copyInputStreamToFile(in,new File("d:\\" + name));
 - in.close();
 - }
 - }
 
十、获取流程定义图标(png文件)
- /**
 - * 获得png文件的输入流
 - *
 - * @throws Exception
 - */
 - @Test
 - public void getPng() throws Exception {
 - String processDefinitionId = "qjlc:9:1204";
 - InputStream pngInputStream = processEngine.getRepositoryService()
 - .getProcessDiagram(processDefinitionId);
 - FileUtils.copyInputStreamToFile(pngInputStream,new File("d:\\my.png"));
 - }
 
十一、 查询个人任务列表
- /**
 - * 查询任务列表查询act_ru_task表
 - */
 - @Test
 - public void queryTask() {
 - TaskQuery query= processEngine.getTaskService().createTaskQuery();
 - String assignee = "张三";
 - query.taskAssignee(assignee);
 - query.orderByTaskCreateTime().desc();
 - List<Task> list = query.list();
 - for (Task task :list) {
 - System.out.println(task.getId()+ " " + task.getName());
 - }
 - }
 
十二、 办理任务
- /**
 - * 办理任务
 - */
 - @Test
 - public void completeTask(){
 - String taskId= "404";
 - processEngine.getTaskService().complete(taskId);
 - }
 
十三、 直接将流程想下执行一步管理员用户拥有该权限
- /**
 - * 直接将流程向下执行一步act_ru_task表增加一条数据,直接跳过一步
 - */
 - @Test
 - public void signal(){
 - String executionId = "2701";//流程实例id
 - processEngine.getRuntimeService().signal(executionId);
 - }
 
Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作的更多相关文章
- Activiti工作流框架学习笔记(二)之springboot2.0整合工作流Activiti6.0
		
以前在工作当中做过不少与工作流Activiti有关的工作,当时都是spring集成activiti5.22的项目,现在回过头去看,其实版本已经稍微老了,因此,基于先前的工作经验,决定用较新版本的技术来 ...
 - Activiti工作流框架学习(一)——环境的搭建和数据表的了解
		
一.什么是工作流 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现 ...
 - Activiti工作流框架学习(一)之通用数据表详细介绍
		
文/朱季谦 Activiti工作流引擎自带了一套数据库表,这里面有一个需要注意的地方: 低于5.6.4的MySQL版本不支持时间戳或毫秒级的日期.更糟糕的是,某些版本在尝试创建此类列时将引发异常,而其 ...
 - activiti工作流引擎学习(二)
		
1.连线 如果bpmn文件和java文件放在同一目录下,需要配置buildPath: 使用流程变量,设置连线需要的流程变量的名称,并设置流程变量的值,流程会按照指定的连线完成任务. 1.1一个活动中可 ...
 - activiti工作流入门学习
		
工作流一般在OA系统用的比较多,当然,只要有流程审批的地方都会用到,activiti只是开源的工作流中比较流行的一个,还有其他的开源的工作流,这里学习activiti工作流:前面部分是关于activi ...
 - 项目结合activiti工作流框架使用
		
项目结合activiti工作流框架使用: 1.项目与工作流框架的结合. 2.状态:草稿(待审批).审批中.审批通过.审批失败 3. 提交审批: 0 草稿(待审批),记录绑定工作流执行id,审批状态设置 ...
 - Struts2框架学习(二) Action
		
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
 - activiti工作流框架简介
		
常见的工作流框架:activiti, JBPM, OSWorkflow activiti框架基于23张基础的表数据, 基于Mybatis操作数据库. JBPM框架基于18张基础的表数据, 基于hibe ...
 - Activiti工作流框架——快速上手
		
一.前言 最近在做公司的OA,里面有用到工作流,公司用的是 jbpm4,感觉比较老,资料有点少,就先学学 新一点的 activiti ㄟ(▔▽▔)ㄏ 首先工作流的概念是:工作流(Workfl ...
 
随机推荐
- 1、初始JAVA
			
一. 语言的翻译分两种: 编译型语言:例如c语言.c++语言 优点:速度快 缺点:不能跨平台 编译器编译——>特定平台的目标文件obj——>特定平台 ...
 - bzoj4873: [Shoi2017]寿司餐厅(最大权闭合子图)
			
4873: [Shoi2017]寿司餐厅 大难题啊啊!!! 题目:传送门 题解:一眼题是网络流,但还是不会OTZ,菜啊... %题解... 最大权闭合子图!!! 好的...开始花式建边: 1.对于每个 ...
 - zzulioj--1824--BOOM(模拟水)
			
1824: BOOM Time Limit: 1 Sec Memory Limit: 128 MB Submit: 25 Solved: 5 SubmitStatusWeb Board Descr ...
 - OpenGL编程逐步深入(八)伸缩变换
			
准备知识 伸缩变换非常简单,它的目的是增大或者缩小对象的尺寸.例如:你可能希望用同一个模型创建不同大小的对象(例如形状相同,但大小不同的树木)或者你想改变对象的大小使它和游戏场景匹配.这些例子中你可能 ...
 - Android项目实战(五十五):部分机型点击home再点图标进入程序不保留再之前界面的问题
			
解决办法: 1.在基类Activity中 添加方法 @Override public boolean moveTaskToBack(boolean nonRoot) { return super.mo ...
 - js文字的无缝滚动(上下)
			
使用scrolltop值的递增配合setInterval与setTimeout实现相关效果,左右无缝滚动使用scrollLeft即可 Dom内容 <div id="container& ...
 - session 存入 memcahce
			
<?php header('content-type:text/html;charset=utf-8'); class RedisSessionHandler{ public $ttl; //失 ...
 - 守护、互斥锁、IPC和生产者消费者模型
			
守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are ...
 - Win 7系统倒计时!
			
3月25日消息,近日微软已经开始通知当前正在使用Windows 7的用户,该操作系统“接近尾声”.微软表示计划在2020年1月14日终止对Windows 7的所有支持.但结束Windows 7似乎并不 ...
 - 【习题 8-17 UVA - 11536】Smallest Sub-Array
			
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法. 考虑一个1..i的窗口. 里面在到达了i位置的时候恰好有1..k这些数字了. 为了更接近答案. 显然可以试着让左端点变成2 ...