定时器事件(Timer Events):

  • 定时器事件是一个被定义好的被定时触发的事件,定时器事件可以用在开始事件、中间事件、边界事件上,边界事件可以是中断和非中断边界事件
img

注释: 1.每月第一天,是一个定时器开始事件(Timer Start Event) 2.每三个营业日,是一个定时器中间捕获事件(Timer Intermediate Catching Event) 3.每24小时,是一个不可中断定时器边界事件(Timer Boundary Event) 4.每周,是一个可中断定时器边界事件(Timer Boundary Event)

定时器事件启用配置(Configuration):
  • camunda流程引擎要使用定时器事件,需要配置启用Job Executor。

一、定义一个定时器(Defining a Timer):

  • 定时器使用的是ISO 8601标准的时间格式,一个定时器的定义必须有以下元素中的一个: 1.固定的时间日期(Time Date): 这个固定时间遵循ISO 8601标准,这个固定时间指定了定时器事件被触发的时间
<timerEventDefinition>
 <timeDate>2011-03-11T12:13:14Z</timeDate>
</timerEventDefinition>

2.时间段(Time Duration) 这个时间段指明了多久之后触发定时器事件,timeDuration元素被定义成timerEventDefinition元素的一个子元素(在bpmn的xml文件中),这个时间区间可以被写成ISO 8601的两种格式 1.PnYnMnDTnHnMnS //P表示日期的开始(年月日),T表示时间的开始(时分秒),即表示:固定n年n月n天n小时n分钟n秒钟后

  1. PnW //表示n周后//例子:
    //P10DT5M:表示每10天5分钟为一个周期
    <timerEventDefinition>
     <timeDuration>P10DT5M</timeDuration>
    </timerEventDefinition>
    //PM10M:每10分钟为一个周期
    <timerEventDefinition>
     <timeDuration>PM10M</timeDuration>
    </timerEventDefinition>    

3.时间周期(Time Cycle) 指定一个重复的时间间隔,这对于那些需要周期性发起流程或者重复发送超时提醒的任务很有用。时间周期也支持两种时间格式,一种是遵循ISO 8601标准的时间周期

//例子:
//R3/PT10H表示:重复3次,每次间隔10小时
<timerEventDefinition>
 <timeCycle>R3/PT10H</timeCycle>
</timerEventDefinition>

另一种是cron表达式 例子:

//每5分钟一次,注意:第一个数字表示秒,不是Unix中的分钟
0 0/5 * * * ?

循环时间周期(ISO 8601)更适合需要循环固定次数的任务,corn表达式更适用于那些需要一直循环的任务,例如:固定时间定时发起的任务

  • 修改时间周期(Modify a Time Cycle):

定时器的时间周期可以通过REST API或者ManagementService进行修改,通过设置新的到期时间来实时改变定时器被执行的时间:

managementService.setJobDuedate(String jobId, Date newDuedate)

对一个定时器实例的修改,不会自动影响到后续的定时器实例,比如,一个定时器事件固定每30分钟执行一次,如果一个定时器实例的时间被改成在原来的基础上增加15分钟,则这个定时器将会在45分钟后被执行,它后面的一个会遵循原来间隔30分钟执行一次定时,在15分钟后执行,这之后的都是固定30分钟,按照原来的时间继续执行 如果想要所有的定时器实例基于这个修改生效,可以通过指定cascade标识来实现,通过REST API或者ManagementService进行修改:

managementService.setJobDuedate(String jobId, Date newDuedate, boolean cascade)

二、定时器支持表达式(Expressions):

可以在定时器时间的定义上使用表达式,这样你就可以通过流程变量来影响定时器,流程变量也必须遵循ISO 8601或者corn表达式

//例子:
<boundaryEvent id="escalationTimer" cancelActivity="true" attachedToRef="firstLineSupport">
 <timerEventDefinition>
   <timeDuration>${duration}</timeDuration>
 </timerEventDefinition>
</boundaryEvent>

三、处理时区(Handling of Timezones):

例如2016-03-11T12:13:14这个配置,没有指明时区。在运行时,这个时间的时区是基于jvm所在地区的时区来的。这在某些请情况下会有问题,例如多个camunda部署在不同的时区地区。因此,在配置时间是,可以指明时区(2016-03-11T12:13:14Z,2016-03-11T12:13:14+01)

四、定时器开始事件(Timer Start Event):

定时器开始事件被用在,在给定的时间上创建流程实例,可以用在固定时间发起一个流程实例,也可以用在指定的时间间隔下循环创建流程实例

注释: 1.子流程不能有定时器开始事件 2.定时器开始事件在流程部署完成后就开始生效,不需要额外的调用startProcessInstanceBy...接口。如果调用了startProcessInstanceBy...接口,会导致额外的流程实例被创建

//下面这个xml表示一个定时器事件的声明:
//这个流程会被发起4次,间隔5分钟,从2016年5月11号12:13开始
<startEvent id="theStart">
 <timerEventDefinition>
   <timeCycle>R4/2016-03-11T12:13/PT5M</timeCycle>
 </timerEventDefinition>
</startEvent>

//这个流程会被发起1次,从2016年5月11号12:13:14开始
<startEvent id="theStart">
 <timerEventDefinition>
   <timeDate>2016-03-11T12:13:14</timeDate>
 </timerEventDefinition>
</startEvent>

五、定时器中间捕获事件(Timer Intermediate Catching Event):

定时器中间事件类似一个秒表,当流程到达定时器事件时,定时器开始计时,当到达时间后,流程离开定时器事件 定时器中间事件被定义成一个中间捕获事件

//例子:
<intermediateCatchEvent id="timer">
 <timerEventDefinition>
   <timeDuration>PT5M</timeDuration>
 </timerEventDefinition>
</intermediateCatchEvent>

六、定时器边界事件(Timer Boundary Event):

定时器边界事件类似秒表和闹钟,当流程执行到定时器边界事件所在的任务时,定时器开始计时,当到达时间后,任务被中断,并且流程沿着消息边界事件进行 可中断定时器边界事件和不可中断的定时器边界事件的区别是:中断事件时默认的。不中断会导致任务不能被中断,且这个任务也会沿着定时器边界事件分支进行,是否被中断在cancelActivity属性中设置

//例子:
<boundaryEvent id="escalationTimer" cancelActivity="false" />
 <timerEventDefinition>
   <timeDuration>PT4H</timeDuration>
 </timerEventDefinition>
</boundaryEvent>

世间山河广,祝你得偿所愿!