天天看點

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

一、概述

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

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

二、異步任務

  1. 設計流程
第十節:Activiti6.0——四種Job工作的産生與管理

配置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>           

複制

  1. 編碼

    委托類:

/**
 * 實作委托類,需要被ServiceTask元素引用
 *
 * @Author: xjf
 * @Date: 2019/12/2 23:20
 */
public class MyJavaDelegate implements JavaDelegate {

    @Override
    public void execute(DelegateExecution delegateExecution) {
        System.out.println("這是處理類");
    }
}           

複制

  1. 配置:需要在activiti.cfg.xml配置檔案中開啟異步執行器
<!--開啟異步執行器,異步才會自動異步執行,比如異步工作、定時器工作等-->
<property name="asyncExecutorActivate" value="true" />           

複制

  1. 釋出
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);
    }           

複制

  1. 根據控制台列印的流程執行個體ID(關閉異步執行器),檢視一般工作資料庫:act_ru_job
第十節:Activiti6.0——四種Job工作的産生與管理

三、定時任務

  1. 介紹: 定時任務測試,任務在定時期間會産生定時job,存儲在表 act_ru_timer_job 中。

    定時時間到了之後将會被删除,同時需要配置中開啟異步執行器才會自動執行

    遇到問題: 定時任務到時間後,沒有繼續執行,需要确定

    已解決: 程式不能關閉,不然定時時間到了,任務執行不了

  2. 設計流程

    bpmn如下:

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

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>           

複制

  1. 釋出定時任務(記得打開異步執行器)
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);           

複制

  1. 檢視資料庫
第十節:Activiti6.0——四種Job工作的産生與管理

四、挂起(暫停)任務

  1. 設計流程:與上面的定時任務一樣,隻是把定時時間改為5分鐘(留有時間操作)。
<timerEventDefinition>
  <!--定時5分鐘-->
  <timeDuration>PT5M</timeDuration>
</timerEventDefinition>           

複制

  1. 釋出
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);           

複制

  1. 在對應的時間裡去檢視act_ru_suspended_job和act_ru_timer_job,可以看到任務的轉變
第十節:Activiti6.0——四種Job工作的産生與管理
第十節:Activiti6.0——四種Job工作的産生與管理

五、不可執行任務

  1. 設計流程:流程和上面的異步任務一樣,不過委托類換一個如下。我們需要手動報錯
public class ExceptionDelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("這是執行器");
        //測試不可執行的任務,手動出錯
        throw new RuntimeException("always exception 手動抛出");
    }
}           

複制

  1. 編碼釋出(記得打開異步執行器)
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);           

複制

  1. 檢視不可執行的任務資料庫表:act_ru_deadletter_job
第十節:Activiti6.0——四種Job工作的産生與管理