天天看点

flowable边界定时事件没有生效原因

作者:半条命A

1、流程实例已经完成

当流程实例完成时,定时器边界事件将不再执行。请确保在定时器事件触发之前,流程实例处于活动状态。你可以通过Flowable的查询API(例如runtimeService.createProcessInstanceQuery())来验证流程实例的状态。

2、定时器事件的时间设置不正确

定时器边界事件的时间设置决定了在何时触发事件。请确保你的时间设置正确。例如,如果你的时间设置为“PT1M”,表示在进入定时器边界事件后1分钟触发事件。你可以通过检查流程定义中的时间设置来验证它们是否正确。

3、定时器事件的配置不正确

定时器边界事件需要正确的配置才能正常工作。请确保你的定时器事件配置正确,包括时间设置、定时器类型和其他属性。你可以通过检查流程定义中的边界事件配置来验证它们是否正确。

4、定时器事件的Job没有被正确地执行

Flowable使用Job来执行定时器边界事件。如果Job没有正确地执行,定时器边界事件将无法触发。请确保你的Job配置正确,并且具有足够的权限来执行Job。你可以通过检查Flowable引擎的日志来查看Job是否正在执行。

5、定时器事件的触发条件不满足

定时器边界事件需要满足触发条件才能触发。例如,如果你的定时器事件配置为“timeCycle”,则它将在每个时间周期结束时触发。如果时间周期设置为“R3/PT10S”,则事件将在第3个时间周期结束时触发。请确保你的触发条件设置正确。

下边是一个完整的案例:

首先,在pom.xml中添加以下依赖项:

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.7.0</version>
</dependency>           

接下来,创建一个简单的流程定义,该定义包含一个用户任务和一个定时器边界事件。将以下内容添加到名为"simple-process.bpmn20.xml"的文件中:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:flowable="http://flowable.org/bpmn"
             xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
             xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
             xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
             targetNamespace="http://www.flowable.org/processdef">

  <process id="simple-process" name="Simple Process" isExecutable="true">
    <startEvent id="start" />
    <userTask id="task" name="User Task" />
    <boundaryEvent id="timer" name="Timer Boundary Event">
      <timerEventDefinition>
        <timeDuration>PT10S</timeDuration>
      </timerEventDefinition>
    </boundaryEvent>
    <sequenceFlow id="flow1" sourceRef="start" targetRef="task" />
    <sequenceFlow id="flow2" sourceRef="task" targetRef="timer" />
    <sequenceFlow id="flow3" sourceRef="timer" targetRef="end" />
    <endEvent id="end" />
  </process>

  <bpmndi:BPMNDiagram id="simple-process-diagram">
    <bpmndi:BPMNPlane bpmnElement="simple-process" id="simple-process-plane">
      <bpmndi:BPMNEdge bpmnElement="flow1" id="flow1_di">
        <omgdi:waypoint x="215" y="120" />
        <omgdi:waypoint x="270" y="120" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape bpmnElement="start" id="start_di">
        <omgdc:Bounds height="30.0" width="30.0" x="180.0" y="105.0" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="task" id="task_di">
        <omgdc:Bounds height="80.0" width="100.0" x="270.0" y="70.0" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="flow2_di">
        <omgdi:waypoint x="370" y="110" />
        <omgdi:waypoint x="470" y="110" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape bpmnElement="timer" id="timer_di">
        <omgdc:Bounds height="30.0" width="30.0" x="470.0" y="85.0" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="flow3_di">
        <omgdi:waypoint x="500" y="110" />
        <omgdi:waypoint x="550" y="110" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape bpmnElement="end" id="end_di">
        <omgdc:Bounds height="28.0" width="28.0" x="550.0" y="105.0" />
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>

</definitions>           

在上面的流程定义中,当流程实例进入用户任务时,定时器边界事件会开始计时。如果在10秒内完成用户任务,则流程将顺利结束。否则,定时器边界事件将触发,并将流程实例移动到结束事件。

接下来,在Spring应用程序中配置Flowable引擎。创建一个名为"FlowableConfig.java"的类,并将以下内容添加到其中:

@Configuration
@EnableProcessApplication
public class FlowableConfig {

  @Bean
  public ProcessEngineConfigurationConfigurer processEngineConfigurationConfigurer() {
    return processEngineConfiguration -> {
      processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    };
  }

}           

这将配置Flowable引擎以使用与数据库相关的默认设置。

现在,创建一个名为"SimpleProcessApplication.java"的类,该类将扩展SpringProcessApplication(Flowable提供的默认应用程序类)。添加以下内容:

@SpringBootApplication
public class SimpleProcessApplication extends SpringProcessApplication {

  public static void main(String[] args) {
    SpringApplication.run(SimpleProcessApplication.class, args);
  }

}           

最后,创建一个名为"SimpleProcessTest.java"的测试类,该类将执行以下操作:

部署流程定义

启动流程实例

等待10秒钟,以等待定时器边界事件的触发

完成用户任务

确认流程已成功结束

以下是测试类的代码:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SimpleProcessApplication.class)
public class SimpleProcessTest {

  @Autowired
  private RuntimeService runtimeService;

  @Autowired
  private TaskService taskService;

  @Test
  public void testSimpleProcess() throws Exception {
    // 部署流程定义
    Deployment deployment = repositoryService().createDeployment()
      .addClasspathResource("simple-process.bpmn20.xml")
      .deploy();

    // 启动流程实例
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("simple-process");

    // 等待10秒钟
    Thread.sleep(10000);

    // 完成用户任务
    Task task = taskService.createTaskQuery()
      .processInstanceId(processInstance.getId())
      .singleResult();
    taskService.complete(task.getId());

    // 确认流程已成功结束
    assertNull(runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult());
  }

}           

运行测试类,你将看到流程成功启动并结束。在10秒钟内完成用户任务,流程将在用户任务之后立即结束。否则,流程将在10秒钟后由定时器边界事件触发,然后结束。

flowable边界定时事件没有生效原因

继续阅读