Activiti定時任務
作者:Jesai
傻逼一樣的去堅持,就會有牛逼的結果
情景:
某公司有一個OA系統,審批環節是經理。有一天,經理出差了,然后下面突然有一份決定公司某個重大項目是否能順利中標的決策需要呈批請示。但是剛好這個經辦的員工不知道經理已經出差(或者這個呈批必須要經過經理審批的環節,沒有跳過,也沒有轉發)。巧了,剛好這個經理出差的時候,沒有委托任何人來辦理這個事情。然后這個呈批就卡死在經理的環節上面沒有人辦理了。怎么辦?問經理要密碼?重新發起一個呈批?如果這樣子做的話,說明這個OA系統的流程還不夠靈活,需要管理員或者人工手動去協調系統。
方案:
那么我們可以設置Activiti的定時任務。一旦超過這個辦理的期限,那么,流程就會自動執行一些操作。下面我做的一個方案是一旦超過了辦理期限,系統自動發送郵件提醒辦理者。
要素:
(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 表示某個月的第三個星期五
最后執行:
Activiti交流QQ群:634320089
關於郵件任務我之前已經說過,就不重復!