前两篇我们主要是对Activiti进行了一个基本的认识,以及对连接数据库进行了简单介绍,本篇我们着手于HelloWorld简单实例来浏览全程,体验一把。
首先我们必须着手 创建一个Activiti项目,然后画一个建议的流程图示,在项目diagrams上右击,New-Other,选择Activiti Diagram,如图:
一个简易的流程,但是正所谓麻雀虽小五脏俱全,所以一些必不可少的属性是不可避免的,我设置的每个节点的属性如下:
执行整个流程的过程其实很简单,部署流程-->启动流程-->个人任务查看,执行(循环)-->结束。整个执行的过程和流程引擎都是密切相关的,因为有了核心,才会有各种服务,下边看执行过程:
步骤一:获得流程引擎核心对象
// 获取流程引擎(核心对象) ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
步骤二:部署流程定义(RepositoryService——管理流程定义)
/** * 部署流程定义 */ @Test public void deploymentProcessDefinition() { // 将其赋值给部署对象 Deployment deployment = processEngine.getRepositoryService() // 获取流程定义和部署对象相关的service .createDeployment() // 创建部署对象 .addClasspathResource("diagrams/helloworld.bpmn") // 加载资源文件,一次只能加载一个文件 .addClasspathResource("diagrams/helloworld.png").deploy(); // 完成部署 System.out.println("部署ID:" + deployment.getId()); // 输出部署的id System.out.println("部署时间:" + deployment.getDeploymentTime()); // 输出部署的时间 }
创建一个部署对象,进行资源加载,然后部署,简单三步,一起合成,需要注意的是资源加载的路径不要弄错。
测试图示:
步骤三:启动流程实例(RuntimeService——执行管理,包括启动,推进,删除流程等操作)
/** * 启动流程实例 */ @Test public void startProcessInstance() { // 流程定义key指helloworld.pbmn中存在的ID String ProcessDefinitionKey = "helloworld"; // 赋值给流程实例的对象 ProcessInstance processInstance = processEngine.getRuntimeService() // 管理流程实例和执行对象,也就是表示正在执行的操作 .startProcessInstanceByKey(ProcessDefinitionKey); // 按照流程定义的key启动流程实例(优势:可以按照最新版本的流程启动实例) System.out.println("流程实例ID" + processInstance.getId()); System.out.println("流程实例ID" + processInstance.getProcessInstanceId()); }
部署完成之后,就要启动了,启动流程定义的的方式有很多,比如ID,Key值等,我们比较采纳使用Key来启动,因为它可以按照最新版本的流程启动流程实例。流程实例在整个流程过程中,不出意外情况,都是保持不变的,都是唯一的值。
测试图示:
步骤四:查询当前办理人任务(TaskService——任务管理)
/** * 查询当前办理人的个人任务 */ @Test public void findPersonTaskList() { // 任务办理人 String assignee = "张三"; // 将任务赋值于list集合 Listlist = processEngine .getTaskService() // 与任务相关的service(正在执行) .createTaskQuery() // 创建一个任务查询对象 .taskAssignee(assignee).list(); // 对list集合进行为空判断 if (list != null && list.size() > 0) { // 对list进行循环输出 for (org.activiti.engine.task.Task task : list) { System.out.println("任务ID:" + task.getId()); System.out.println("任务办理人:" + task.getAssignee()); System.out.println("任务名称" + task.getName()); System.out.println("任务创建时间:" + task.getCreateTime()); System.out.println("流程实例ID:" + task.getProcessInstanceId()); } } }
流程启动之后,我们就可以针对个人来查看其相关任务了,要注意这里只能是看到当前执行者的任务信息,其他的则已经成为了历史任务。若要查阅,需要调用历史服务(HistoryService——历史管理)去查阅。
测试图示:
步骤五:完成任务
/** * 完成任务 */ @Test public void completeTask(){ //任务ID String taskId="104"; processEngine.getTaskService() //与任务相关Service(正在执行) .complete(taskId); System.out.println("完成任务:"+taskId); }
任务查看只是一个查阅的功能,通过上一步的查阅我们获取自己的任务ID,然后根据任务ID进行执行,完成任务。
测试图示:
整个路程我们只用到了三个服务,定义+执行+任务等三个,这三个也是我们常用的三个服务。所以一个流程我们只需要简简单单的5部曲则完成了整个流程,肯定有人会问,哪里完成了?不是才完成了104一个任务吗?从上边我们的属性可以看到,104是第一个节点张三的任务,点击完成以后,看我们的任务表,已经过度到了第二个节点,如图:
我们只需要继续执行查看个人任务的方法,将其任务办理人修改成“李四”,执行,则会输出李四的相关信息,如图:
依此类推,所以将整个流程完成,我们只需要这么几个方法即可。我们使用的无非就是一个一个节点串联起来,增加了点复杂的需求使其变得玲珑了许多,其实拨开雾霾,真的是雨过天晴,再回头看这个实例,真的有种作画,一气呵成的感觉。这或许就是工作流的一个目的所在吧!