现在的位置: 首页 > 综合 > 正文

强制结束令牌(token)引发的问题

2013年06月02日 ⁄ 综合 ⁄ 共 923字 ⁄ 字号 评论关闭

        在Jbpm中可以在代码里面调用token.end()强制结束一个令牌的执行。

        例如在以下应用中:在fork(分支) 和join(联合)中将产生两个子令牌,而我们的需求是:当其中一个执行路线到达join节点时即继续父令牌的执行,而取消另外一个子令牌的执行。这时就需要我们在join节点的node-enter事件处理action中调用token.end()方法强制结束另外一个令牌。

        虽然调用token.end()可以结束令牌的执行,但是该令牌上的任务实例却依然存在,也就是说任务实例依然可以被所分配到的参与者看到并执行。

        刚开始我想到调用taskInstance.end()方法来结束相关任务实例,但是这样产生的问题是,它会调用该任务的执行,并触发相关事件动作,并标识该任务已由参与者完成。而我们想要的是取消任务,即不允许该任务再执行相关事件动作,并标识该任务的参与者并没有完成任务,这在某些业务上是需要的。

        另外又发现任务实例上有一个cancel()方法,结果通过源码可以看到,cancel方法会去调用end方法,所以也不可行。

         如此以来,最后只有一个方法可用,那就是调用taskInstance.setEnd(Date)方法,这样不会触发相关事件动作,但是因为Jbpm是依赖于结束时间来判断任务的完成与否,所以依然标识了该任务已经被执行。另外在调用TaskMgmtSession().findTaskInstances(actorId)时依然会返回该任务,因为这个方法所调用的HQL中是根据任务实例的isOpen属性为true进行查找的(可在hibernate.queries.hbm.xml文件中找到),而taskInstance.setEnd(Date)不会修改isOpen属性,所以在取任务时需要进行过滤。

          也许是小弟愚昧,至今我还没有找到一个可以解决这个问题的方法,个人认为Jbpm应该在任务实例中提供取消任务的接口方法(可修改cancel方法满足此需求)和任务取消标志,并且在调用token.end()时对该令牌上未完成任务自动调用取消方法。

抱歉!评论已关闭.