看到这个标题,我们首先得明确两个概念:
1、何为流程定义?
在我们创建Activiti的过程中,创建.pbmn文件是必不可少的,当创建完之后,点击保存,会生成一个.png文件。这两个合起来就是所谓的流程定义。
2、何为CRUD?
CRUD其实就是我们最常用的增删改查操作,全拼:Create,Read,Update,Delete。所以本篇则是和大家一起分享一下关于流程定义的增删改查操作。
// 获取流程引擎(核心对象),默认加载
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
为什么必不可少呢!通过转定义的方式一一点入,就会发现其实最终他也是要读取配置文件的,点击getDefaultProcessEngine转定义进入如图:
在点击init()进入,如图:
因为最终还是会读取到配置文件的,而且在Init()执行方法时会进行判断是否是初始化,如果是初始化,才会继续进行,否则直接读取则可。在一切准备就绪之后,我们来一一进行操作
一:Create(部署流程定义)
关于部署流程定义:本篇讲述两种方式,一种直接读取法,一种ZIP读取法
直接读取法:
// 完成部署流程定义
@Test
public void deploymentProcessDefinition() {
// 将其赋值给部署对象
Deployment deployment = processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
.createDeployment() // 创建部署对象
.name("helloworld演示") // 声明流程的名称
.addClasspathResource("diagrams/helloworld.bpmn") // 加载资源文件,一次只能加载一个文件
.addClasspathResource("diagrams/helloworld.png").deploy(); // 完成部署
// 输出显示
System.out.println("部署ID:" + deployment.getId()); // 输出部署的id
System.out.println("部署时间:" + deployment.getDeploymentTime()); // 输出部署的时间
}
zip读取法:
将.bpmn文件和.png文件放入文件,压缩然后再放入项目中
// 完成部署流程定义(zip)
@Test
public void deploymentProcessDefinition_zip() {
// 获取压缩文件
InputStream in = this.getClass().getClassLoader()
.getResourceAsStream("diagrams/helloworld.zip");
// 定义
ZipInputStream zipInputStream = new ZipInputStream(in);
// 将其赋值给部署对象
Deployment deployment = processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
.createDeployment() // 创建部署对象
.name("helloworld演示") // 声明流程的名称
.addZipInputStream(zipInputStream) // 使用zip方式部署
.deploy();
System.out.println("部署ID:" + deployment.getId()); // 输出部署的id
System.out.println("部署时间:" + deployment.getDeploymentTime()); // 输出部署的时间
}
二:Read(查看流程定义)
// 查询流程定义
@Test
public void findProcessDifinitionList() {
// 流程定义
List<ProcessDefinition> list = processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
.createProcessDefinitionQuery() // 创建查询
.processDefinitionKey("helloworld") // 按照流程定义的key值查询
// 排序
.orderByProcessDefinitionVersion().desc() // 按照流程版本排序
// 返回结果
.list();
// 对list集合进行判断
if (list != null && list.size() > 0) {
for (ProcessDefinition pd : list) {
System.out.println("流程定义的ID:" + pd.getId()); // 由流程定义的key+":"+版本+":"+生成的id,可以表示流程定义的唯一值
System.out.println("流程定义的名称:" + pd.getName()); // 对应helloworld.bpmn文件中name属性值
System.out.println("流程定义的key:" + pd.getKey()); // 对应helloworld.bpmn文件中id属性值,用来对应每个流程
System.out.println("流程定义的部署ID:" + pd.getDeploymentId());
System.out.println("流程定义的资源名称:" + pd.getResourceName());
System.out.println("流程定义的版本:" + pd.getVersion()); // 当流程定义的key相同的情况下,版本是升级的
System.out
.println("##########################################");
}
}
}
其实查询这可以根据流程定义ID,KEY模糊查询等,也可以根据多条件排序,各种类型输出等。三:Update(编辑流程定义)
对于工作流来说,流程定义的操作是没有编辑可言的,举例来说:
我们之前计划流程为三步,提交申请,经理审批,总经理审批三个节点,如图:
假设我现在的三个节点的流程基本信息为:
流程定义的ID:helloworld:1:101
流程定义的key:helloworld
流程定义的版本:1
但是后来又发觉有点太过于麻烦,所以总经理最后决定,以后这种请假的事情直接由经理来审批就行,所以我们最后的流程修改成了两步:
两个节点的流程基本信息为:
流程定义的ID:helloworld:2:101
流程定义的key:helloworld
流程定义的版本:2
通过数据库也能区分开了,每次不管是否流程更换,增添或者减少节点,都是一个流程定义的key重新部署的过程,每次启动流程实例,他都会按照最新版本启动,所以在流程定义这,并没有修改的过程,只有版本的定义。
四:Delete(删除流程定义)
// 删除流程定义
@Test
public void deleteProcessDifinition() {
String deploymentId = "301";
/**
* deleteDeployment(deploymentId) //使用部署ID删除流程定义
* 注意:删除流程部署到数据库,没有启动时,可以删除的。
*/
/*
* processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
* .deleteDeployment(deploymentId); // 使用部署ID删除流程定义
*//**
* deleteDeployment(deploymentId) //使用部署ID删除流程定义
* 注意:不管流程是否启动,都可以进行级联删除
*/
processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service
.deleteDeployment(deploymentId, true); // 使用部署ID删除流程定义,true表示级联删除
System.out.println("删除成功!");
}
删除流程定义,需要注意是否是级联查询,转定义deleteDeployment进去,就会发现,有一个布尔值的属性默认为false,如图:
默认是非级联查询的,所以如果想彻底的删除,不管流程启动与否,我们只需要在参数后加一个"true"则可。最后输出结果"删除成功",查询数据库,相关信息已经删除干净。
以上就是对于流程定义的CRUD操作进行简单的了解,所以的操作其实都是来源于基本操作,比如查询把最新版本信息,删除key相同的流程定义等,所以基础还是至关重要的。