`
ginge
  • 浏览: 208641 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jBPM的定时器(Timer)及任务执行器(JobExecutor)

    博客分类:
  • JBPM
阅读更多

定时器(Timer)可以说是jBPM的标准配置了,在多种节点,如Task-NodeNodeforkJoin等,都可以有Timer子元素。

 

声明一个定时器

<state name='catch crooks'>

  <timer name='reminder' 

         duedate='3 business hours' 

         repeat='10 business minutes'

         transition='time-out-transition' >

    <action class='the-remainder-action-class-name' />

  </timer>

  <transition name='time-out-transition' to='...' />

</state>

 

 

定时器的属性:

name:           定时器名称

duedate:         预期触发时间

repeat:          每次执行间隔

 

定时器的子元素:

transition:        当定时器执行时将通过的跃迁(transition)路径名称

action:           定时器触发时执行的动作

 

上述属性和元素只有dudate是必要的。其他都是可选的。

 

duedate语法:

duedate ::= [<basedate> +/-] <duration>

如果忽略basedate,那么basedate就是计算这个公式的时间,例如进入一个task-node后创建timer的时刻

 

duration ::= <quantity> [business] <unit>

unitsecond, seconds, minute, minutes, hour, hours, day, days, week, weeks, month, months, year, years

如果忽略business,那么计算出来的duration会是一个绝对时间

 

配置例子:

<timer repeat="30 days" name="task-reminder" duedate="01 business day">

               <action class="com.sample.action.TaskReminder"></action>

</timer>

 

 

 

执行Token一旦通过signal或者终止任务(Task)的方式离开当前节点,定时器也就被取消了。当定时器执行时,以下事件将依次发生:

  • 发生定时器事件
  • 如果指定了动作(Action),那么该动作将被执行
  • 如果指定的跃迁(transition)路径,那么一个继续执行的指令将被发出,且执行Token会通过该跃迁(transition)路径

 

 

如果需要启用timer,则需要scheduler服务及启动JobExecutor。根据经验,jBPM中使用hsqldb数据库是启动不了timer的,使用mysql的就可以。我想这个会不会是因为使用hsqldb时,数据没有提交,导致JobExecutor查询数据库时查不到数据呢?

 

另外,可以通过以下代码来启动JobExecutor

private void startJobExecutor()

    {

        JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

        //start job executor

        jbpmConfiguration.getJobExecutor().start();

        log.info("JobExecutor started.");

    }

 

 

需要注意的是,由于jBPM要求使用的是数据库隔离级别是Read-Committed还有乐观锁机制,使用timer很容易导致StaleObjectException。原因是JobExecutor会不断的更新token,业务代码端在提交事务的时候会发现记录的version被更新了,从而导致出现该异常。

3
0
分享到:
评论
1 楼 taga 2009-04-15  
如何取消呢?

相关推荐

Global site tag (gtag.js) - Google Analytics