第十節:Activiti6.0——四種Job工作的產生與管理

本人個人博客網站,歡迎訪問:學教府

一、概述

介紹: 流程在執行過程中會產生不同的任務。

  1. ServiceTask異步任務會產生異步任務,存放在一般工作表act_ru_job中。
  2. 定時任務會產生定時的任務,在定時時間未到達之前會存放在定時工作表act_ru_timer_job中。
  3. 掛起任務,比如將未到時間的定時任務手動暫停,則會存放在掛起任務表act_ru_suspended_job中。
  4. 不可執行任務,如果任務執行失敗,並且在重試次數用完的情況下也沒有成功執行,則任務會存放到不可執行任務表act_ru_deadletter_job中。

二、異步任務

  1. 設計流程
    異步任務流程圖
    配置ServiceTask
    <process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
        <startEvent id="_2" name="StartEvent"/>
        <endEvent id="_3" name="EndEvent"/>
        <userTask activiti:exclusive="true" id="UserTask" name="UserTask"/>
        <!--開啓異步,並指定委託類(在下面編碼中)。注意:activiti開頭的元素不屬於bpmn規範,因此該bpmn文件不能移植到其他流程引擎中-->
        <serviceTask activiti:exclusive="true" id="ServiceTask" name="ServiceTask"
                     activiti:async="true" activiti:class="com.xjf.test.MyJavaDelegate"/>
        <sequenceFlow id="_6" sourceRef="_2" targetRef="ServiceTask"/>
        <sequenceFlow id="_7" sourceRef="ServiceTask" targetRef="UserTask"/>
        <sequenceFlow id="_8" sourceRef="UserTask" targetRef="_3"/>
      </process>
    
  2. 編碼
    委託類:
    /**
     * 實現委託類,需要被ServiceTask元素引用
     *
     * @Author: xjf
     * @Date: 2019/12/2 23:20
     */
    public class MyJavaDelegate implements JavaDelegate {
    
        @Override
        public void execute(DelegateExecution delegateExecution) {
            System.out.println("這是處理類");
        }
    }
    
  3. 配置:需要在activiti.cfg.xml配置文件中開啓異步執行器
    <!--開啓異步執行器,異步纔會自動異步執行,比如異步工作、定時器工作等-->
    <property name="asyncExecutorActivate" value="true" />
    
  4. 發佈
    public static void main(String[] args) throws InterruptedException {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    
    Deployment deployment = repositoryService.createDeployment().addClasspathResource("service-task.bpmn").deploy();
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
    
    ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
    
    // 可以查看act_ru_job,會有異步工作。不過此時沒有開啓異步執行器,流程是卡在ServiceTask任務的,沒有往下執行。
    // 開啓後將看不到數據,因爲直接執行了(是異步的)
    System.out.println("流程實例id: " + processInstance.getId());
    
    processEngine.close();
    System.exit(0);
        }
    
  5. 根據控制檯打印的流程實例ID(關閉異步執行器),查看一般工作數據庫:act_ru_job
    異步任務

三、定時任務

  1. 介紹: 定時任務測試,任務在定時期間會產生定時job,存儲在表 act_ru_timer_job 中。
    定時時間到了之後將會被刪除,同時需要配置中開啓異步執行器纔會自動執行
    遇到問題: 定時任務到時間後,沒有繼續執行,需要確定
    已解決: 程序不能關閉,不然定時時間到了,任務執行不了
  2. 設計流程
    bpmn如下:
    定時任務bpmn
    xml配置如下:
    <process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
      <startEvent id="_2" name="StartEvent"/>
      <intermediateCatchEvent id="IntermediateCatchingEvent" name="IntermediateCatchingEvent">
        <timerEventDefinition>
          <!--定時任務,定時爲一分鐘-->
          <timeDuration>PT1M</timeDuration>
        </timerEventDefinition>
      </intermediateCatchEvent>
      <userTask activiti:exclusive="true" id="UserTask" name="UserTask"/>
      <endEvent id="_5" name="EndEvent"/>
      <sequenceFlow id="_6" sourceRef="_2" targetRef="IntermediateCatchingEvent"/>
      <sequenceFlow id="_7" sourceRef="IntermediateCatchingEvent" targetRef="UserTask"/>
      <sequenceFlow id="_8" sourceRef="UserTask" targetRef="_5"/>
    </process>
    
  3. 發佈定時任務(記得打開異步執行器)
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    
    Deployment deployment = repositoryService.createDeployment().addClasspathResource("timer-task.bpmn").deploy();
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
    ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
    
    System.out.println("流程實例id:" + processInstance.getId());
    
    //程序不能馬上關閉,需要等待定時任務執行,然後程序死了,定時任務沒法執行
    Thread.sleep(120000);
    
    
    processEngine.close();
    System.exit(0);
    
  4. 查看數據庫
    定時任務

四、掛起(暫停)任務

  1. 設計流程:與上面的定時任務一樣,只是把定時時間改爲5分鐘(留有時間操作)
    <timerEventDefinition>
      <!--定時5分鐘-->
      <timeDuration>PT5M</timeDuration>
    </timerEventDefinition>
    
  2. 發佈
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    
    Deployment deployment = repositoryService.createDeployment().addClasspathResource("suspend-task.bpmn").deploy();
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
    ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
    
    System.out.println("流程實例ID:" + processInstance.getId());
    
    //因爲定時任務時間爲5分鐘,此時等待10s時工作存放在act_ru_timer_job中
    Thread.sleep(10000);
    
    //將任務暫停,則任務會存放到表act_ru_suspended_job中
    runtimeService.suspendProcessInstanceById(processInstance.getId());
    
    //再次等待10s後,將任務激活,則任務回到act_ru_timer_job中
    Thread.sleep(10000);
    runtimeService.activateProcessInstanceById(processInstance.getId());
    
    processEngine.close();
    System.exit(0);
    
  3. 在對應的時間裏去查看act_ru_suspended_jobact_ru_timer_job,可以看到任務的轉變
    定時表中
    掛起任務表中

五、不可執行任務

  1. 設計流程:流程和上面的異步任務一樣,不過委託類換一個如下。我們需要手動報錯
    public class ExceptionDelegate implements JavaDelegate {
        @Override
        public void execute(DelegateExecution execution) {
            System.out.println("這是執行器");
            //測試不可執行的任務,手動出錯
            throw new RuntimeException("always exception 手動拋出");
        }
    }
    
  2. 編碼發佈(記得打開異步執行器)
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    ManagementService managementService = processEngine.getManagementService();
    
    Deployment deployment = repositoryService.createDeployment().addClasspathResource("error-task.bpmn").deploy();
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
    ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
    
    System.out.println("流程實例ID:" + processInstance.getId());
    
    //任務重試次數默認爲三次,手動設置爲一次,方便快速測試查看
    Job job = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
    managementService.setJobRetries(job.getId(),1);
    
    Thread.sleep(30000);
    
    processEngine.close();
    System.exit(0);
    
  3. 查看不可執行的任務數據庫表:act_ru_deadletter_job
    不可執行任務數據庫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章