上一篇我们介绍了activiti的基本概念,这一篇我们来讲述bpmn的构建以及如何部署、定义、完成一套流程。
流程图的绘画与配置
(1)绘画:这个和我们大学的时候,学的流程图有个相同点是,都有一个开始和一个结束。在resources建立diagrams文件夹,并新建个application.bpmn文件,开始的节点就点击start event ,结束的就点击end event,节点任务的话,就选择Task下面的userTask就可以了,连线的话,可以选择connection下面的SequenceFlow或者如下面图所示将鼠标放到节点任务上面,也是有线可以直接连下一个节点任务的。把每个节点用线连上,也就算完成了绘画
(2)配置
图虽然画好了,但是核心配置还是要配置的,点击节点任务。可以看到下面的properties里面的General,在这里Id我们可以不改了,name就是你这个节点对应的任务名称,Main config里面可以填写该节点任务的办理人,即谁来完成这个任务。在这里我就委屈下,由张三来完成了,同样的道理,领导审批的节点任务,我安排了李四来完成。
在配置完所有的节点任务,点击空白处,配置该流程的流程的key,也就是Id以及配上name的值。至此我们的配置也就完成了,最后点击ctrl+s保存后,会发现也生产了png文件。
流程的部署
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
public void deployment(){
Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
.createDeployment()//创建一个部署对象
.name("application-test")//添加部署的名称
.addClasspathResource("diagrams/application.bpmn")//从classpath的资源中加载,一次只能加载一个文件
.addClasspathResource("diagrams/application.png")
.addZipInputStream(zipInputStream)
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名称:"+deployment.getName());//test
}
测试结果
启动流程
@Test
public void startProcessInstance(){
//流程定义的key
String processDefinitionKey = "testActiviti";
ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应application.bpmn文件中id的属性值,使用key值启动,默认是按照最新 //版本的流程定义启动
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
}
测试结果
说明:我们可以看到产生的流程id,其实规则就是流程key:版本:随机数 ,这里的版本是当你只要部署并启动流程,那么版本就会+1
查询待办任务
经过上面的部署和启动,那么现在应该到了第一个节点环节的办理人张三,下面我们来看看如何查看自己的个人待办信息
@Test
public void findMyPersonalTask(){ String assignee = "张三"; List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service .createTaskQuery()//创建任务查询对象 .taskAssignee(assignee)//指定个人任务查询,指定办理人 .list();for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("执行对象ID:"+task.getExecutionId()); System.out.println("流程定义ID:"+task.getProcessDefinitionId()); } }
测试结果:由此可见,我们的流程目前为止算是启动成功的,已经到达张三这里了。
完成任务
到达张三这里之后,那么张三肯定要完成任务了
@Test
public void completeMyPersonalTask(){ //任务ID String taskId = "2204"; processEngine.getTaskService()//与正在执行的任务管理相关的Service .complete(taskId); System.out.println("完成任务:任务ID:"+taskId); }
测试结果:此时可以看到已经完成了任务,并且通过查看待办任务的方法查询李四时,发现任务已经到达李四这里了。
随后们再让李四执行完成任务,这里就不做演示了。
查看流程状态
最后李四完成任务后,我们来看看流程的运行状态,按道理来说,流程应该是已经结束的状态
@Test public void processState(){ ProcessInstance pi=processEngine.getRuntimeService() // 获取运行时Service .createProcessInstanceQuery() // 创建流程实例查询 .processInstanceId("2201") // 用流程实例ID查询 .singleResult(); if(pi!=null){ System.out.println("流程正在执行!"); }else{ System.out.println("流程已经执行结束!"); } }
测试结果
至此,我们就测试完了一套简单版的流程,从绘图-配置,到流程的部署、启动、完成的一个案例。通过上面的案例我们可以发现,有了工作流,帮助我们减少了不少代码的开发, 通过利用activiti的几个核心api就能帮助我们实现人员的任务办理。