我曾经想如下配置JBPM的Timer:
<on event="timeout">
<timer duedate="#{duedate}" repeat="#{repeat}"/>
<event-listener class="...wfms.demo.timer.TimerListner" />
</on>
结果发现:
1.duedate是可以使用流程变量的,当创建org.jbpm.pvm.internal.job.TimerImpl的实例时,其会找到相应变量的值来初始化duedate属性如下:
public void setDueDateDescription(String dueDateDescription) {
ScriptManager scriptManager = ScriptManager.getScriptManager();
dueDateDescription = (String) scriptManager.evaluateExpression(dueDateDescription, null);
Date now = Clock.getCurrentTime();
BusinessCalendar businessCalendar = EnvironmentImpl.getFromCurrent(BusinessCalendar.class);
duedate = businessCalendar.add(now, dueDateDescription);
}
2.repeat就不能使用流程变量了,而只可以使用一个持续时间表达式常量。原因是其只是把配置的变量赋值给TimerImpl实例的repeat属性而不做任何处理:
public void setRepeat(String repeat) {
this.repeat = repeat;
}
当然了要解决这个问题办法倒是有一个,那就是覆写上面这个方法:
public void setRepeat(String repeat) {
ScriptManager scriptManager = ScriptManager.getScriptManager();
this.repeat = (String) scriptManager.evaluateExpression(repeat, null);
}