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

[JBPM3.2]Swimlane方式的任务分配

阅读更多
    JBPM3的任务分配方式主要由以下几种:
(1)直接设置actor-id属性,既可以设置固定的任务处理人,如actor-id='dinguangx'(这种情况在实际开发中极少用到的吧);也可以从流程变量中取出任务处理人,如actor-id="#{actorid}".
(2)通过TaskInstance实例直接调用API方法设置,如ti.setActor("dinguangx");;
(3)通过AssignmentHandler在任务创建的时候分配任务;这是最为常用的一种方式,也是最灵活的一种任务分配方式,可以在任务分配的时候做一些其他的操作;
(4)通过Swimlane的方式分配任务.通过第(3)种方式来分配任务时,虽然灵活,但是如果要将多个任务分配给同一个处理人时我们不得不编写多个handler类,造成java类的过度膨胀;这时候就可以通过Swimlane的方式来分配任务,多个相同处理人的Task结点只引用定义好的Swimlane就可以完成任务分配。
    这里主要来分析一下使用Swimlane来实现任务分配的过程。
    TaskInstance类中的assign(ExecutionContext)方法实现了任务的分配,下面的这段代码取自于TaskInstance类的源码.
public void assign(ExecutionContext executionContext) {
    TaskMgmtInstance taskMgmtInstance = executionContext.getTaskMgmtInstance();
    
    Swimlane swimlane = task.getSwimlane();
    // if this task is in a swimlane
    if (swimlane!=null) {
      
      // if this is a task assignment for a start-state
      if (isStartTaskInstance()) {
        // initialize the swimlane
        swimlaneInstance = new SwimlaneInstance(swimlane);
        taskMgmtInstance.addSwimlaneInstance(swimlaneInstance);
        // with the current authenticated actor
        swimlaneInstance.setActorId(SecurityHelper.getAuthenticatedActorId());
        
      } else {
        
        // lazy initialize the swimlane...
        // get the swimlane instance (if there is any) 
        swimlaneInstance = taskMgmtInstance.getInitializedSwimlaneInstance(executionContext, swimlane);
        
        // copy the swimlaneInstance assignment into the taskInstance assignment
        copySwimlaneInstanceAssignment(swimlaneInstance);
      }

    } else { // this task is not in a swimlane
      taskMgmtInstance.performAssignment(task.getAssignmentDelegation(), 
                                         task.getActorIdExpression(),
                                         task.getPooledActorsExpression(),
                                         this, 
                                         executionContext);
    }
    
    updatePooledActorsReferences(swimlaneInstance);
  }

    我们假设当前任务不是位于Start-state中,并且使用Swimlane的任务分配方式,即task.getSwimlane()不为空,且isStartTaskInstance()为false的情况。
    此时,代码将执行到
 swimlaneInstance = taskMgmtInstance.getInitializedSwimlaneInstance(executionContext, swimlane);

    再来看一下getInitializedSwimlaneInstance(ExecutionContext)方法执行的是什么工作:
public SwimlaneInstance getInitializedSwimlaneInstance(ExecutionContext executionContext, Swimlane swimlane) {
    // initialize the swimlane
    if (swimlaneInstances==null) swimlaneInstances = new HashMap();
    SwimlaneInstance swimlaneInstance = (SwimlaneInstance) swimlaneInstances.get(swimlane.getName());
    if (swimlaneInstance==null) {
      swimlaneInstance = new SwimlaneInstance(swimlane);
      addSwimlaneInstance(swimlaneInstance);
      // assign the swimlaneInstance
      performAssignment(swimlane.getAssignmentDelegation(), 
                        swimlane.getActorIdExpression(),
                        swimlane.getPooledActorsExpression(),
                        swimlaneInstance, 
                        executionContext);
    }

    return swimlaneInstance;
  }

    这个方法位于TaskMgmtInstance类中,而一个流程实例只对应一个TaskMgmtInstance实例,所以taskMgmtInstance实例中的swimlaneInstances将会包括流程实例中创建过的所有Swimlane实例。所以在getInitializedSwimlaneInstance方法执行时,如果任务是第一次被创建,将会根据设置的Swimlane创建一个新的SwimlaneInstance实例;否则就会在数据库中查询之前创建好的TaskInstance记录映射成TaskInstance对象返回给上一级调用过程。
再返回到assign()方法,紧跟着的处理代码是
copySwimlaneInstanceAssignment(swimlaneInstance);

    下面是copySwimlaneInstanceAssignment方法的代码:
public void copySwimlaneInstanceAssignment(SwimlaneInstance swimlaneInstance) {
    setSwimlaneInstance(swimlaneInstance);
    setActorId(swimlaneInstance.getActorId());
    setPooledActors(swimlaneInstance.getPooledActors());
  }
很容易理解,就是将SwimlaneInstance中的actorId,pooledActors分配给当前任务。
    注意到这里就存在一个问题,如果Task结点相应的任务不是第一次被创建,就不会再调用Swimlane的AssignmentHandler类来创建SwimlaneInstance。换句话说,Swimlane的AssignmentHandler类将只会被调用一次,而不是被多次调用,所以当流程用到Swimlane时(比如流程被审核退回再次提交审核时,审核结点就被多次执行到),AssignmentHandler类只执行一次,我们就不能在Swimlane中做额外的其他操作。比如,现在想把任务处理的URL设置在任务变量中,这个操作在AssignmentHandler类中进行;此时就会发现,当流程再次到达此结点时,任务变量中没有我们需要的值。原因也正在于此。
    所以,更准确地说,普通的AssignmentHandler方式每次都选择任务处理人,而Swimlane一旦创建之后,就把处理人绑定,之后的任务实例不能再选择处理人了。
    不过我们也可以利用它的这个特性实现一些其他的特殊业务.比如,一个共享的任务,如果被其中一个人选择处理,那么任务被退回之后再次到达此任务结点时,还应该由他来处理这个任务,就可以考虑通过设置SwimlaneInstance中的actorId来达到目的。
分享到:
评论
1 楼 zxd7900663 2010-09-13  
不错,收益

相关推荐

    jBPM3.2.rar_JBPM3.2_jbpm_jbpm 3.2_jbpm3_jbpm3.2教程

    **jbPM 3.2 知识点详解** jbPM,全称为Java Business Process Management,是一个开源的工作流管理系统,主要用于企业级应用中的业务流程管理。jbPM 3.2是该系统的一个版本,它提供了丰富的功能,包括流程设计、...

    jbpm3.2开发总结.pdf

    在jbpm3.2中,流程的每个状态(节点)之间的流转,可以通过定义条件表达式或者采用事件触发的方式,比如在任务完成后触发下一个状态的转换。 jbpm3.2中定义了几个核心的类和接口,例如ActionHandler,这是一个接口...

    JBPM3.2工作流开发指南

    JBPM3.2工作流开发指南 JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上。

    jbpm3.2表说明

    jbpm3.2表说明 很详细 1.1 JBPM_PROCESSDEFINITION:流程模版表 关系表 外键存在表 外键名称 外键存在表字段 存在原因 可能 关系 JBPM_NODE JBPM_NODE FK_PROCST_SBPRCDEF SUBPROCESSDEFINITION_ 子流程的...

    JBPM3.2与Spring结合时任务调度的实现.doc

    JBPM3.2与Spring的整合主要是为了实现任务调度的功能,这在企业级应用中是非常重要的,因为它能够自动化执行定时任务,如流程启动、数据同步、报告生成等。在JBPM3.1.x版本中,通过SpringModules提供的`spring-...

    JBPM3.2 表初始化,流程发布

    **JBPM3.2 表初始化与流程发布详解** JBPM(Java Business Process Management)是一款开源的工作流管理系统,主要用于业务流程的建模、部署、执行和监控。在JBPM3.2版本中,用户需要对数据库进行初始化,以便正确...

    JBPM3.2 表初始化,流程发布第一课

    1. 数据库准备:JBPM3.2需要与数据库进行交互来存储流程实例、任务和变量等信息。因此,首先需要确保已经配置好与JBPM兼容的数据库,并创建相应的数据库表。JBPM提供了SQL脚本,用于在MySQL、Oracle、PostgreSQL等...

    jbpm3.2 .jar

    jbpm3.2 .jar是基于Java的企业流程管理(Business Process Management,BPM)框架jbpm的特定版本,主要用于设计、执行和管理业务流程。jbpm是一个开源项目,它提供了全面的工作流和业务规则管理功能,使开发人员能够...

    jBPM 3.2 最新学习文档

    jBPM 3.2版本是该框架的一个重要里程碑,提供了强大的工作流引擎和丰富的功能,帮助开发者构建和执行复杂的业务流程。本文将深入探讨jBPM 3.2中的关键知识点,以助于学习者更好地理解和应用这一工具。 首先,我们要...

    [原创]jBPM 3.2 学习笔记

    用erstudio v7.1查看 博文链接:https://evanz.iteye.com/blog/106101

    JBPM3.2 源码

    5. **源码分析**:深入理解JBPM3.2源码,可以帮助开发者掌握其内部工作原理,包括流程引擎如何解析JPDL并执行流程,任务服务如何管理任务分配和完成,以及持久化机制如何存储流程实例和变量等。这对于优化性能、调试...

    jbpm3.2.x开发所需jar包

    **jbpm3.2.x 开发环境搭建及关键jar包详解** 在Java企业级应用开发中,业务流程管理(Business Process Management,BPM)扮演着重要角色,而Jbpm是一个开源的BPM框架,它提供了流程定义、执行、监控和优化等一系列...

    jbpm3.2 mysql修改可用建表语句

    jbpm3.2 mysql修改可用建表语句 在mysql命令行下使用:source D:1.sql

    jbpm3.2 简单的请假流程

    在本场景中,我们关注的是jbpm3.2版本的一个简单的请假流程示例。jbpm3.2是jbpm项目早期的一个稳定版本,它提供了一个强大的框架,允许开发者创建、部署和执行业务流程。 jbpm的请假流程示例通常会展示如何通过jbpm...

    深入浅出jBPM3.2.part1

    JBPM3.2,扫描版本,还算很清晰,虽然比较老,但是用来学习下还算不错,而且是中文,此文件因为太大,所以分为两个压缩包压缩,都已全部上传,请全部下载再解压缩。

    spring2_struts2_jbpm3.2.rar_jbpm struts2_jbpm-demo_jbpm3 spring_

    JBPM不仅提供流程的执行引擎,还包括工作流管理、任务分配、监控等功能。通过与Spring的集成,我们可以利用Spring的IoC管理JBPM的bean,实现流程服务的自动化管理和调度。 整合这三个框架的关键在于它们之间的接口...

    深入浅出jBPM3.2.part2

    JBPM3.2,扫描版本,还算很清晰,虽然比较老,但是用来学习下还算不错,而且是中文,此文件因为太大,所以分为两个压缩包压缩,都已全部上传,请全部下载再解压缩。

    jbpm3.2开发总结[定义].pdf

    jBPM 3.2版本在2004年10月18日发布,并被纳入JBoss企业中间件平台,更名为JBoss jBPM。这个系统的设计目标是提供一个灵活且可扩展的流程控制流机制,通过流程语言来表达各种商业流程元素,如任务、异步通信、定时器...

    jbpm-jpdl-suite-3.2GA -(2)分开压缩(共5个文件)jbpm下载

    jbpm-jpdl-suite-3.2GA -(2)分开压缩(五个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(2)分开压缩(五个文件)jbpm下载

Global site tag (gtag.js) - Google Analytics