環境:
IDEA+actbpm插件
第一步繪制流程圖:
具體xml代碼如下:
<process id="tcProcess" name="tcProcess"> <startEvent id="startevent1" name="Start"></startEvent> <userTask id="usertask1" name="發貨"></userTask> <userTask id="usertask2" name="接收訂單"></userTask> <intermediateCatchEvent id="timerintermediatecatchevent1" name="TimerCatchEvent"> <timerEventDefinition> <timeDuration>PT1M</timeDuration> </timerEventDefinition> </intermediateCatchEvent> <endEvent id="endevent1" name="End"></endEvent> <sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="usertask2"></sequenceFlow> <sequenceFlow id="flow2" name="" sourceRef="usertask2" targetRef="timerintermediatecatchevent1"></sequenceFlow> <sequenceFlow id="flow3" name="" sourceRef="timerintermediatecatchevent1" targetRef="usertask1"></sequenceFlow> <sequenceFlow id="flow4" name="" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow> </process>
講解:
事件架構總的定義型的事件都是intermediateCatchEvent标簽體,而定時事件其實就是該标簽體指定了類型,也就是event Type屬性值為 timer event。
如果不太明白可以參考我之前的文章:https://blog.csdn.net/qq_33333654/article/details/101363454
第二步設定定時事件的運作規則:
仔細看下定時事件的type屬性,有三個值:
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 表示某個月的第三個星期五
具體的iso和cron格式規範可自行百度。
另外一種用法就是定義的規則放到activiti的全局變量中通過${value}的方式進行擷取調用。
第三步java代碼:(僅供參考)
// 建立流程引擎
ProcessEngineImpl engine = (ProcessEngineImpl)ProcessEngines
.getDefaultProcessEngine();
// 啟動JobExecutor
engine.getProcessEngineConfiguration().getJobExecutor().start();
// 得到流程存儲服務元件
RepositoryService repositoryService = engine.getRepositoryService();
// 得到運作時服務元件
RuntimeService runtimeService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
// 部署流程檔案
repositoryService.createDeployment()
.addClasspathResource("bpmn/TimerCatchingEvent.bpmn").deploy();
// 啟動流程
runtimeService.startProcessInstanceByKey("tcProcess");
// 查詢目前任務
Task currentTask = taskService.createTaskQuery().singleResult();
taskService.complete(currentTask.getId());
Thread.sleep(1000 * 70);
// 重新查詢目前任務
currentTask = taskService.createTaskQuery().singleResult();
System.out.println("定時器中間事件的觸發後任務:" + currentTask.getName());
//關閉JobExecutor
engine.getProcessEngineConfiguration().getJobExecutor().shutdown();
以上部分就是定時事件的相關操作,可做參考。