JBPM知识点------timer、Scheduler
定时器timer可以被用于decision fork join node process-state state super-state task-node,可以设置开始时间duedate和频率repeat,定时器动作可以是所支持的任何动作元素,如action或script,会运行 我们设置的商务动作。定时器通过动作创建和取消,有两个动作元素create-timer和cancel-timer。事实上,默认的定时器元素只是 create-timer动作依附于node-enter事件、cancel-timer动作依附于node-leave事件的一个简略表示。
timer 还有一个很重要的属性cancel-event,这个是timer和task结合时使用的,任务定时器的cancel-event可以被定制。默认情况 下,当任务被结束时(=完成)任务上的定时器将被取消,这是通过在定时器上使用cancel-event属性,流程开发者可以定制诸如task- assign或task-start。cancel-event支持多个事件,通过在属性中指定一个用逗号分割的列表,可以组合cancel-event 的类型。 这个属性没搞过呢。
调度这一块其实分成2部分,一个就是定时器,还有一个是调度服务。从jbpm 的javadoc可以看到调度服务涉及了几个类, 由于时间原因我还没有深入的研究过。
下面举一个简单的例子,运行一个定时器reminder,这个定时器立刻就运行duedate='0 seconds',频率是3seconds,执行的动作是输出timer running。这个定时器会在12秒后被定时器reminderend终结。
(有一个问题,终结是终结了但是SchedulerThread还在那等着,要回头再看看java的线程了。)
(还有一个问题,transition的用途还不是很明白?我以为运行12秒后流程就会跳转到end了。)
< process-definition xmlns ="" name ="yytest" >
< start-state >
< transition to ="a" />
</ start-state >
< state name ='a'>
<timer name ='reminder'
duedate ='0 seconds'
repeat ='3 seconds' >
< script > System.out.println("timer running"); </ script >
</ timer >
< timer name ='reminderend'
duedate ='12 seconds'
transition ='end'
>
< cancel-timer name ='reminder'/>
</timer >
</ state >
< end-state name ="end" ></ end-state >
</ process-definition >
Jbpm Context jbpm Context = jbpm Configuration.createJbpm Context();
try {
long processInstanceId = 1 ;
processInstance = jbpm Context.loadProcessInstance(processInstanceId);
Token token = processInstance.getRootToken();
// schedulerSession = jbpm Context.getSchedulerSession();
System.out.println(token.getNode());
token.signal();
System.out.println(token.getNode());
// Timer timer = (Timer) schedulerSession.findTimersByDueDate().next();
// timer.execute();
SchedulerThread st = new SchedulerThread(jbpm Configuration);
// st.executeTimers();
st.run();
// token.signal();
// System.out.println(token.getNode());
// jbpm Context.save(processInstance);
} finally {
jbpm Context.close();
}
}
运行结果如下:
StartState(159e154)
State(a)
timer running
timer running
timer running
timer running
(12秒后停止但是线程还在run)