在业务流程中,经常会有一些需要定期执行的任务,比如定时发送邮件、生成报表等。在Activiti工作流引擎中,我们可以使用调度任务和定时触发器来实现这些需求。
调度任务
调度任务是指在指定的时间间隔内重复执行的任务。Activiti中使用TimerStartEvent
和TimerBoundaryEvent
来实现调度任务。
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工作流引擎中,我们可以使用调度任务和定时触发器来实现定期执行的任务。调度任务可以在流程实例启动时或执行过程中重复触发,定时触发器则用于执行一次性的定时任务。通过灵活使用调度任务和定时触发器,我们可以实现各种业务场景中的定时任务需求。
本文来自极简博客,作者:无尽追寻,转载请注明原文链接:Activiti中的调度任务与定时触发器