专栏首页指缝阳光第十节:Activiti6.0——四种Job工作的产生与管理

第十节: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>
  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

三、定时任务

  1. 介绍: 定时任务测试,任务在定时期间会产生定时job,存储在表 act_ru_timer_job 中。 定时时间到了之后将会被删除,同时需要配置中开启异步执行器才会自动执行 遇到问题: 定时任务到时间后,没有继续执行,需要确定 已解决: 程序不能关闭,不然定时时间到了,任务执行不了
  2. 设计流程 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>
  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. 查看数据库

四、挂起(暂停)任务

  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_jobact_ru_timer_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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hadoop专业解决方案-第3章:MapReduce处理数据

    前言:非常感谢团队的努力,最新的章节终于有了成果,因为自己的懒惰,好久没有最新的进展了,感谢群里兄弟的努力。

    数据饕餮
  • Activiti工作流框架学习笔记(二)之springboot2.0整合工作流Activiti6.0

    以前在工作当中做过不少与工作流Activiti有关的工作,当时都是spring集成activiti5.22的项目,现在回过头去看,其实版本已经稍微老了,因此,基...

    朱季谦
  • 开源的作业调度框架 - Quartz.NET

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.n...

    张善友
  • 大数据高速计算引擎Spark

    从狭义的角度上看:Hadoop是一个分布式框架,由存储、资源调度、计算三部分组 成; Spark是一个分布式计算引擎,由 Scala 语言编写的计算框架,基于内...

    用户2337871
  • Spark作业基本运行原理解析!

    我们使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程。提交作业的节点称为Master节点,Driver进程就是...

    石晓文
  • Google披露:大规模集群管理工具Borg的细节

    大数据文摘
  • 打造企业级pipeline服务的18个疑问

    Jenkins已经成为大量公司最常用的一种持续集成工具了,但是目前pipeline的普及程度可能依然低于30%,大量的团队依然使用自由风格这种笨重的方式,给统一...

    JFrog杰蛙科技
  • 第二章:Quartz API、调度任务以及触发器

    其实Job就是使用者需要实现的调度任务接口,它以JobDetail的形式存放在Quartz管理的内存或者表里面。

    Throwable
  • Activiti工作流学习笔记(三)——自动生成28张数据库表的底层原理分析

    网上关于工作流引擎Activiti生成表的机制大多仅限于四种策略模式,但其底层是如何实现的,相关文章还是比较少,因此,觉得撸一撸其生成表机制的底层原理。

    朱季谦
  • spring batch精选,一文吃透spring batch

    批处理是企业级业务系统不可或缺的一部分,spring batch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务.Spri...

    kl博主
  • 一篇文章全面解析大数据批处理框架Spring Batch

    如今微服务架构讨论的如火如荼。但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易。在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理。针对...

    yuanyi928
  • 第一章 介绍与循环

    玩蛇的胖纸
  • Flink面试通关手册

    2019 年是大数据实时计算领域最不平凡的一年,2019 年 1 月阿里巴巴 Blink (内部的 Flink 分支版本)开源,大数据领域一夜间从 Spark ...

    大数据真好玩
  • Flink面试通关手册

    2019 年是大数据实时计算领域最不平凡的一年,2019 年 1 月阿里巴巴 Blink (内部的 Flink 分支版本)开源,大数据领域一夜间从 Spark ...

    王知无-import_bigdata
  • 小白也能玩转Kubernetes 你与大神只差这几步

    6月30日,腾讯云联合InfoQ举办的云+社区技术沙龙,以Kubernetes 上云一键部署、云上大规模计算平台构建、CIS底层技术实现、Tencent Hub...

    云加社区技术沙龙
  • GoCD的正确打开方式|洞见

    事件:ThoughtWorks在2016年11月发布的技术雷达中将“Jenkins as a deployment pipeline”列为了“暂缓”。 Jenk...

    ThoughtWorks
  • Google资源管理器简析

    9.2.2 Borg[1] Borg是一个集群管理器,负责对来自几千个应用程序所提交的Job进行接收、调试、启动、停止、重启和监控,这些Job将用于不同的服务...

    大数据和云计算技术
  • Docker与k8s的恩怨情仇(六)—— “容器编排”上演“终结者”大片

    在上节中,我们为大家介绍了Pod的基础内容,Kubernetes如何站在上帝视角上处理容器和容器之间的关系。但仅仅有Pod却还不够,对于大部分用户而言如何调度和...

    葡萄城控件
  • 结合Kubernetes解读微服务的12要素

    如果你在使用容器来构建应用的话,一定听过什么是“12要素原则”。“12要素”为开发微服务提供了一组明确的指引。人们相信只要遵循这些原则,就可以更容易的运行、扩展...

    yuanyi928

扫码关注云+社区

领取腾讯云代金券