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了。)

<? xml version="1.0" encoding="UTF-8" ?>
< 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 >


 

private   static   void  run() {
        JbpmContext jbpmContext 
= jbpmConfiguration.createJbpmContext();
        
try {
            
long processInstanceId =1;
               processInstance 
= jbpmContext.loadProcessInstance(processInstanceId);
               Token token 
= processInstance.getRootToken();
               
//schedulerSession = jbpmContext.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(jbpmConfiguration);
               
//st.executeTimers();
               st.run();
               
//token.signal();
               
//System.out.println(token.getNode());
               
//jbpmContext.save(processInstance);
            }
finally {
              jbpmContext.close();
            }

    }

运行结果如下:

StartState(159e154)
State(a)
timer running
timer running
timer running
timer running
(12秒后停止但是线程还在run)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值