上面就是一个最简单从上往下执行的流程的执行步骤,本章节都是以代码做示例,代码不多,但是都执行一遍,你会对整个activiti的流程有个大概的了解
1,首先第一步要做的就是通过eclipse插件activiti-designer绘制一张最简单的流程图出来(在这里我们只用到了startEvent,endEvent,UserTask三个组件所以是比较简单的)
绘制的流程图如下
当我们点击创建采购单的时候,为这个节点定义一个id和名称(下面几个节点也是同样的道理)
点击左侧的mainConfig在Assingee输入一个名字,设置该流程这个步骤的处理人(当然在实际程序中会采用另外的动态获取的方式,这样只是方便理解一个整体过程)
接下来同样的道理依次为每个节点设置处理人
最后点击空白处,设置整个流程的id和名称
到这里点击保存后,会在相同的目录下生成purchasingflow.png,到这里简单的流程就绘制完成了
2,利用activiti的api将上面定义好的工作流bpmn文件和png文件上传到activiti的数据库
/* * 获取流程引擎对象,下面的方法会默认查找classpath目录下的名称为activi.cfg.xml * 里面bean的id为processEngineConfiguration的ProcessEngineConfiguration引擎配置对象来获取ProcessEngine对象 */ private ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); //部署一个流程 @Test public void deployProcessDefinition(){ //根据引擎获取资源service RepositoryService repositoryService = engine.getRepositoryService(); //部署bpmn文件 String bpmnName="purchasingflow.bpmn"; InputStream bpmnIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.bpmn"); //部署bpmn生成的图片 String pngName="purchasingflow.png"; InputStream pngIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.png"); //添加这两个文件进行部署 Deployment deployment = repositoryService.createDeployment() .addInputStream(bpmnName, bpmnIn) .addInputStream(pngName, pngIn) .deploy(); System.out.println("部署id:"+deployment.getId()); System.out.println("部署的name:"+deployment.getDeploymentTime()); }上面的简单的api就将采购流程的流程定义部署到我们的activiti的数据库,打开数据库act_re_procdef可以查询到我们刚才上传的流程定义
3,在启动一个流程实例之前我们再重复上传上面的流程定义,接着我们根据流程定义的id(purchasingflow)来查询这个流程定义看看会发生什么情况
//查询流程定义 @Test public void queryProcessDefinition(){ RepositoryService repositoryService = engine.getRepositoryService(); //创建流程定义查询对象 ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery(); String processDefinitionKey = "purchasingflow"; //设置流程定义的key的查询条件 definitionQuery.processDefinitionKey(processDefinitionKey); //查询所有的流程定义 List<ProcessDefinition> processDefinitionList = definitionQuery.list(); for(ProcessDefinition definition:processDefinitionList){ System.out.println("-------------------------"); System.out.println("流程定义id:"+definition.getId()); System.out.println("流程资源名:"+definition.getResourceName()); System.out.println("流程部署id:"+definition.getDeploymentId()); } }上面的结果输出了三条流程定义,并且部署的id不同和流程定义的id都不相同,带着这个疑问,我们在下面启动一个流程实例并详细讲解下
4,启动一个流程实例
//启动一个流程实例 @Test public void startProcessInstance(){ RuntimeService runtimeService = engine.getRuntimeService(); String processDefinitionKey = "purchasingflow"; //根据流程定义的key启动一个流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey); System.out.println("流程实例id:"+processInstance.getId()); System.out.println("流程定义id:"+processInstance.getProcessDefinitionId()); }我们发现上面打印的流程定义的id是我们最后一次上传的流程定义,所以我们得出结论,多次上传相同id的流程定义,根据流程定义启动流程实例,会取版本最新的流程定义
5,查询当前处理人的任务,我们之前在流程定义的时候写死第一个节点(也就是创建采购单这一步的处理人是zhangsan)
//查询当前用户的代办任务 @Test public void queryProcessInstance(){ //查询任务使用的service TaskService taskService = engine.getTaskService(); //获取任务查询对象 TaskQuery taskQuery = taskService.createTaskQuery(); taskQuery.taskAssignee("zhangsan"); //查询该条件下的所有的任务 List<Task> tasks =taskQuery.list(); for(Task task:tasks){ System.out.println("当前任务id:"+task.getId()); System.out.println("当前任务所属流程定义id:"+task.getProcessDefinitionId()); System.out.println("当前任务的key:"+task.getTaskDefinitionKey()); } }我们通过zhangsan查询到当前任务的id和所属流程定义id,大家会发现如果填写的不是zhangsan而是别的就会查询不到,因为我们指定的任务处理人是zhangsan
6,处理一个任务,到这里我们的zhangsan获取到这个任务后,需要处理完它
//完成一个流程 @Test public void completeProcessInstance(){ //任务的id,后期整合后会通过当前登录人身份查询到该用户的任务,然后获取到该id String taskId="402"; TaskService taskService = engine.getTaskService(); //根据任务id完成该任务 taskService.complete(taskId); }7,我们在通过lisi,也就是下一节点的处理人查询当前任务会发现查询到了一个任务,然后重复5,6,直到任务结束