关于jbpm的任务调度和工作日历(2)
作者:?wf_7758520 ( name: wangfeng, email:?wf_7758520 @163.com , blog:http://?wf_7758520 .iteye.com )
这次就说说jBPM的业务日历。
业务日历是关于业务时间的,并且被用于为任务和定时器计算预期的时间。 业务日历能够通过对一个期限和日期进行增加来计算日期。
这是官方的定义,现在看不明白没关系,我会慢慢解释。我们先看看业务日历的语法:
- <quantity>[business]<unit>??
<quantity></quantity><unit></unit>
<quantity></quantity>是一个文本块,它是可以使用Double.parseDouble(quantity)所解析的,也就是说是一个数字;<unit></unit>是{second,seconds,minute,minutes,hour,hours,day,days,week,weeks,month,months,year,years}之一;加上可选的business指示,意味着对于这个期限只有业务时间才应被考虑,如果没有business指示,期限将作为一个绝对的时间段被解释。也就是说加了business的按业务时间算,没加的按绝对时间算。
什么叫业务时间,什么叫绝对时间?我就用jbpm的例子说明。文件org/jbpm/calendar/jbpm.business.calendar.properties指定了什么是业务时间,该配置文件可以被定制并且修改后的拷贝可被放在classpath根。 下面是业务时间规范的例子,它在jbpm.business.calendar.properties中被默认配置。
xml 代码- hour.format=HH:mm ??
- #weekday?::=?[<daypart>?[&?<daypart>]*] ??
- #daypart?::=?<start-hour>-<to-hour>??
- #start-hour?and?to-hour?must?be?in?the?hour.format ??
- #dayparts?have?to?be?ordered ??
- weekday.monday=????9:00-12:00?&?12:30-17:00 ??
- weekday.thuesday=??9:00-12:00?&?12:30-17:00 ??
- weekday.wednesday=?9:00-12:00?&?12:30-17:00 ??
- weekday.thursday=??9:00-12:00?&?12:30-17:00 ??
- weekday.friday=????9:00-12:00?&?12:30-17:00 ??
- weekdayweekday.saturday= ??
- weekday.sunday= ??
- ??
- day.format=dd/MM/yyyy ??
- #?holiday?syntax:?<holiday>??
- #?holiday?period?syntax:?<start-day>-<end-day>??
- #?below?are?the?belgian?official?holidays ??
- holiday.1=??01/01/2005?#?nieuwjaar ??
- holiday.2=??27/3/2005??#?pasen? ??
- holiday.3=??28/3/2005??#?paasmaandag? ??
- holiday.4=??1/5/2005???#?feest?van?de?arbeid ??
- holiday.5=??5/5/2005???#?hemelvaart? ??
- holiday.6=??15/5/2005??#?pinksteren? ??
- holiday.7=??16/5/2005??#?pinkstermaandag? ??
- holiday.8=??21/7/2005??#?my?birthday? ??
- holiday.9=??15/8/2005??#?moederkesdag? ??
- holiday.10=?1/11/2005??#?allerheiligen? ??
- holiday.11=?11/11/2005?#?wapenstilstand? ??
- holiday.12=?25/12/2005?#?kerstmis? ??
- ??
- ??
- business.day.expressed.in.hours=?????????????8??
- business.week.expressed.in.hours=???????????40??
- business.month.expressed.in.business.days=??21??
- business.year.expressed.in.business.days=??220??
- ??
对于上面定义通俗的理解就是它归定了从星期一到星期五的9:00-12:00?&?12:30-17:00???这段时间为上班时间也就是业务时间,星期六和星期日没有定义也就是放假的时间,再往下就是定义了12个节假日,最后是一些工作时长的统计如一天8小时,一个星期40小时等。
从官方定义至少可以看出jbpm要与定时器结合使用,下面我们定义一个定时器:
xml 代码- <state?name='catch?crooks'>?????? ??
- ??<timer?name='reminder'?duedate='3?business?day'?
- repeat='2?business?day'?????? ??
- ??????transition='time-out-transition'?>?????? ??
- ????<action?class='the-remainder-action-class-name'?/>?????? ??
- ??timer>????????? ??
- <state>???
这里的定时器(timer)的名字是reminder,它的duedate定义的是3 business day,repeat定义的是2?business?day也就是说从定时器启动开始在3个业务日的时间后每隔两个业务日执行一次action的方法,直到timer结束。现在就可以来区别业务时间和绝对时间了,假设我是在星期五的早上10点启动了这个timer,那它第一次执行action的方法是在什么时候呢?因为这里的定义是有加上business的所以要结束工作日历的定义来算了。工作日历中定义了星期六和星期天是不上班的(没有定义),所以在计算时间时就跳过,要到星期三到早上10点(这时只是执行完duedate的时间也就是第一次触发action的时间),到星期五早上10点第二次触发action,到下个星期二早上第二次触发action(因为星期六和星期日没定义不是业务时间),以此类推。如果在timer定义时没有加上business的话,就以绝对时间进行计算,也就是在星期一的10点第一次触发action,到星期三10点第二次触发action,以此类推。
现在说完了工作日历,我估计还会有人不明白,那下一节就对工作日历的代码进行分析。
?