第十节:Activiti6.0——四种Job工作的产生与管理
时间:2022-07-25
本文章向大家介绍第十节:Activiti6.0——四种Job工作的产生与管理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、概述
介绍: 流程在执行过程中会产生不同的任务。
- 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
- Spring MVC 基于Method的映射规则(注解版)
- 程序员需要知道的8个Linux命令
- 学好webpack,一名前端开发工程师的自我修养
- 活动安排问题--贪心算法
- Spring MVC 基于URL的映射规则(注解版)
- Ruby中如何识别13位的时间戳
- 小瓜牛漫谈 — String
- [logstash-input-http] 插件使用详解
- 在Elasticsearch中查询Term Vectors词条向量信息
- 使用asp调用.net xml web services
- 数组乘积--满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出
- 锋利的JQuery —— 选择器
- 套接字选项
- CSS 之 选择器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【论文笔记】Improved Residual Networks for Image and Video Recognition(ResNet新变体:IResNet)
- SQL语句在MYSQL中的运行过程和各个组件的介绍
- (五)golang--常用的一些玩意
- 关于MYSQL 的日志系统
- (六)golang--变量
- springmvc之文件上传
- (七)golang--变量之基本数据类型(看这篇就够了)
- Mybatis学习笔记(五)Mybatis中已经显示数据已修改但数据库中记录未更新问题
- 【自然语言处理(一)】相关基础技能
- MySQL innoDB的事务隔离
- 多元线性回归模型
- (八)golang--复杂类型之指针
- 关于HttpPost 请求和PostMan请求访问出错
- Proxy与Reflect学习笔记
- 确定的有穷状态机(DFA) -- 你来看也能懂的C++代码示例