`
AngelAndAngel
  • 浏览: 234802 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jbpm学习笔记(八) task活动讲解之任务分配,候选,自定义任务分配处理器

    博客分类:
  • jbpm
阅读更多
   本来是要写end活动的,感觉比较简单,就直接进入task活动。
    Task活动是一个重难点。
    定义:在jbpm中,task活动一般用来处理涉及人机交互的活动。我们可以使用task活动的assignee属性将一个任务分配给指定的用户。

  示例一:熟练一下基本功能
  对应的jpdl如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
	<start>
	<transition to="review"/>
	</start>
    <!-- EL表达式 "#{order.owner}"的值在这里表示分配者ID -->
    <task name="review" assignee="#{order.owner}">
      <transition to="wait" />
    </task>
    <state name="wait" />
</process>

  对应的order代码如下:
package org.test;

import java.io.Serializable;

public class Order implements Serializable{

	private String owner;
	
	public Order(){
	}
	
	public Order(String owner){
		this.owner=owner;
	}

	public String getOwner() {
		return owner;
	}

	public void setOwner(String owner) {
		this.owner = owner;
	}
	
}

注意:假如不实现Serializable的话,会给你报错。

测试代码如下:
package org.test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jbpm.api.ProcessInstance;
import org.jbpm.api.task.Task;
import org.jbpm.test.JbpmTestCase;

public class TestTask extends JbpmTestCase {

	String deploymentId;

	@Override
	public void setUp() throws Exception {
		super.setUp();
		deploymentId = repositoryService.createDeployment()
				.addResourceFromClasspath("org/test/task.jpdl.xml").deploy();
		System.out.println("启动成功");
	}

	@Override
	public void tearDown() throws Exception {
		repositoryService.deleteDeploymentCascade(deploymentId);
		super.tearDown();
		System.out.println("销毁成功");
	}

	public void testTask() {
		Map<String, Object> variables = new HashMap<String, Object>();

		// 用户ID为afei
		variables.put("order", new Order("afei"));
		ProcessInstance pi = executionService.startProcessInstanceByKey(
				"TaskAssignee", variables);
		List<Task> taskList=taskService.findPersonalTasks("afei");
		Task task=taskList.get(0);
		System.out.println("task.getActivityName()"+task.getActivityName());

	}

}


  Jbpm支持将任务分配给一组候选用户,组中的一个用户可以接受这个任务并完成它,这就是任务的候选者机制。Task活动的候选者属性有:candidate-groups和candidate-users。


示例二:用户组概念
对应的jpdl如下:
<?xml version="1.0" encoding="UTF-8"?>

<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
	<start>
		<transition to="review" />
	</start>
	<!-- 在这里用字符串应用了一个用户组:sales-dept -->
	<task name="review" candidate-groups="sales-dept">
		<transition to="wait" />
	</task>
	<state name="wait" />
</process>


   流程实例发起后,任务review会被创建。这个任务不会显示在任何人的个人任务列表中,因为还没有创建sales-dept组。因此下面获取的个人任务列表将是空(empty)的:
  taskService.getAssignedTasks(“afei”);
  taskService.getAssignedTasks(“angel”);
 

   但是此任务会显示在sales-dept组成员的分组任务列表,可以通过service Api的taskService.findGroupTasks获取。
接下来,我们就将afei和angel这两个用户创建并加入sales-dept住,这需要使用到IdentiryService服务:
ProcessInstance pi=executionService.startProcessInstanceByKey("TaskAssignee");
		// 首先创建sales-dept组
		String groupName = "sales-dept";
		identityService.createGroup(groupName);

		// 创建用户afei
		identityService.createUser("afei", "afei", "du", "664659008@qq.com");

		// 将afei加入sales-dept组
		identityService.createMembership("afei", groupName);

		// 创建用户angel
		identityService.createUser("angel", "angel", "peng", "295737589@qq.com");

		// 将angel加入sales-dept组
		identityService.createMembership("angel", groupName);

		/* 此时,在流程实例发起后,review任务就会出现在用户afei和angel的分组任务列表中,即一下代码的执行结果非空 */
		List<Task> afeiTasks = taskService.findGroupTasks("afei");
		List<Task> angelTasks = taskService.findGroupTasks("angel");
		
		System.out.println(afeiTasks.size());
		
		Task afeiTask = afeiTasks.get(0);

		// afei接受任务操作
		taskService.takeTask(afeiTask.getId(), "afei");
		assertNull(taskService.findGroupTasks("afei"));

   与candidate-groups属性类似的,candidate-users属性可以用来处理逗号分隔的系列用户ID,candidate-users属性可以和其他任务分配属性结合使用。
但是,如果我们需要在分配任务时加入一些复杂的业务逻辑计算呢。显示我们得找出另外的解决方案。“任务分配处理器”是个很不错的选择。
首先,得实现AssignmentHandler接口。

package org.test;

import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;

public class AssignTask implements AssignmentHandler {

	private String assignee;

	@Override
	public void assign(Assignable assignable, OpenExecution execution)
			throws Exception {
		assignable.setAssignee(assignee);
		System.out.println("assignee: "+assignee);
	}

}

Jpdl如下:

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

<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
	<start>
		<transition to="review" />
	</start>

	<task name="review">

		<!-- 在这里的类就是实现了AssignmentHandler接口的 -->
		<assignment-handler class="org.test.AssignTask">
			<!-- field元素为任务分配处理器的assignee域注入值。这种注入方式对于jbpm的用户代码都是通用的 -->
			<field name="assignee" >
				<string value="afei" />
			</field>
		</assignment-handler>

		<transition to="wait" />
	</task>
	<state name="wait" />
</process>

Ok,单元测试如下:

Map<String,Object> vals=new HashMap<String, Object>();
		vals.put("order",new Order("afei"));
		ProcessInstance pi = executionService
				.startProcessInstanceByKey("TaskAssignee",vals);

		// afei是通过jpdl定义注入的任务分配者
		List<Task> taskList = taskService.findPersonalTasks("afei");

		// 断言afei有一个任务
		assertEquals(1, taskList.size());

		Task task = taskList.get(0);

		// 断言任务名称如定义的 "review"
		assertEquals("review", task.getName());

		// 断言任务的分配者如预期
		assertEquals("afei", task.getAssignee());
当然   就像你看到的,AssignmentHandler提供的execution对象可以获得流程上下文和变量,可以结合其他任何API来计算出任务的分配者和候选者,单个用户和用户组。比如你可以这样做:
在启动流程实例时候,加一个参数:
  
Map<String,Object> vals=new HashMap<String, Object>();
   vals.put("order",new Order("angel"));
然后在你的任务分配处理器实现类中加入:
Order order=(Order)execution.getVariable("order");
assignable.setAssignee(order.getOwner());

就可以自动控制分配人了。

下一篇继续task活动其他内容!!!




分享到:
评论

相关推荐

    工作流引擎jbpm学习笔记

    工作流引擎jbpm学习笔记 jbpm是一个专业的工作流引擎,用于定义、管理和执行业务流程。它可以帮助我们简化工作流程的开发和维护,提高工作效率和可扩展性。 一、什么是公文流转? 公文流转是指公文在定义流转中的...

    JBPM采购申请系统——09_任务实例与任务分配.7z

    JBPM采购申请系统——09_任务实例与任务分配.7z JBPM采购申请系统——09_任务实例与任务分配.7z JBPM采购申请系统——09_任务实例与任务分配.7z JBPM采购申请系统——09_任务实例与任务分配.7z JBPM采购申请系统——...

    jbpm学习笔记.docx

    jbpm学习笔记主要涵盖了jbpm(Java Business Process Management)的多个方面,包括Signavio的使用和配置、jBPM数据库的安装、Graphical Process Designer(GPD)的安装以及jBPM在Eclipse环境中的配置。以下是这些...

    jbpm学习笔记体会很深刻

    学习如何启动流程实例、处理任务、以及如何通过监听器和事件机制来扩展流程行为,对于掌握jbpm的实际运用至关重要。此外,jbpm支持工作流的并发执行和分支,理解并行网关和 Exclusive Gateway 的工作原理能帮助我们...

    jbpm 4.4 学习笔记

    在本文档中,主要讨论的是jbpm 4.4 版本的学习笔记。作者通过实践学习并整理了关于jbpm的一些关键概念和操作。 首先,流程图是jbpm设计流程的核心,它包含了一系列的流程元素。在提到的订购流程中,主要包括以下...

    JBPM3学习笔记

    **JBPM3学习笔记** JBPM(Java Business Process Management)是一个开源的工作流管理系统,它提供了对业务流程的建模、部署、执行和监控的能力。在本文中,我们将深入探讨JBPM3的核心概念、功能和使用方法,以帮助...

    jbpm学习笔记jbpm学习笔记

    在本篇jbpm学习笔记中,我们将深入探讨如何安装jbpm插件,配置运行环境,发布流程定义以及查看流程定义。 首先,下载jbpm的最新版本可以从官方指定的源获取,例如在SourceForge上...

    jbpm实战讲解.pdf

    - Task活动涉及任务分配、候选人选择和自定义任务处理器,是工作流中任务管理的核心部分。 **1.9 泳道的概念** - 泳道用于区分流程中的不同角色或部门,这部分详细阐述了泳道的定义和作用,有助于优化流程设计。...

    jbpm任务分配管理.doc

    jbpm任务分配管理是BPM(业务流程管理)框架jbpm中的一个重要组成部分,它涉及到如何在流程执行过程中将任务分配给合适的参与者。jbpm是一个开源的Java库,用于建模、执行和管理业务流程,而任务分配是流程执行的...

    《jBPM学习笔记_框架设计简介》

    ### jBPM学习笔记_框架设计简介 #### JPDL与jBPM框架设计概述 jBPM(Java Business Process Model)是一种开源的工作流引擎,它提供了用于定义、执行和管理业务流程的功能。JPDL(jBPM Process Definition ...

    JBPM4.3 学习笔记

    【JBPM4.3 学习笔记】 JBPM(Java Business Process Management)是一个开源的工作流管理系统,主要用于设计、执行和管理业务流程。JBPM4.3是JBPM的一个重要版本,它提供了强大的流程建模、执行和服务集成能力,是...

    jbpm4.4学习笔记

    9.3.4task(任务活动) 31 9.3.5decision(判断活动) 31 9.3.6fork/join(分支/聚合活动) 31 9.4事件 31 10Transition 31 11state 32 11.1 定义 32 11.2signal方法 33 12task 34 12.1task的执行 34 12.2设置任务执行人 ...

    jBPM-jPDL学习笔记

    jPDL的XML元素包括但不限于:`&lt;process&gt;`(定义整个流程)、`&lt;start&gt;`(流程的起点)、`&lt;end&gt;`(流程的终点)、`&lt;task&gt;`(用户任务)、`&lt;action&gt;`(执行特定动作)、`&lt;sequenceFlow&gt;`(流程流转)和`&lt;decision&gt;`...

    吉林大学Java工作流JBPM学习笔记

    在本篇吉林大学的学习笔记中,我们将聚焦于JBPM,这是一个广泛使用的开源Java工作流管理系统,它提供了一整套工具和服务来支持流程的建模、部署和执行。 JBPM是Business Process Management(业务流程管理)的缩写...

    jbpm学习资料,jbpm教程

    本资料主要围绕jbpm的核心组件——jPDL进行讲解,帮助学习者深入理解jbpm的工作原理和应用。 jPDL(jBPM Process Definition Language)是jbpm使用的一种基于XML的语言,用于描述业务流程。它提供了一系列的元素和...

    JBPM4学习笔记

    【JBPM4学习笔记】 JBPM4是一款开源的工作流管理系统,它提供了强大的流程定义和执行能力,被广泛应用于企业的业务流程自动化。本学习笔记将深入探讨JBPM4的核心特性和使用方法,帮助读者掌握如何利用它来实现高效...

    jbpm-jpdl 学习笔记

    入门材料 jbpm-jpdl 学习笔记 jbpm-jpdl 学习笔记 jbpm-jpdl 学习笔记

    jbpm3.1.4经典学习教程

    jbpm3.1.4是其历史版本之一,虽然现在有更高级的版本,但对于学习工作流基础概念和原理,这个版本仍然具有很高的价值。 首先,我们要理解jbpm的核心概念。jbpm提供了流程定义的语言(BPMN,Business Process Model ...

    JBPM4学习笔记.doc

    **JBPM4学习笔记** JBPM(Java Business Process Management)是一个开源的工作流管理系统,它提供了业务流程建模、执行和监控的能力。JBPM4是该系统的一个重要版本,它引入了许多增强功能,使得开发者和业务分析师...

Global site tag (gtag.js) - Google Analytics