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

        在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()时对该令牌上未完成任务自动调用取消方法。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值