Spring batch 带cron表达式的Spring集成动态触发器

Spring batch 带cron表达式的Spring集成动态触发器,spring-batch,spring-integration,Spring Batch,Spring Integration,我在github中看到了示例动态触发器,它使用的是固定速率/延迟,但是否可以使用cron表达式实现动态触发器,在使用自定义退出代码完成作业后,我们希望cron表达式不再轮询当天的内容,或者将cron expressin更改为从diff time开始轮询向前。不幸的是org.springframework.scheduling.support.CronTrigger使用final字段,因此我们无法在运行时更改其状态。因此,任何寻求如何更改cron表达式值的想法都是浪费时间 从另一个让我们来看看这只

我在github中看到了示例动态触发器,它使用的是固定速率/延迟,但是否可以使用cron表达式实现动态触发器,在使用自定义退出代码完成作业后,我们希望cron表达式不再轮询当天的内容,或者将cron expressin更改为从diff time开始轮询向前。

不幸的是
org.springframework.scheduling.support.CronTrigger
使用
final
字段,因此我们无法在运行时更改其状态。因此,任何寻求如何更改
cron表达式
值的想法都是浪费时间

从另一个让我们来看看这只是一个<代码>时间生产者< /代码>解决方案,通知调度器什么时候启动一个提供的任务。 换句话说,这里是一个

触发器
合同源代码:

public interface Trigger {

    Date nextExecutionTime(TriggerContext triggerContext);

}
因此,我们的解决方案必须提供的只是为每个
nextExecutionTime
调用返回特定的
Date

这里您只需要做的是
动态触发器
实现,它适合您的需求

是的,要达到cron类似的行为可能有点困难,但您现在没有选择


虽然您可以在任务完成后
stop()。因此,任何寻求如何更改
cron表达式
值的想法都是浪费时间

从另一个让我们来看看这只是一个<代码>时间生产者< /代码>解决方案,通知调度器什么时候启动一个提供的任务。 换句话说,这里是一个

触发器
合同源代码:

public interface Trigger {

    Date nextExecutionTime(TriggerContext triggerContext);

}
因此,我们的解决方案必须提供的只是为每个
nextExecutionTime
调用返回特定的
Date

这里您只需要做的是
动态触发器
实现,它适合您的需求

是的,要达到cron类似的行为可能有点困难,但您现在没有选择


虽然您可以在任务完成后
stop()
您的适配器,但可以向它注入一个新的
CronTrigger
,然后再次
start()
它。

您可以编写一个自定义触发器,只需包装
CronTrigger
,您可以随意替换委托
CronTrigger

但是,
触发器
机制的一个限制是您不能更改现有的计划

如果正在轮询器线程上运行作业,则可以在轮询器线程返回之前更改触发器(并调用触发器以查找下一次执行时间)


Spring Integration 4.2(目前处于里程碑2)提供了一个新的触发器,它将使类似的事情变得更容易。

您可以编写一个自定义触发器,它只需包装一个
CronTrigger
,您可以随意替换委托
CronTrigger

但是,
触发器
机制的一个限制是您不能更改现有的计划

如果正在轮询器线程上运行作业,则可以在轮询器线程返回之前更改触发器(并调用触发器以查找下一次执行时间)


Spring Integration 4.2(目前处于里程碑2)提供了一个新的功能,这将使类似的事情变得更容易。

但是如果您使用控制总线停止adapater,它将如何在第二天启动而不通过其他应用程序调用。我们所需要的是,第一天,若作业成功完成,那个么使用动态触发器更改下一个计划时间,使其进入第二天。所以我相信扩展DynamicTrigger是正确的方法,只需覆盖nextscheduledTime方法。但如果您使用控制总线停止适配器,它将如何在第二天启动而不通过其他应用程序调用。我们所需要的是,第一天,若作业成功完成,那个么使用动态触发器更改下一个计划时间,使其进入第二天。所以我相信扩展DynamicTrigger是正确的方法,只需覆盖nextscheduledTime方法。