Flowable中定时器的玩法详解

 更新时间:2022年11月02日 15:40:27   作者:江南一点雨  
这篇文章主要为大家详细介绍了Flowable中定时器的各种玩法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起了解一下

1. 流程定义定时激活

在之前松哥给小伙伴们介绍流程定义的时候,流程都是定义好之后立马就激活了,其实在流程定义的这个过程中,我们还可以设置一个激活时间,也就是流程定义好之后,并不会立马激活(不激活就不能据此流程定义创建新流程),而是在延迟某一个固定时间之后,才会激活,代码如下:

@RestController
public class ProcessDeployController {

    @Autowired
    RepositoryService repositoryService;

    @PostMapping("/deploy")
    public RespBean deploy(MultipartFile file,String tenantId) throws IOException {
        System.out.println(new Date());
        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment()
                .category("javaboy的工作流分类")
                .name("javaboy的工作流名称")
                .addInputStream("fff.bpmn", file.getInputStream())
                .tenantId(tenantId)
                .activateProcessDefinitionsOn(new Date(System.currentTimeMillis() + 1000 * 60))
                .key("javaboy的工作流key666");
        Deployment deployment = deploymentBuilder
                .deploy();
        return RespBean.ok("部署成功",deployment.getId());
    }
}

.activateProcessDefinitionsOn(new Date(System.currentTimeMillis() + 1000 * 60)) 表示流程在延迟一分钟之后,才激活。

此时,我们启动项目,然后调用该接口部署一个流程,部署完成之后,如果立马调用流程启动方法去启动流程,就会抛出如下异常:

可以看到,这里也说的很明确了,这个流程定义目前是一个挂起的状态,无法启动。

这个时候,我们去查看 ACT_RU_TIMER_JOB 表,就会发现该表中多了一条定时任务执行计划:

该表有一个 DUEDATE_ 字段,这个字段描述了这个定时任务执行的具体时间,在到达时间后,定时任务会自动执行,将 ACT_RE_PROCDEF 表中,流程的状态字段 SUSPENSION_STATE_ 由 2 改为 1。

2. 流程实例定时挂起

除了流程定义可以定时挂起外,流程实例也可以定时挂起。方式如下:

@Autowired
RepositoryService repositoryService;
@Test
void test23() {
    repositoryService.suspendProcessDefinitionByKey("UserTaskDemo", true, new Date(System.currentTimeMillis() + 120 * 1000));
}

这个执行完成后,也会在 ACT_RU_TIMER_JOB 表中添加一条定时任务,在两分钟之后,会自动挂起这个流程定义以及与之相对应的流程。实际上就是将对应表中的 SUSPENSION_STATE_ 字段值由 1 改为 2。

3. 定时任务执行过程

前面两个小节,松哥都和大家提到,ACT_RU_TIMER_JOB 表中会保存定时任务信息,时间到了就会自动执行。

但是小伙伴们注意,定时任务每次执行的时候,其实并不是去 ACT_RU_TIMER_JOB 表中查询数据,而是去 ACT_RU_JOB 表中查询数据并执行。

当定时的时间到了后,Flowable 会自动将数据从 ACT_RU_TIMER_JOB 表中移动到 ACT_RU_JOB 表中,然后定时器查询到 ACT_RU_JOB 表中的数据之后,就立马自动执行了。大致上就是这样一个流程。

我给大家手动演示一个。

我现在的流程定义和流程实例都挂起了,我想要在 4 分钟之后,将之全部启动,代码如下:

@Test
void test24() {
    repositoryService.activateProcessDefinitionByKey("UserTaskDemo", true, new Date(System.currentTimeMillis() + 240 * 1000));
}

当这行代码执行之后,4 分钟之后,流程定义和流程实例就全部都启动了。但是我现在忽然就不想等四分钟了,我想立马执行,那么我们可以去 ACT_RU_TIMER_JOB 表中找到这个定时任务的 ID,然后执行如下代码:

@Autowired
ManagementService managementService;
@Test
void test25() {
    managementService.moveTimerToExecutableJob("b7e9501d-5075-11ed-9706-acde48001122");
}

这个代码表示将 ID 为 b7e9501d-5075-11ed-9706-acde48001122 的记录由 ACT_RU_TIMER_JOB 表移动到 ACT_RU_JOB 表中,移动完成后,这个任务就会被立马执行。

当一个定时任务开启了,还能不能取消呢?当然可以!我们将这个定时任务放到私信队列表即可,私信队列表是 ACT_RU_DEADLETTER_JOB,具体操作方式如下:

@Test
void test27() {
    managementService.moveJobToDeadLetterJob("6b95dc62-5081-11ed-a00f-acde48001122");
}

上面这个方法执行的参数是 ACT_RU_TIMER_JOB 表中的任务 ID,执行完成后,ACT_RU_TIMER_JOB 表中对应的记录就会被移动到 ACT_RU_DEADLETTER_JOB 表中,所以定时任务就不会被执行了。

对于已经移动到私信队列的定时任务,也可以再通过如下方法移动回 ACT_RU_JOB 表中被立马执行(即使时间没到也会立马执行),如下:

@Test
void test26() {
    managementService.moveDeadLetterJobToExecutableJob("6b95dc62-5081-11ed-a00f-acde48001122", 10);
}

参数就是任务 ID。

到此这篇关于Flowable中定时器的玩法详解的文章就介绍到这了,更多相关Flowable定时器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Cloud Gateway不同频率限流的解决方案(每分钟,每小时,每天)

    Spring Cloud Gateway不同频率限流的解决方案(每分钟,每小时,每天)

    SpringCloud Gateway 是 Spring Cloud 的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。这篇文章主要介绍了Spring Cloud Gateway不同频率限流(每分钟,每小时,每天),需要的朋友可以参考下
    2020-10-10
  • 使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常)

    使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常)

    这篇文章主要介绍了使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • jdk动态代理源码分析过程

    jdk动态代理源码分析过程

    这篇文章主要介绍了jkd动态代理源码分析过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • java 如何查看jar包加载顺序

    java 如何查看jar包加载顺序

    这篇文章主要介绍了java 如何查看jar包加载顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 通过实例了解Spring中@Profile的作用

    通过实例了解Spring中@Profile的作用

    这篇文章主要介绍了通过实例了解Spring中@Profile的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 浅谈java实现重载的方法

    浅谈java实现重载的方法

    方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
    2015-09-09
  • SpringBoot集成slf4j2日志配置的实现示例

    SpringBoot集成slf4j2日志配置的实现示例

    本文主要介绍了SpringBoot集成slf4j2日志配置的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • mybatis xml中特殊字符处理及特殊符号

    mybatis xml中特殊字符处理及特殊符号

    这篇文章主要介绍了mybatis xml中特殊字符处理及mybatis特殊符号处理技巧,mybatis特殊符号处理给大家介绍了两种写法,感兴趣的朋友一起看看吧
    2018-03-03
  • 处理@PathVariable注解允许参数为空、允许不传参数的问题

    处理@PathVariable注解允许参数为空、允许不传参数的问题

    这篇文章主要介绍了处理@PathVariable注解允许参数为空、允许不传参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • JVM的7种垃圾回收器(小结)

    JVM的7种垃圾回收器(小结)

    这篇文章主要介绍了JVM的7种垃圾回收器(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论