前两篇我们主要是对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集合
List<org.activiti.engine.task.Task> list = 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是第一个节点张三的任务,点击完成以后,看我们的任务表,已经过度到了第二个节点,如图:
我们只需要继续执行查看个人任务的方法,将其任务办理人修改成“李四”,执行,则会输出李四的相关信息,如图:
依此类推,所以将整个流程完成,我们只需要这么几个方法即可。我们使用的无非就是一个一个节点串联起来,增加了点复杂的需求使其变得玲珑了许多,其实拨开雾霾,真的是雨过天晴,再回头看这个实例,真的有种作画,一气呵成的感觉。这或许就是工作流的一个目的所在吧!