首页 > 代码库 > Activity定时任务
Activity定时任务
Activity定时任务
作者:邓家海
傻逼一样的去坚持,就会有牛逼的结果
情景:
某公司有一个OA系统,审批环节是经理。有一天,经理出差了,然后下面突然有一份决定公司某个重大项目是否能顺利中标的决策需要呈批请示。但是刚好这个经办的员工不知道经理已经出差(或者这个呈批必须要经过经理审批的环节,没有跳过,也没有转发)。巧了,刚好这个经理出差的时候,没有委托任何人来办理这个事情。然后这个呈批就卡死在经理的环节上面没有人办理了。怎么办?问经理要密码?重新发起一个呈批?如果这样子做的话,说明这个OA系统的流程还不够灵活,需要管理员或者人工手动去协调系统。
方案:
那么我们可以设置Activity的定时任务。一旦超过这个办理的期限,那么,流程就会自动执行一些操作。下面我做的一个方案是一旦超过了办理期限,系统自动发送邮件提醒办理者。
要素:
(1)定时任务边界
(2)定时任务时间
(3)超时处理
Activity定时任务,需要启用JOB模块:
1 <!-- 定时任务 --> 2 <property name="jobExecutorActivate" value="true" />
这里如果设置为false,是不会触发定时任务的。
设计流程:
流程部分代码:
1 <boundaryEvent id="sid-2C3A3C84-B2E4-4B29-A319-0AFBC17544F0" attachedToRef="sid-C8781FAE-02B8-4F8D-9A7D-A8AB4A8CB95A" cancelActivity="false"> 2 3 <timerEventDefinition> 4 5 <timeDate>2016-06-04T15:03:00</timeDate> 6 7 </timerEventDefinition> 8 9 </boundaryEvent> 10 11 <serviceTask id="sid-F8D7E189-DB9F-49C2-87D6-D466398A889E" name="超时发送邮件" activiti:type="mail"> 12 13 <extensionElements> 14 15 <activiti:field name="to"> 16 17 <activiti:string>763630473@qq.com</activiti:string> 18 19 </activiti:field> 20 21 <activiti:field name="from"> 22 23 <activiti:string>763630473@qq.com</activiti:string> 24 25 </activiti:field> 26 27 <activiti:field name="subject"> 28 29 <activiti:string>待办超时</activiti:string> 30 31 </activiti:field> 32 33 <activiti:field name="text"> 34 35 <activiti:string>你有一个待办任务已经超时。</activiti:string> 36 37 </activiti:field> 38 39 </extensionElements> 40 41 </serviceTask>
超时的时间设置(其中一种)
(1)需要设置经理节点
(2)设置超时任务边界的时间
说明:
(1)必须要设置一个时间,否则任务不执行
(2)取消活动为true,那么超时会直接取消这个流程活动,为false,不取消
(3)关于时间设置
Main config中的数据格式均为:ISO_8601格式:(P ,Y,M,W,D,T,.H,M,S)或 cron时间格式:
Iso_8601格式:
-----Time duration:延时多长时间后触发。例:P10D 表示10天以后触发
-----time date:什么时间触发。例:2011-03-12T12:12:23 表示在2011年03 月12日 12:12:23触发
---time cycle:循环规则:
R【循环次数】【/开始时间】/时间间隔【/结束时间】。
例:R3/PT10 表示重复3次,每次间隔10小时
从2004年5月6日北京时间下午1点起时间间隔半年零5天3小 时循环,且循环3次,可以表示为
R3/2004-05-06T130000+08/P0Y6M5DT3H0M0S。
以1年2个月为循环间隔,无限次循环,最后循环终止于2025年1 月1日,可表示为R/P1Y2M/2025-01-01
Cron 时间格式:seconds minutes hours day-of -mouth mouth,day-of-week year
其中*表示这个域上所有的合法值
例:0 * 17 * * ? 表示每天下午5点到5:59每分钟触发一次
?表示不指定该域上的值(只能用在日域或周域上,且不能同时在两 个域上使用,即假如在在其中的一个域上指定了值,必要再另一 个上放?)
,表示在某个域上指定一个值列表
例:0 10,44 14 ? 3 WEB 表示三月中每个星期三的下午2:10 和下午的2:44触发
- 表示在某个域上指定一个值范围
例:0 45 3-8 ? * * 表示上午3点到上午8点的45分时触发
m/n 表示某个域的值从m开始,按n递增
例:0/15 0/30 * * * ? 表示整点和半点时每15秒触发
L 表示某个域上允许的最后一个值(只能用在日域和周域上,用在 日域上时,表示当月的最后一天触发;用在周域上,表示周的最 后一天,即周六触发)
例:0 0 12 ? * 2L 表示每个月中的最后一个星期一的12:00触发
W 表示里指定日期最近的工作日(只用在日域上,其只能指定单天, 不能指定范围或列表)
例:在日域上指定15W,那么如果15号是工作日,就在15号 触发
如果15号是周六,就在14号触发
如果15号是周日,就在16号触发
# 表示月份中的第几周的哪一天(只用在周域上)
例:6#3 表示某个月的第三个星期五
最后执行:
Activity交流QQ群:634320089
关于邮件任务我之前已经说过,就不重复!
Activity定时任务