提问者:小点点

Activiti / Camunda用变量改变边界计时器


我收到了一个关于Activiti/Camunda中用户任务的计时器边界事件的特殊问题:

启动流程时,我使用流程变量设置计时器持续时间,并使用边界定义中的表达式来解析变量。边界事件是在用户任务上定义的。

<bpmn2:timerEventDefinition id="_TimerEventDefinition_11">
        <bpmn2:timeDuration xsi:type="bpmn2:tFormalExpression">${hurry}</bpmn2:timeDuration>
      </bpmn2:timerEventDefinition>

在某些情况下,当计时器已经运行时,可能会出现截止日期(dueDate)应该延长的情况,因为受让人请求了更多时间。为此,我想更改定义截止日期的流程变量的值。

碰巧的是,变量已经在进程启动时解析并设置为边界事件。

变量的任何进一步更改都不会影响边界定时器的dueDate,因为它存储在数据库中,并且在变量的值更改时不会更新。

我知道如何通过JavaAPI更新job元素的dueDate,但我想提供一种通用方法,比如通过更改变量值来设置它。

延长期限最常见的用例是边界计时器已经在运行。

有什么想法如何处理这个问题吗?

非常感谢任何提示。干杯,克里斯


共3个答案

匿名用户

经过一段时间的思考,我想出了这样的解决方法:

我用两个变量开始这个过程。“匆忙”是为边界计时器计算的。“extendDeadline”用false初始化。如果计时器触发并且进程前进到独占网关,则计算“extendDeadline”的值。

如果用户在定时器运行期间将“extendDeadline”的值更改为< code>true,则该过程再次返回到用户任务,其中边界定时器被设置为“hurry”的值。

如果“extendDeadline”仍然设置为false,则流程可以继续。

匿名用户

如果计时器正在运行,您可以通过执行信号来更改计时器的dueDate。如果发动机请求更多的时间,则设置新的匆忙值并执行信号。旧计时器将被取消,新计时器将以新的到期日期创建。

runtimeService.setVariable(execution.getId(), "hurry", newDueDate);
runtimeService.signalEventReceived(signalName, execution.getId());

匿名用户

然后,您可以在第二个序列流上使用一些独占网关,并使用新的计时器值将它重新路由回相同的任务。

相关问题