自定义任务触发器 - Spring Framework
Preface
这几天做开发时有个比较特别的需求:当前时间的分钟数在 {5, 15, 25, 35, 45, 55} 的时候触发某个事件。Spring 自带的触发器(包括 Cron)都没法满足这个需求,于是就只能自定义一个触发器了。
Trigger
接口
写个类实现 org.springframework.scheduling.Trigger
,接口里唯一的一个方法 nextExecutionTime(TriggerContext): Date
需要返回一个 Date
类型的对象,表示下一次执行任务的时间。
class ExampleTaskTrigger : Trigger {
override fun nextExecutionTime(triggerContext: TriggerContext): Date {
// triggerContext 有3个方法可以分别用来获取到任务的计划执行时间、实际执行时间和执行完成的时间。
// 该 Trigger 被首次调用时,那3个方法的返回值都为 null。
}
}
nextExecutionTime
方法会在两种情况下调用:
- Spring 容器启动时
- 定时任务执行完成后
注册定时任务
参考下面的 Spring 配置文件。
ExampleClass
类没有继承任何类或实现任何方法,类内只有一个无参数的 taskMethod
方法。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<bean id="exampleClassBean" class="com.example.ExampleClass"/>
<bean id="exampleTaskTrigger" class="com.example.ExampleTaskTrigger"/>
<task:scheduled-tasks>
<task:scheduled ref="exampleClassBean" method="taskMethod" trigger="exampleTaskTrigger"/>
</task:scheduled-tasks>
</beans>
配置完成后,Spring 就会询问 exampleTaskTrigger.nextExecutionTime(TriggerContext)
来决定什么时候执行 exampleClassBean.taskMethod()
。
#Programming #Java #Spring Framework #Scheduled Task #Trigger