使用 Spring 以自定义固定速率调度作业
Spring 提供了一种使用注释来调度作业的便捷方法。但是,有时您可能需要动态设置固定速率。本文提出了一种使用 Spring 的 Trigger 机制的解决方案。
当前基于注解的方法
默认情况下,您可以使用 @Scheduled 和fixedRate 来指定执行之间的时间间隔。但是,此速率是静态的,如果不重新部署应用程序就无法更改。
解决方案:使用触发器
您可以配置自定义触发器,而不是依赖注释根据动态计算的值计算下一个执行时间。实现此目标的方法如下:
1.实现调度配置
创建一个遵循 SchedulingConfigurer 接口的配置类。此类将覆盖默认调度程序并注册您的自定义触发器。
@Configuration @EnableScheduling public class MyAppConfig implements SchedulingConfigurer { // ... }
2.定义一个触发器
实现一个返回下一次执行时间的触发器。在此示例中,我们根据您环境中存储的 myRate 属性计算下一次时间。
@Override public Date nextExecutionTime(TriggerContext triggerContext) { Calendar nextExecutionTime = new GregorianCalendar(); Date lastActualExecutionTime = triggerContext.lastActualExecutionTime(); nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date()); nextExecutionTime.add(Calendar.MILLISECOND, env.getProperty("myRate", Integer.class)); //you can get the value from wherever you want return nextExecutionTime.getTime(); }
3.注册触发器
在您的调度配置类中,为您的任务注册触发器。
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // ... taskRegistrar.addTriggerTask( new Runnable() { @Override public void run() { myBean().getSchedule(); } }, new Trigger() { // ... (Your trigger implementation) } ); }
通过使用这种方法,您可以为您的调度作业动态设置固定速率,允许您调整它而无需重新部署您的应用程序。
以上是如何在春季安排动态可调固定费率的工作?的详细内容。更多信息请关注PHP中文网其他相关文章!