activiti学习第二天
今天我们来发布一个流程,然后查看数据库中都发生了什么变化。
下面我们使用activiti designer设计一个流程。如图
流程很简单,我们先简单后增加难度。
创建流程图的顺序,新建一个文件夹(diagram)右键新建一个activiti diagram如图:
至于这个流程图怎么画,就不在这里详细的讲述了,如果你顺利的把activiti designer安装上,这个流程并不难画出来。其实这个流程图就是一个xml文件,遵循了bpmn协议。我们可以使用xml编辑器将他打开,查看里面的内容(这里我只截取了一段xml内容):
在生成这个xml的同时,activiti插件还可以给我们生成对应的bmp图片。做如下图设置
这时候我们的流程图必须发生变化并保存,才会生成这个图片。
我之前在流程图上面点击右键,也可以到处bmp图片,但当发布的时候就会报错。查看错误原因是因为图片过大,activiti应该是要将这个图片的字节数组保存到数据库中去,如果自己手动导出这个图片,会导致图片达到1M左右,插入数据的时候就会报错,而activiti插件生成的图片会很小,没有这个问题。
下面我们开始部署这两个资源文件。
@Test
public void deployProcess() throws SQLException, ClassNotFoundException{
String resource="activiti.cfg.xml";
ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine engine=configuration.buildProcessEngine();
RepositoryService repositoryService= engine.getRepositoryService();
String resourceName_bpmn="leave_bpmn";
String resourceName_bmp="leave_bmp";
InputStream inputStream_bpmn=this.getClass().getClassLoader().getResourceAsStream("MyProcess.bpmn");
InputStream inputStream_bmp=this.getClass().getClassLoader().getResourceAsStream("MyProcess.bmp");
DeploymentBuilder builder= repositoryService.createDeployment();
builder.addInputStream(resourceName_bpmn, inputStream_bpmn);
builder.addInputStream(resourceName_bmp, inputStream_bmp);
builder.name("test123");
builder.category("test321");
builder.tenantId("546");
builder.deploy();
}
运行一下上面的代码,接下来我们来看数据库,我们之前说过了,所有re有关的都是和资源有关的,部署资源主要向资源表中写了数据
首先我们看act_re_deployment,从表名上看,我们可以分析这个表示部署表,一次部署,插入一条数据
id肯定是标示字段,deploy_time是部署时间,而其他的字段都是在代码中写的,并不知道他们存在的意义,之后流程实例等查询也用不到。暂不考虑,可能是用来区分数据的吧。
我们再来看表act_re_procdef,从表名上看,我们可以分析出这个表示流程定义表,所有的流程都在这个表中做了声明
这个表中的字段有点多,但我们可以看字段和数据分析他们都代表什么
id,当然还是标示,但标示组成是有规律的,流程定义key+流程版本+随机(流水号)
rev是一个版本号,一般不使用,不考虑
name流程名称,这个其实是部署的xml资源里面定义的name
key是部署资源xml里面定义的id
version就是版本号,
deployment_id就是部署id,与上面的部署表的标示相关联
其他字段就不做介绍了,看字段名称及数据,都能猜个大概了。
这里需要说明的是部署表与流程定义表不是一对一的关系,一次部署可以部署多个流程定义,我们之前使用的activiti设计器,在一个xml中是可以定义多个流程的。
接下来我们看看act_ge_bytearray这个表,
这个表里面存储的应该是xml数据及图片数据,这就是我之前说的,如果图片过大,可能无法插入数据。这个表不用过多的去关注。
流程定义我们已经完成了,现在我们来完成流程的查询
@Test
public void processDefineQuery() throws SQLException, ClassNotFoundException{
String resource="activiti.cfg.xml";
ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine engine=configuration.buildProcessEngine();
RepositoryService repositoryService= engine.getRepositoryService();
ProcessDefinitionQuery definitionQuery= repositoryService.createProcessDefinitionQuery();
definitionQuery.processDefinitionKey("myProcess");
List<ProcessDefinition> list= definitionQuery.list();
if(list!=null){
for(ProcessDefinition definition :list){
System.out.println("流程定义Id:"+definition.getId());
System.out.println("流程定义key:"+definition.getKey());
System.out.println("流程定义资源名:"+definition.getResourceName());
System.out.println("流程定义版本:"+definition.getVersion());
System.out.println("流程定义部署Id:"+definition.getDeploymentId()); }
} }
查询api里面有很多方法,可以针对某个流程key查询,也可以设置其他条件,这里只做演示,不做过多的条件查询。
下面是执行结果
流程定义Id:myProcess:1:5
流程定义key:myProcess
流程定义资源名:leave_bpmn
流程定义版本:1
流程定义部署Id:1
下面进行删除操作,activiti对外暴露的删除最小颗粒度是部署,所以说如果在一次部署中,包含多个流程,这样就造成了多个流程均被删除。所以建议一次部署一个流程定义。
@Test
public void processDefineDelete() throws SQLException, ClassNotFoundException{
String resource="activiti.cfg.xml";
ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine engine=configuration.buildProcessEngine();
RepositoryService repositoryService= engine.getRepositoryService();
repositoryService.deleteDeployment("1");
}
删除api还有个级联删除,这个级联是指后期的流程实例,如果删除部署,启动的流程实例也将被删除,所以该操作需要慎重。但如果不使用级联删除,而又有流程实例存在,该api将会抛出异常。
activiti不支持流程定义的修改,如果修改只能通过先删除,然后在部署流程。
下面我们用activiti的接口来查询一下我们部署时使用的资源文件,也就是xml和bmp文件。
之前我提到了,activiti会将xml及图片的字节数组保存到数据库,以便以后使用。例如程序员可能需要在页面查看流程文件或用户需要查看流程图。
@Test
public void processDefineResource() throws SQLException, ClassNotFoundException, IOException{
String resource="activiti.cfg.xml";
ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource);
ProcessEngine engine=configuration.buildProcessEngine();
RepositoryService repositoryService= engine.getRepositoryService(); InputStream inputStream_bpmn= repositoryService.getResourceAsStream("1", "leave_bpmn");
InputStream inputStream_bmp= repositoryService.getResourceAsStream("1", "leave_bmp");
File bmpFile=new File("d:/"+"leave_bmp");
File bpmnFile=new File("d:/"+"leave_bpmn");
OutputStream outputStream_bmp=new FileOutputStream(bmpFile);
OutputStream outputStream_bpmn=new FileOutputStream(bpmnFile);
byte[] buffer=new byte[1024];
int length=-1;
while((length=inputStream_bmp.read(buffer, 0, buffer.length))>0){
outputStream_bmp.write(buffer, 0, length);
}
while((length=inputStream_bpmn.read(buffer, 0, buffer.length))>0){
outputStream_bpmn.write(buffer, 0, length);
} outputStream_bpmn.close();
outputStream_bmp.close();
inputStream_bmp.close();
inputStream_bpmn.close();
}
接下来可以到磁盘上看我们的资源了,如果磁盘上有图片和xml,那说明我们是可以通过activiti获取资源文件的。
activiti学习第二天的更多相关文章
- Activiti学习——Activiti与Spring集成
转: Activiti学习——Activiti与Spring集成 与Spring集成 基础准备 目录结构 相关jar包 Activiti的相关jar包 Activiti依赖的相关jar包 Spring ...
- activiti学习5:开启流程和流程前进
目录 activiti学习5:开启流程和流程前进 一.流程和任务的关系 二.开启流程 2.1根据流程定义key开启流程 三.查询用户任务 3.1 TaskQuery 四.完成任务 activiti学习 ...
- activiti学习笔记一
activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...
- 前端学习 第二弹: JavaScript中的一些函数与对象(1)
前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...
- 二、Android学习第二天——初识Activity(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 一. Android学习第二天——初识Activity 昨天程序搭建成功以 ...
- Activiti 学习笔记记录(2016-8-31)
上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件
- Activiti 学习笔记记录(二)
上一篇:Activiti 学习笔记记录 导读:对于工作流引擎的使用,我们都知道,需要一个业务事件,比如请假,它会去走一个流程(提交申请->领导审批---(批,不批)---->结束),Act ...
- activiti学习资料(架构描述)
Activiti学习资料 Activiti是业界很流行的java工作流引擎,关于Activiti与JBPM5的关系和如何选择不是本文要讨论的话题,相关内容可以baidu一下.Activiti从架构角度 ...
- python学习第二讲,pythonIDE介绍以及配置使用
目录 python学习第二讲,pythonIDE介绍以及配置使用 一丶集成开发环境IDE简介,以及配置 1.简介 2.PyCharm 介绍 3.pycharm 的安装 二丶IDE 开发Python,以 ...
随机推荐
- 【Git】git error记录之 "unpacking the sent packfile failed on the remote"
错误信息: error: cannot open .git/FETCH_HEAD: Permission denied unpacking the sent packfile failed on th ...
- 使用ByteArrayOutputStream解决IO乱码问题的踩坑记录
经过:今天在用s3接口做ceph储存的时候,要实现一个io下载的接口.需要把InputStream转成byte[],一开始,是的写法是这样的: byte[] buf = new byte[(int) ...
- VXLAN, 一种叠加在L3网络上的L2网络
这几天看了下RFC7348,顺便翻译了一下,根据自己理解做了注解 虚拟化及租户隔离 服务器虚拟化增加了对物理网络基础设施的需求,服务器有多个虚机,要求交换机支持更大的MAC地址表. 在数据中心场景下, ...
- codeforces 343d
题意:一棵树结构上有水,往一个节点加水,那么所有的子节点都会有水,或者排干一个节点的水,那么它的上面的节点都会没水. 用dfs序,数组记录区间内全部有水为1,区间内有没水的点就为0. 倒水:区间更新, ...
- 如何在linux下开启FTP服务
如何在linux下开启FTP服务 1. 首先服务器要安装ftp软件,查看是否已经安装ftp软件下: #which vsftpd 如果看到有vsftpd的目录说明服务器已经安装了ftp软件 2. ...
- koa和express对比
不同: 1.启动方式不同 koa采用了new Koa()的方式,而express采用传统的函数形式 2.中间件形式二者不一样,这是由二者处理中间件的逻辑差异导致的,实际上这也是二者最根本的差别 3.k ...
- IPFS初探
背景:听说IPFS=bittorrent+bitcoin+git+afs,有可能取代http,好像厉害的不行,所以要研究一下. 编译参考:https://github.com/ipfs/go-ipfs ...
- 蓝桥杯 每周一练 第一周(3n+1问题)
[问题描述] 考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2:如果 n 是奇数,把它乘 3 加1. 用新得到的值重复上述步骤,直到 n = 1 时停止.例如,n = 22 时 ...
- 禁用cookie后的方法
保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给 服务器.一般这个cookie的名字都是类似于SEEESIONID.但cookie可以被人为 ...
- Mysql 截取日期的方法
//显示年月日 select date_format(date ,'%Y-%m-%d' ) from talbe_a //根据年月日分组 select date_format(date ,'%Y-%m ...