前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【第十二篇】Flowable事件-定时器事件

【第十二篇】Flowable事件-定时器事件

作者头像
用户4919348
发布2022-04-13 15:39:10
2.4K0
发布2022-04-13 15:39:10
举报
文章被收录于专栏:波波烤鸭波波烤鸭

Flowable事件

  事件(event)通常用于为流程生命周期中发生的事情建模。事件总是图形化为圆圈。在BPMN 2.0中,有两种主要的事件分类:*捕获(catching)抛出(throwing)*事件。

  • 捕获: 当流程执行到达这个事件时,会等待直到触发器动作。触发器的类型由其中的图标,或者说XML中的类型声明而定义。捕获事件与抛出事件显示上的区别,是其内部的图标没有填充(即是白色的)。
  • 抛出: 当流程执行到达这个事件时,会触发一个触发器。触发器的类型,由其中的图标,或者说XML中的类型声明而定义。抛出事件与捕获事件显示上的区别,是其内部的图标填充为黑色。

1.定时事件

  定时触发的相关事件,包括定时器启动事件,定时器捕获中间件事件,定时器边界事件

1.1 定时器启动事件

  定时器启动事件(timer start event)在指定时间创建流程实例。在流程只需要启动一次,或者流程需要在特定的时间间隔重复启动时,都可以使用。

*请注意:*子流程不能有定时器启动事件。

*请注意:*定时器启动事件,在流程部署的同时就开始计时。不需要调用startProcessInstanceByXXX就会在时间启动。调用startProcessInstanceByXXX时会在定时启动之外额外启动一个流程。

*请注意:*当部署带有定时器启动事件的流程的更新版本时,上一版本的定时器作业会被移除。这是因为通常并不希望旧版本的流程仍然自动启动新的流程实例。

定时器启动事件,用其中有一个钟表图标的圆圈来表示。

在这里插入图片描述
在这里插入图片描述

案例:

在这里插入图片描述
在这里插入图片描述

在定时启动的节点设置时间:

在这里插入图片描述
在这里插入图片描述

可以通过FlowableUI中的部署来演示,通过FlowableUI我们可以看到,没有启动流程实例的情况下,到里23:14:14秒的时候自动帮助我们创建了一个流程实例。

在这里插入图片描述
在这里插入图片描述

1.2 定时器捕获中间事件

当第一个人工处理完成后,第二个人工处理的任务需要在2022-03-27T23:25:14之后执行

案例:

在这里插入图片描述
在这里插入图片描述

通过FlowableUI的案例演示我们可以看到后一个任务是在定时时间之后执行的

在这里插入图片描述
在这里插入图片描述

1.3 定时器边界事件

人工任务1如果在定义的2022-03-27T23:36:14这个时间之前还没有处理,那么就会触发定时边界事件,从而从人工任务3.

案例

在这里插入图片描述
在这里插入图片描述

发布启动流程

在这里插入图片描述
在这里插入图片描述

然后在张三这个位置我们不完成,等到定时到来,达到定时的时间,任务进入到了人工审批三

1.4 timeDuration

​   在定时事件中我们一定要放开如下的配置:

在这里插入图片描述
在这里插入图片描述

  指定计时器在启动前应等待多长的时间,首先一定时器启动事件为例:

开始事件
在这里插入图片描述
在这里插入图片描述

  可以通过FlowableUI的应用来验证

在这里插入图片描述
在这里插入图片描述

发布任务后然后我们等待两分钟就可以看到任务到了zhangsan的位置。或者我们也可以在SpringBoot整合Flowable的项目中添加对应的Controller来处理

代码语言:javascript
复制
    @Autowired
    private ProcessEngine processEngine;


    @GetMapping("/deploy")
    public String deploy(){
        Deployment deployment = processEngine.getRepositoryService().createDeployment()
                .addClasspathResource("test003.bpmn20.xml")
                .name("等待定时器启动事件")
                .deploy();
        return "部署任务成功....";
    }

提交请求完成部署操作

在这里插入图片描述
在这里插入图片描述

生成了对应的Task记录

在这里插入图片描述
在这里插入图片描述

注意:在事件中一定要开启异步任务,不然相关的事件是不会触发的!

在这里插入图片描述
在这里插入图片描述
中间事件

然后来看看中间事件的等待定时器事件案例:

在这里插入图片描述
在这里插入图片描述

案例由两个自动任务和一个定时器中间事件组成,在定时任务中绑定了两个JavaDelegate的Java类来处理

代码语言:javascript
复制
public class SignalStartOnedelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("-------触发了-111-------->"+ LocalDateTime.now().toString());
    }
}

public class SignalStartTwodelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("-------触发了222--------->"+ LocalDateTime.now().toString());
    }
}

然后流程图中的关联为

在这里插入图片描述
在这里插入图片描述

另一个类似,然后定时器中间事件的等待时间设置是2分钟。我们部署后通过Java代码来演示看看

代码语言:javascript
复制
    @Test
    public void test01() throws Exception{
        Deployment deployment = processEngine.getRepositoryService().createDeployment()
                .addClasspathResource("等待定时器中间事件.bpmn20.xml")
                .name("等待定时中间事件...")
                .deploy();
        System.out.println("-----");
    }

然后我们需要启动流程实例,之后等待两分钟看效果

代码语言:javascript
复制
    /**
     * 启动流程实例
     *
     */
    @Test
    public void startProcessInstanceByKey()  throws Exception{

        processEngine.getRuntimeService()
                .startProcessInstanceById("Test04:1:325edb10-ae95-11ec-a77f-c03c59ad2248");
        // 需要在此阻塞比等待长的时间
        TimeUnit.MINUTES.sleep(3);
    }
在这里插入图片描述
在这里插入图片描述
边界事件

最后我们来看看边界事件中的等待定时器的处理,案例为:

在这里插入图片描述
在这里插入图片描述

该案例由一个人工审核+两个自动任务+定时器边界事件组成,自动任务一绑定的JavaDelegate是

代码语言:javascript
复制
public class SignalStartOnedelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("-------触发了-111-------->"+ LocalDateTime.now().toString());
    }
}

自动任务二绑定的JavaDelegate是

代码语言:javascript
复制
public class SignalStartTwodelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("-------触发了222--------->"+ LocalDateTime.now().toString());
    }
}

定时器边界事件设置的是30S,也就是如果人工审核在30S还没处理就会触发边界事件:通过代码来演示,部署流程后需要启动流程,然后等待30S看控制台输出

代码语言:javascript
复制
    @Test
    public void test01() throws Exception{
        Deployment deployment = processEngine.getRepositoryService().createDeployment()
                .addClasspathResource("等待定时器边界事件.bpmn20.xml")
                .name("等待定时器边界事件...")
                .deploy();
        System.out.println("-----");
    }
代码语言:javascript
复制
    /**
     * 启动流程实例
     *
     */
    @Test
    public void startProcessInstanceByKey()  throws Exception{

        processEngine.getRuntimeService()
                .startProcessInstanceById("test05:1:c46f83bf-ae97-11ec-b055-c03c59ad2248");
        System.out.println("开始启动的时间:" + LocalDateTime.now().toString());
        // 需要在此阻塞比等待长的时间
        TimeUnit.MINUTES.sleep(3);
    }

等待控制台输出:

在这里插入图片描述
在这里插入图片描述

小结:timeDuration在三种定时器的事件中

  • 定时器启动事件:等待指定时间后启动流程实例
  • 定时器中间事件:AB任务中间有个定时器中间事件,A任务处理后需要等待对应的时间才能流转到B处
  • 定时器边界事件:任务A绑定了定时器边界事件后,如果在等待时间以内A没有处理任务,那么就会触发对应的边界事件

1.5 timeCycle

  指定重复周期,可用于周期性启动流程,或者为超期用户任务多次发送提醒,这个元素可以使用两种格式

  • 第一种是按照ISO 8601标准定义的循环时间周期。例如(三次重复间隔,每次间隔为10小时):R3/PT10H
  • 也可以使用timeCycle的可选属性endDate,或者像这样直接写在时间表达式的结尾:R3/PT10H/${EndDate}。 当到达endDate时,应用会停止,并为该任务创建其他作业
  • 也可以通过cron表达式来处理
开始事件

  编写案例来演示:

在这里插入图片描述
在这里插入图片描述

重复时间设置为 R3PT30S 重复3次,间隔30描述,自动任务绑定的是JavaDelegate

代码语言:javascript
复制
public class SignalStartOnedelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("-------触发了-111-------->"+ LocalDateTime.now().toString());
    }
}
在这里插入图片描述
在这里插入图片描述

然后我们部署看效果

代码语言:javascript
复制
    @Test
    public void test01() throws Exception{
        Deployment deployment = processEngine.getRepositoryService().createDeployment()
                .addClasspathResource("重复启动事件.bpmn20.xml")
                .name("等待定时器边界事件...")
                .deploy();
        System.out.println("-----");
        // 需要在此阻塞比等待长的时间
        TimeUnit.MINUTES.sleep(3);
    }
在这里插入图片描述
在这里插入图片描述

然后我们再指定下endDate来看看案例,直接可以在xml中来处理

代码语言:javascript
复制
      <timerEventDefinition>
        <timeCycle>R3/PT30S/2022-03-28T21:46:11+00:00</timeCycle>
      </timerEventDefinition>
在这里插入图片描述
在这里插入图片描述

此外还可以通过cron表达式来处理:

代码语言:javascript
复制
0 0/5 * * * ?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
中间事件

 timeCycle作为中间事件的话,只会执行一次,案例如下

在这里插入图片描述
在这里插入图片描述

案例中的自动任务一二对应绑定如下的JavaDelegate.

代码语言:javascript
复制
public class SignalStartOnedelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("-------触发了-111-------->"+ LocalDateTime.now().toString());
    }
}

public class SignalStartTwodelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("-------触发了222--------->"+ LocalDateTime.now().toString());
    }
}

中间事件的设置为R3/PT30S 循环3次,间隔30秒执行,但是这是中间事件,其实只会执行一次,我来看效果

部署后启动

代码语言:javascript
复制
@Autowired
    private ProcessEngine processEngine;

    @Test
    public void test01() throws Exception{
        Deployment deployment = processEngine.getRepositoryService().createDeployment()
                .addClasspathResource("循环中间事件.bpmn20.xml")
                .name("循环中间事件...")
                .deploy();
        System.out.println("-----");
    }

    /**
     * 启动流程实例
     *
     */
    @Test
    public void startProcessInstanceByKey()  throws Exception{

        processEngine.getRuntimeService()
                .startProcessInstanceById("cycle-middle-event:1:3456ade8-aea7-11ec-9064-c03c59ad2248");
        System.out.println("开始启动的时间:" + LocalDateTime.now().toString());
        // 需要在此阻塞比等待长的时间
        TimeUnit.MINUTES.sleep(3);
    }
在这里插入图片描述
在这里插入图片描述
边界事件

  在边界事件中,定义了循环条件R3/PT30S理论上要循环3次,间隔30S,单其实也只会执行一次,来看案例

在这里插入图片描述
在这里插入图片描述

案例上面的等待时间的是一样的,只是边界事件是30S

在这里插入图片描述
在这里插入图片描述

然后我们部署启动流程看效果

在这里插入图片描述
在这里插入图片描述

总结:循环设定

  • 启动事件:根据设置循环启动流程实例
  • 中间事件:即使设置了循环时间也只会触发异常
  • 边界事件:即使设置了循环时间也只会触发异常
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/04/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Flowable事件
    • 1.定时事件
      • 1.1 定时器启动事件
      • 1.2 定时器捕获中间事件
      • 1.3 定时器边界事件
      • 1.4 timeDuration
      • 1.5 timeCycle
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档