本人个人博客网站,欢迎访问:学教府
一、概述
介绍: 流程在执行过程中会产生不同的任务。
- ServiceTask异步任务会产生异步任务,存放在一般工作表act_ru_job中。
- 定时任务会产生定时的任务,在定时时间未到达之前会存放在定时工作表act_ru_timer_job中。
- 挂起任务,比如将未到时间的定时任务手动暂停,则会存放在挂起任务表act_ru_suspended_job中。
- 不可执行任务,如果任务执行失败,并且在重试次数用完的情况下也没有成功执行,则任务会存放到不可执行任务表act_ru_deadletter_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>
- 编码
委托类:/** * 实现委托类,需要被ServiceTask元素引用 * * @Author: xjf * @Date: 2019/12/2 23:20 */ public class MyJavaDelegate implements JavaDelegate { @Override public void execute(DelegateExecution delegateExecution) { System.out.println("这是处理类"); } }
- 配置:需要在activiti.cfg.xml配置文件中开启异步执行器
<!--开启异步执行器,异步才会自动异步执行,比如异步工作、定时器工作等--> <property name="asyncExecutorActivate" value="true" />
- 发布
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); }
- 根据控制台打印的流程实例ID(关闭异步执行器),查看一般工作数据库:act_ru_job
三、定时任务
- 介绍: 定时任务测试,任务在定时期间会产生定时job,存储在表 act_ru_timer_job 中。
定时时间到了之后将会被删除,同时需要配置中开启异步执行器才会自动执行
遇到问题: 定时任务到时间后,没有继续执行,需要确定
已解决: 程序不能关闭,不然定时时间到了,任务执行不了 - 设计流程
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>
- 发布定时任务(记得打开异步执行器)
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);
- 查看数据库
四、挂起(暂停)任务
- 设计流程:与上面的定时任务一样,只是把定时时间改为5分钟(留有时间操作)。
<timerEventDefinition> <!--定时5分钟--> <timeDuration>PT5M</timeDuration> </timerEventDefinition>
- 发布
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);
- 在对应的时间里去查看act_ru_suspended_job和act_ru_timer_job,可以看到任务的转变
五、不可执行任务
- 设计流程:流程和上面的异步任务一样,不过委托类换一个如下。我们需要手动报错
public class ExceptionDelegate implements JavaDelegate { @Override public void execute(DelegateExecution execution) { System.out.println("这是执行器"); //测试不可执行的任务,手动出错 throw new RuntimeException("always exception 手动抛出"); } }
- 编码发布(记得打开异步执行器)
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);
- 查看不可执行的任务数据库表:act_ru_deadletter_job