Flowable 定时器事件
  ZKWq2izDxIhQ 2023年12月08日 24 0


# 注意数据库时区的配置,如果差8小时配置成Asia/Shanghai
spring.datasource.url=jdbc:mysql://localhost:3306/flowable660?serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true

# 开启定时任务功能
flowable.async-executor-activate: true
  • timeDate 开始时间:指定一个具体的时间(yyyy-MM-ddTHH:mm:ss)之后触发。
  • timeDuration 持续时间(等待):延迟多少时间之后触发,例如延迟几个小时H、几分钟M、几秒S钟等。PT10M表示延迟等待10分钟。
  • timeCycle 循环时间:循环。R3/PT1M:表示每隔1分钟循环一次,总共循环3次。也支持使用Cron表达式。

一:定时器启动事件

定时器启动事件只需要部署,不需要启动流程实例,到了开始时间timeDate会自动发起流程实例并流转到下一个节点。

Flowable 定时器事件_延迟时间

Flowable 定时器事件_延迟时间_02

@RequestMapping("timerStart")
public Object timerStart() {
    Deployment deploy = repositoryService.createDeployment()
            .addClasspathResource("processes/TimerStartEventProcess.bpmn20.xml")
            .name("定时启动事件流程")
            .deploy();
    return deploy.getId();
}

Flowable 定时器事件_延迟时间_03


持续时间 timeDuration表示部署流程之后延迟指定时间后自动开启一个流程实例。
部署流程后就会往ACT_RU_TIMER_JOB中插入一条任务。注意如果开启了自动部署在程序启动时也算部署一次。注意:每部署一次就会开启一个流程实例。

timeCycle 循环时间:表示每隔多长时间执行一次,总共执行多少次。也支持Cron表达式配置。

Flowable 定时器事件_Deployment_04

二:中间计时器捕获事件

中间计时器捕获事件用于延迟时间到某个节点,等到了开始时间之后才会流转到下一个节点。注意:开始时间的日期格式是固定的带有T。

Flowable 定时器事件_flowable_05

@RestController
@RequestMapping("flowable")
public class FlowableController {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @RequestMapping("timer")
    public String timer() {
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("processes/TimerProcess.bpmn20.xml")
                .name("定时器流程")
                .deploy();
        System.out.println(deploy.getId());

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("TimerProcess");

        Task task = taskService.createTaskQuery()
                .processInstanceId(processInstance.getId())
                .singleResult();
        taskService.complete(task.getId());
        return task.getTaskDefinitionKey();
    }
}

ACT_RU_TIMER_JOB

Flowable 定时器事件_Deployment_06

到达指定时间2023-11-16 10:06:00会自动从“中间计时器捕获事件”进入到下一个节点。注意:定时任务加上代码处理时间和实际真正执行时间有稍微的延后。

Flowable 定时器事件_flowable_07


当前面的节点审批完成后需要延迟等待多长时间到后面的节点。

Flowable 定时器事件_xml_08

循环时间对于中间计时器捕获事件只有延迟时间生效,循环次数不生效,即只循环一次,只延迟一次循环时间。

三:边界计时器事件

边界计时器事件:当在指定时间内节点没有审批就会流转到其它节点交给其他人审批。

在绘制流程图时需要将 “边界计时器事件” 拖放到 UserTask的正上方。如果启动项目时报一下错误,可能是在绘制 “边界计时器事件” 时有问题, 可以重新拖动一下“边界计时器事件”的位置,然后重新部署

Flowable 定时器事件_延迟时间_09

Caused by: org.xml.sax.SAXParseException: cvc-complex-type.4: 元素 ‘boundaryEvent’ 中必须包含属性 ‘attachedToRef’。

<boundaryEvent id="sid-1AB618F7-3B28-444A-B38D-10EE232EF122" attachedToRef="UserTask1" cancelActivity="true">
  <timerEventDefinition>
    <timeDate>2023-11-16T10:45:00</timeDate>
  </timerEventDefinition>
</boundaryEvent>
@RequestMapping("boundarTimer")
public Object boundarTimer() {
    Deployment deploy = repositoryService.createDeployment()
            .addClasspathResource("processes/BoundaryTimerEventProcess.bpmn20.xml")
            .name("边界定时器事件流程")
            .deploy();
    System.out.println(deploy.getId());

    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("BoundaryTimerEventProcess");

    List<String> currentNodeList = taskService.createTaskQuery()
            .processInstanceId(processInstance.getId())
            .list().stream()
            .map(item -> item.getTaskDefinitionKey()).collect(Collectors.toList());
    return currentNodeList;
}

Flowable 定时器事件_延迟时间_10

Flowable 定时器事件_flowable_11

Flowable 定时器事件_xml_12

当到达UserTask1上面的边界定时时间设定的时间点时UserTask1对应的处理人还没有审批,节点就会交给UserTask3节点审批

Flowable 定时器事件_xml_13


当UserTask1在持续时间内还没有审批就流转到下一个节点。

Flowable 定时器事件_flowable_14


循环时间对于边界计时器事件只有延迟时间生效,循环次数不生效,即只循环一次,只延迟一次循环时间。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月08日 0

暂无评论

推荐阅读
ZKWq2izDxIhQ