# 注意数据库时区的配置,如果差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
会自动发起流程实例并流转到下一个节点。
@RequestMapping("timerStart")
public Object timerStart() {
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("processes/TimerStartEventProcess.bpmn20.xml")
.name("定时启动事件流程")
.deploy();
return deploy.getId();
}
持续时间
timeDuration
表示部署流程之后延迟指定时间后自动开启一个流程实例。
部署流程后就会往ACT_RU_TIMER_JOB中插入一条任务。注意如果开启了自动部署在程序启动时也算部署一次。注意:每部署一次就会开启一个流程实例。
timeCycle 循环时间:表示每隔多长时间执行一次,总共执行多少次。也支持Cron表达式配置。
二:中间计时器捕获事件
中间计时器捕获事件用于延迟时间到某个节点,等到了开始时间之后才会流转到下一个节点。注意:开始时间的日期格式是固定的带有T。
@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
到达指定时间2023-11-16 10:06:00会自动从“中间计时器捕获事件”进入到下一个节点。注意:定时任务加上代码处理时间和实际真正执行时间有稍微的延后。
当前面的节点审批完成后需要延迟等待多长时间到后面的节点。
循环时间对于中间计时器捕获事件只有延迟时间生效,循环次数不生效,即只循环一次,只延迟一次循环时间。
三:边界计时器事件
边界计时器事件:当在指定时间内节点没有审批就会流转到其它节点交给其他人审批。
在绘制流程图时需要将 “边界计时器事件” 拖放到 UserTask的正上方。如果启动项目时报一下错误,可能是在绘制 “边界计时器事件” 时有问题, 可以重新拖动一下“边界计时器事件”的位置,然后重新部署
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;
}
当到达UserTask1上面的边界定时时间设定的时间点时UserTask1对应的处理人还没有审批,节点就会交给UserTask3节点审批
当UserTask1在持续时间内还没有审批就流转到下一个节点。
这里的示例也可以改为将指向UserTask3的节点改为指向UserTask2,意思是当多长时间内UserTask1没有审批就跳过当前节点进入下一个节点。
循环时间对于边界计时器事件只有延迟时间生效,循环次数不生效,即只循环一次,只延迟一次循环时间。