【Activiti 基础篇三】流程定义—CRUD操作

来源:互联网 发布:mysql手工注入 编辑:程序博客网 时间:2024/05/16 19:20

看到这个标题,我们首先得明确两个概念:

1、何为流程定义?

在我们创建Activiti的过程中,创建.pbmn文件是必不可少的,当创建完之后,点击保存,会生成一个.png文件。这两个合起来就是所谓的流程定义。

2、何为CRUD?

CRUD其实就是我们最常用的增删改查操作,全拼:CreateReadUpdateDelete。所以本篇则是和大家一起分享一下关于流程定义的增删改查操作。


  首先在操作的前提还是要明确对于获取流程引擎对象是必不可少的,定义如下:

// 获取流程引擎(核心对象),默认加载ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  为什么必不可少呢!通过转定义的方式一一点入,就会发现其实最终他也是要读取配置文件的,点击getDefaultProcessEngine转定义进入如图:

 在点击init()进入,如图:

  因为最终还是会读取到配置文件的,而且在Init()执行方法时会进行判断是否是初始化,如果是初始化,才会继续进行,否则直接读取则可。在一切准备就绪之后,我们来一一进行操作

一:Create(部署流程定义)

关于部署流程定义:本篇讲述两种方式,一种直接读取法,一种ZIP读取法

直接读取法:

// 完成部署流程定义@Testpublic 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()); // 输出部署的idSystem.out.println("部署时间:" + deployment.getDeploymentTime()); // 输出部署的时间}

zip读取法:

 将.bpmn文件和.png文件放入文件,压缩然后再放入项目中

// 完成部署流程定义(zip)@Testpublic 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()); // 输出部署的idSystem.out.println("部署时间:" + deployment.getDeploymentTime()); // 输出部署的时间}

二:Read(查看流程定义)

// 查询流程定义@Testpublic 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(删除流程定义)

// 删除流程定义@Testpublic 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相同的流程定义等,所以基础还是至关重要的。

1 0