天天看點

【activiti 入門】activiti6.0事件之定時事件

環境:

IDEA+actbpm插件

第一步繪制流程圖:

【activiti 入門】activiti6.0事件之定時事件

具體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

第二步設定定時事件的運作規則:

【activiti 入門】activiti6.0事件之定時事件

仔細看下定時事件的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();

以上部分就是定時事件的相關操作,可做參考。