Activiti中的调度任务与定时触发器

无尽追寻 2021-11-02 ⋅ 19 阅读

在业务流程中,经常会有一些需要定期执行的任务,比如定时发送邮件、生成报表等。在Activiti工作流引擎中,我们可以使用调度任务和定时触发器来实现这些需求。

调度任务

调度任务是指在指定的时间间隔内重复执行的任务。Activiti中使用TimerStartEventTimerBoundaryEvent来实现调度任务。

TimerStartEvent

TimerStartEvent是一个开始事件,它可以在流程实例启动时触发。我们可以在流程的起始节点上添加TimerStartEvent,并设置它的定时触发条件。

定时触发条件可以使用不同的时间表达式来定义,常见的有以下类型:

  • 时间间隔触发:使用ISO 8601时间表达式表示,比如R/PT5M表示每5分钟触发一次。
  • 固定时间点触发:使用ISO 8601日期时间表达式表示,比如2022-01-01T00:00:00表示2022年1月1日零点触发。

下面是一个使用TimerStartEvent实现的定时调度任务的示例:

<bpmn:startEvent id="startEvent" name="Start">
  <bpmn:extensionElements>
    <activiti:timerEventDefinition>
      <activiti:timerDuration>R/PT5M</activiti:timerDuration>
    </activiti:timerEventDefinition>
  </bpmn:extensionElements>
</bpmn:startEvent>

上述示例中的定时触发条件是每5分钟触发一次。

TimerBoundaryEvent

TimerBoundaryEvent是一个边界事件,它可以在流程实例的执行过程中触发。我们可以在任务节点或其他中间事件上添加TimerBoundaryEvent,并设置它的定时触发条件。

下面是一个使用TimerBoundaryEvent实现的定时调度任务的示例:

<bpmn:userTask id="task" name="Task">
  <bpmn:incoming>sequenceFlow</bpmn:incoming>
  <bpmn:outgoing>sequenceFlow</bpmn:outgoing>
  <bpmn:extensionElements>
    <activiti:boundaryEvent id="boundaryEvent" name="Timer Boundary Event">
      <bpmn:timerEventDefinition>
        <bpmn:timeDuration>R/PT5M</bpmn:timeDuration>
      </bpmn:timerEventDefinition>
    </activiti:boundaryEvent>
  </bpmn:extensionElements>
</bpmn:userTask>

上述示例中的定时触发条件是在任务节点执行开始后的5分钟触发。

定时触发器

除了调度任务,Activiti还提供了定时触发器的功能,可以用于执行一次性的定时任务。定时触发器可以在流程实例执行过程中的任何节点上触发,比如用户任务、服务任务等。

定时触发条件

定时触发条件可以使用cron表达式来定义,它可以表示非常灵活的时间规则。cron表达式由6个部分组成,分别表示秒、分钟、小时、日期、月份和星期。下面是一个cron表达式的示例:

0 0/5 * * * ?

上述示例表示每隔5分钟触发一次。

设置定时触发器

要在Activiti中设置定时触发器,我们可以使用定时监听器或在流程定义中配置定时触发器。

定时监听器是一个实现了org.activiti.engine.delegate.ExecutionListener接口的Java类,可以在其notify方法中执行一次性的定时任务。

在流程定义中配置定时触发器可以使用TimerEventDefinition元素,它可以指定触发时间表达式、定时任务的类等信息。

下面是一个使用定时监听器实现的定时触发任务的示例:

public class TimerListener implements ExecutionListener {
    @Override
    public void notify(DelegateExecution execution) {
        // 执行定时任务的逻辑
    }
}

下面是一个使用定时触发器配置实现的示例:

<bpmn:startEvent id="startEvent" name="Start">
  <bpmn:extensionElements>
    <activiti:timerEventDefinition>
      <activiti:timeCycle>R/PT5M</activiti:timeCycle>
      <activiti:timerListener class="com.example.TimerListener" />
    </activiti:timerEventDefinition>
  </bpmn:extensionElements>
</bpmn:startEvent>

上述示例中的定时触发条件是每5分钟触发一次,同时会执行com.example.TimerListener中定义的逻辑。

总结

在Activiti工作流引擎中,我们可以使用调度任务和定时触发器来实现定期执行的任务。调度任务可以在流程实例启动时或执行过程中重复触发,定时触发器则用于执行一次性的定时任务。通过灵活使用调度任务和定时触发器,我们可以实现各种业务场景中的定时任务需求。


全部评论: 0

    我有话说: