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

时间:2015-05-11 14:21:17

标签: timer activiti boundary camunda

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

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



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

在某些情况下,当计时器已经运行时,可能会发生截止日期(dueDate),因为收件人要求更多时间。为此,我想更改定义截止日期的流程变量的值。

实际上,变量已在process-start处解析并设置为边界事件。

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

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

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

有任何想法如何应对这个问题?

任何提示都非常有用。 干杯克里斯

3 个答案:

答案 0 :(得分:2)

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

enter image description here

我用两个变量开始这个过程。 &#34;的快点&#34;被评估为边界计时器。并且&#34; extendDeadline &#34;使用false进行初始化。如果定时器触发并且进程前进到专用网关,则&#34; extendDeadline&#34;被评估。

如果用户更改了&#34; extendDeadline &#34;的值在计时器运行期间到true进程再次返回用户任务,其中边界计时器设置为&#34; 快点&#34;。

如果&#34; extendDeadline &#34;仍然设置为false,此过程可以继续。

答案 1 :(得分:1)

如果定时器正在运行,您可以通过执行信号来更改定时器的dueDate。如果受训者要求更多时间,请设置 hurry 的新值并执行该信号。旧计时器将被取消,新计时器将以新的截止日期创建。

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

Process with signal

答案 2 :(得分:0)

解决方案是有两个输出序列流,一个应该来自任务的边界计时器而另一个应该来自任务它自己,如@theFriedC添加的图所示。请参见下图。enter image description here

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