【Activiti 进阶一】简单流程实例helloworld

     前两篇我们主要是对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是第一个节点张三的任务,点击完成以后,看我们的任务表,已经过度到了第二个节点,如图:


     我们只需要继续执行查看个人任务的方法,将其任务办理人修改成“李四”,执行,则会输出李四的相关信息,如图:


     依此类推,所以将整个流程完成,我们只需要这么几个方法即可。我们使用的无非就是一个一个节点串联起来,增加了点复杂的需求使其变得玲珑了许多,其实拨开雾霾,真的是雨过天晴,再回头看这个实例,真的有种作画,一气呵成的感觉。这或许就是工作流的一个目的所在吧!

posted on 2016-01-10 14:53  huohuoL  阅读(165)  评论(0编辑  收藏  举报

导航