# 注意数据库时区的配置,如果差8小时配置成Asia/Shanghai
spring.datasource.url=jdbc:mysql://localhost:3306/flowable660?serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
# 开启定时任务功能
flowable.async-executor-activate: true
一:中间计时器捕获事件
中间计时器捕获事件会到了开始时间之后就会自动流转到下一个节点。
注意:开始时间的日期格式是固定的带有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节点审批