JBPM4学习总结之6——Task之任务

1.       Task之任务分配人(assignee

Task是一般来处理人机交互的活动,也是工作流中最为复杂的节点,许多元素还有子元素。我们先来看指派分配人。

流程图如下:
JBPM4学习总结之6——Task之任务
 流程定义XML如下:

<?xml version="1.0" encoding="UTF-8"?>

<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
	<start name="start1" g="137,21,48,48">
		<transition name="to task1" to="task1" g="-52,-22" />
	</start>
	<task name="task1" g="117,146,92,52" assignee="#{owner.name}">
		<transition name="to state1" to="state1" g="-56,-22" />
	</task>
	<state name="state1" g="121,280,92,52" />
</process>

 

通过流程变量#{owner.name}传入指派人的ID,当然owner类必须实现了序列化接口。

Owner类代码如下

package vo;

import java.io.Serializable;

public class AssigneeTaskVO implements Serializable {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

 测试代码如下:

AssigneeTaskVO assigneeTaskVO = new AssigneeTaskVO();

assigneeTaskVO.setName("liuyan");

Map<String, Object> map = new HashMap<String, Object>();

map.put("owner", assigneeTaskVO);

// 开始process流程
ProcessInstance processInstance = executionService
		.startProcessInstanceByKey("TaskAssignee", map);

// 流程实例的ID
String pid = processInstance.getId();

System.out.println(pid);// forkjoin.10001

List<Task> taskList = taskService.findPersonalTasks("liuyan");

for (Task task : taskList) {
	System.out.println(task.getAssignee());
}

 

2.       Task之任务分配人与分配组

利用Taskcandidate-groupscandidate-users可以指定分配组或者分配人。流程图雷同,我们来看xml定义如下:

<?xml version="1.0" encoding="UTF-8"?>

<process name="TaskGroup" xmlns="http://jbpm.org/4.4/jpdl">
	<start name="start1" g="160,39,48,48">
		<transition name="to task1" to="task1" g="-52,-22" />
	</start>
	<task name="task1" g="136,142,92,52" candidate-groups="tibco">
		<transition name="to state1" to="state1" g="-56,-22" />
	</task>
	<state name="state1" g="134,251,92,52" />
</process>

 

这里制定了一个组名叫做“tibco”。

下面来看测试代码:

/**
	 * 使用身份验证接口建立不同的用户、组、组成员
	 */
	public void test02CreateGroup() {
		identityService.createGroup("tibco");
		identityService.createGroup("vecinfo");

		identityService.createUser("liuyan", "liuyan", "素还真");
		identityService.createUser("fcl", "fcl", "风采铃");

		identityService.createMembership("liuyan", "tibco");
		identityService.createMembership("liuyan", "vecinfo");
		identityService.createMembership("fcl", "vecinfo");
	}

	/**
	 * 发起流程
	 */
	public void test03StartTask() {
		
		// 开始process流程
		ProcessInstance processInstance = executionService
				.startProcessInstanceByKey("TaskGroup");

		// 流程实例的ID
		String pid = processInstance.getId();

		System.out.println(pid);// forkjoin.10001
	}
	
	/**
	 * 获得指定人的任务列表
	 */
	public void test04GetAssigneeGroupTask() {
		List<Task> taskList1 = taskService.findPersonalTasks("liuyan");

		for (Task task : taskList1) {
			System.out.println(task.getAssignee());
		}
		
		List<Task> taskList2 = taskService.findPersonalTasks("fcl");

		for (Task task : taskList2) {
			System.out.println(task.getAssignee());
		}
		
		List<Task> taskList3 = taskService.findGroupTasks("liuyan");

		for (Task task : taskList3) {
			System.out.println(task.getId());//20002
		}
		
		List<Task> taskList4 = taskService.findGroupTasks("fcl");

		for (Task task : taskList4) {
			System.out.println(task.getId());
		}

	}
	
	/**
	 * 争抢获取任务
	 */
	public void test05ExeTask(){
		taskService.takeTask("20002", "liuyan");
		
	}
	
	/**
	 * 完成任务
	 */
	public void test06(){
		taskService.completeTask("20002");
	}

 test02CreateGroup()使用身份验证接口创建了组:tibcovecinfo,创建了用户:liuyanfcl,并且建立了人员与组织的关系。tibco只有liuyanvecinfoliuyanfcltest04GetAssigneeGroupTask()执行结果可以看到用户liuyantask,而fcl没有任何task。如果此时多个人都有task预备任务(把流程中的组名换成vecinfo)的时候,那么就是以争抢的方式来“夺取”该task来执行,谁先抢到,谁就可以执行任务,抢不到的人无法再争抢。

你可能感兴趣的:(xml,工作,jbpm,活动)