Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作
2017-08-02 14:00
519 查看
可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种:
Fatal error warn info debug trace一、部署流程定义
1,在工程项目下创建源码文件夹process
2,在该文件下下面新创建一个工作流流程定义文件test1.bpmn(NewàActivit Diagram)
3,在test1.bpmn文件定义请假流程或者是报销流程
4,测试代码
[java] view
plain copy
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文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。
二、查询流程定义
[java] view
plain copy
/**
* 查询流程定义列表
*/
@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的值以一定的形式变化
三、删除流程定义
[java] view
plain copy
/**
* 删除流程定义(通过删除部署信息达到删除流程定义的目的)
*删除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);
}
四、启动流程实例
什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系),比如:已经定义了一个请假流程,张三同学走了一次该流程这就是启动一次流程实例
[java] view
plain copy
/**根据流程定义的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());
}
五、查询流程实例列表
[java] <a target=_blank href="http://blog.csdn.net/xnf1991/article/details/52675396#" class="ViewSource" title="view plain" target="_blank" style=
相关文章推荐
- Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作
- Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作
- Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作
- Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作
- Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作
- JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成
- activiti学习-02环境准备+安装流程设计器+对流程设计器的使用+对流程设计器的使用+核心API的认识
- 学习Activiti工作流框架的API
- JAVAWEB开发之Hibernate详解(一)——Hibernate的框架概述、开发流程、CURD操作和核心配置与API以及Hibernate日志的使用
- JAVAWEB开发之Hibernate详解(一)——Hibernate的框架概述、开发流程、CURD操作和核心配置与API以及Hibernate日志的使用
- SpringMvc如何学习框架技术? 就像如上的图示一样,先掌握新技术的体系流程图。在快速弄明白程序执行流程后,在使用过程中 了解细节。
- Android 存储学习之SQLite数据库的基本操作 (使用API操作数据库)
- 达内学习日志Day50:使用SpringMVC完成登录操作
- 使用Hadoop提供的API操作HDFS
- 工作流学习——Activiti流程实例、任务管理四步曲
- 工作流Activiti的学习总结- 整合比较复杂的一个流程
- Senium 2.0 通过webdriver提供的api完成各种验证操作
- 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web
- 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-WinForm
- Android数据库LitePal框架学习笔记(1)---数据库的adb操作以及LitePal使用入门