博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(2)java程序走一遍工作流activiti
阅读量:6548 次
发布时间:2019-06-24

本文共 5079 字,大约阅读时间需要 16 分钟。

     工作流从流程定义到创建一个流程实例完成执行步骤
  1. 使用activi-designer创建一个流程定义(.bpmn结尾的文件)
  2. 将定义好的流程定义和生成的png图片通过RepositoryService(前面章节说过主要是用来处理流程定义的service)的api上传到数据库
  3. 通过RuntimeService(这个service主要是处理当前正在运行的流程实例的)启动一个流程实例
  4. 这个时候通过TaskService(主要处理当前运行的任务,一个流程实例下有多个任务)获取到上面的实例所对应的当前人任务
  5. 结束上面的任务task,流程实例会走向下一个task任务
  6. 重复4,5,完成一个流程实例的启动到结束

  上面就是一个最简单从上往下执行的流程的执行步骤,本章节都是以代码做示例,代码不多,但是都执行一遍,你会对整个activiti的流程有个大概的了解

  

  1,首先第一步要做的就是通过eclipse插件activiti-designer绘制一张最简单的流程图出来(在这里我们只用到了startEvent,endEvent,UserTask三个组件所以是比较简单的)

  

  

  绘制的流程图如下

  

  当我们点击创建采购单的时候,为这个节点定义一个id和名称(下面几个节点也是同样的道理)

  


 

  

  

  点击左侧的mainConfig在Assingee输入一个名字,设置该流程这个步骤的处理人(当然在实际程序中会采用另外的动态获取的方式,这样只是方便理解一个整体过程)

  接下来同样的道理依次为每个节点设置处理人

  


 

 

  最后点击空白处,设置整个流程的id和名称

  

   到这里点击保存后,会在相同的目录下生成purchasingflow.png,到这里简单的流程就绘制完成了

 

  2,利用activiti的api将上面定义好的工作流bpmn文件和png文件上传到activiti的数据库

1 /* 2      * 获取流程引擎对象,下面的方法会默认查找classpath目录下的名称为activi.cfg.xml 3      * 里面bean的id为processEngineConfiguration的ProcessEngineConfiguration引擎配置对象来获取ProcessEngine对象 4     */     5     private ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); 6      7     //部署一个流程 8     @Test 9     public void deployProcessDefinition(){10         //根据引擎获取资源service11         RepositoryService repositoryService =   engine.getRepositoryService();12         //部署bpmn文件13         String bpmnName="purchasingflow.bpmn";14         InputStream bpmnIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.bpmn");15         //部署bpmn生成的图片16         String pngName="purchasingflow.png";17         InputStream pngIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.png");18         //添加这两个文件进行部署19         Deployment deployment = repositoryService.createDeployment()20             .addInputStream(bpmnName, bpmnIn)21             .addInputStream(pngName, pngIn)22             .deploy();23         24         System.out.println("部署id:"+deployment.getId());25         System.out.println("部署的name:"+deployment.getDeploymentTime());26         27     }

  上面的简单的api就将采购流程的流程定义部署到我们的activiti的数据库,打开数据库act_re_procdef可以查询到我们刚才上传的流程定义

  

  3,在启动一个流程实例之前我们再重复上传上面的流程定义,接着我们根据流程定义的id(purchasingflow)来查询这个流程定义看看会发生什么情况 

1 //查询流程定义 2     @Test 3     public void queryProcessDefinition(){ 4          5         RepositoryService repositoryService =   engine.getRepositoryService(); 6         //创建流程定义查询对象 7         ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); 8          9         String processDefinitionKey = "purchasingflow";10         //设置流程定义的key的查询条件11         definitionQuery.processDefinitionKey(processDefinitionKey);12         //查询所有的流程定义13         List
processDefinitionList = definitionQuery.list();14 for(ProcessDefinition definition:processDefinitionList){15 System.out.println("-------------------------");16 System.out.println("流程定义id:"+definition.getId());17 System.out.println("流程资源名:"+definition.getResourceName());18 System.out.println("流程部署id:"+definition.getDeploymentId());19 }20 21 22 }

  上面的结果输出了三条流程定义,并且部署的id不同和流程定义的id都不相同,带着这个疑问,我们在下面启动一个流程实例并详细讲解下

  

  4,启动一个流程实例

1 //启动一个流程实例 2     @Test 3     public void startProcessInstance(){ 4          5         RuntimeService runtimeService = engine.getRuntimeService(); 6          7         String processDefinitionKey = "purchasingflow"; 8         //根据流程定义的key启动一个流程实例 9         ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);10         System.out.println("流程实例id:"+processInstance.getId());11         System.out.println("流程定义id:"+processInstance.getProcessDefinitionId());12         13         14     }

  我们发现上面打印的流程定义的id是我们最后一次上传的流程定义,所以我们得出结论,多次上传相同id的流程定义,根据流程定义启动流程实例,会取版本最新的流程定义

  

   5,查询当前处理人的任务,我们之前在流程定义的时候写死第一个节点(也就是创建采购单这一步的处理人是zhangsan)

1 //查询当前用户的代办任务 2     @Test 3     public void queryProcessInstance(){ 4          5         //查询任务使用的service 6         TaskService taskService = engine.getTaskService(); 7         //获取任务查询对象 8         TaskQuery taskQuery = taskService.createTaskQuery(); 9         taskQuery.taskAssignee("zhangsan");10         //查询该条件下的所有的任务11         List
tasks =taskQuery.list();12 for(Task task:tasks){13 System.out.println("当前任务id:"+task.getId());14 System.out.println("当前任务所属流程定义id:"+task.getProcessDefinitionId());15 System.out.println("当前任务的key:"+task.getTaskDefinitionKey());16 }17 18 }

  我们通过zhangsan查询到当前任务的id和所属流程定义id,大家会发现如果填写的不是zhangsan而是别的就会查询不到,因为我们指定的任务处理人是zhangsan

  

  6,处理一个任务,到这里我们的zhangsan获取到这个任务后,需要处理完它

1 //完成一个流程 2     @Test 3     public void completeProcessInstance(){ 4          5         //任务的id,后期整合后会通过当前登录人身份查询到该用户的任务,然后获取到该id 6         String taskId="402"; 7         TaskService taskService = engine.getTaskService(); 8         //根据任务id完成该任务 9         taskService.complete(taskId);10         11     }

  

  7,我们在通过lisi,也就是下一节点的处理人查询当前任务会发现查询到了一个任务,然后重复5,6,直到任务结束

  

  

  

  

  

  

  

  

 

转载于:https://www.cnblogs.com/nfcm/p/6379146.html

你可能感兴趣的文章
Eclipse的花括号(brace)的输入偏好问题
查看>>
工作记录
查看>>
HDOJ 1698
查看>>
linux里安装redis以及redis的安全设置
查看>>
Mysql Procudure
查看>>
作业第六次
查看>>
构建之法 第一章 概论
查看>>
Hadoop编译安装
查看>>
汇编字符串拷贝
查看>>
Lambda的前世今生
查看>>
TCP/IP模型简介和/etc/hosts文件说明
查看>>
UIButton常用属性
查看>>
主键自增归0
查看>>
mysql之 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
查看>>
如何批量修改文件后缀的方法
查看>>
Effective STL 笔记
查看>>
[LeetCode] 1. Two Sum
查看>>
POJ2538 ZOJ1884 UVA10082 WERTYU【输入输出】
查看>>
HDU5620 KK's Steel(C++语言版)
查看>>
旋转卡壳
查看>>