动态不是 运行 @Scheduled 作业基于 Spring Boot 中 bean 的当前状态
Dynamically not running @Scheduled jobs based on current state of a bean in Spring Boot
我需要 runnning/not 运行 一个基于布尔值的 @Scheduled 作业,该布尔值在 bean 内部动态计算(周期性地并且通过 @Scheduled bean 读取文件并检查其内容)。我花了很多时间思考和谷歌搜索,直到现在才想出解决方案。
- @ConditionalOn* 不起作用,因为在初始化期间只读取一次
- 调度程序的子类化不起作用,因为调度方法也只在启动时调用一次
- 在预定方法中检查 属性 对我不起作用,因为它根本不能被调用
有人有好主意吗?
谢谢!
您可以通过编程方式启动和停止调度程序。
ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(<runnable>, <interval>);
然后你可以检查条件,如果它应该 运行 安排(或让它 运行)或者如果它不应该 运行 你取消它:
scheduledFuture.cancel(true);
我用 Aspect @Around Spring 的 @Scheduled 注释解决了它,然后没有调用 proceedingJoinPoint.proceed():
@Around("@annotation(org.springframework.scheduling.annotation.Scheduled)")
处理 Shedlock 不像 'easy' 但我能够用这个 @Around 停止执行然后返回 Optional.empty() (假装 Shedlock 无法获得锁):
@Around("execution(* net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider.lock(..)) "
+ "|| execution(* net.javacrumbs.shedlock.core.LockProvider.lock(..))")
我需要 runnning/not 运行 一个基于布尔值的 @Scheduled 作业,该布尔值在 bean 内部动态计算(周期性地并且通过 @Scheduled bean 读取文件并检查其内容)。我花了很多时间思考和谷歌搜索,直到现在才想出解决方案。
- @ConditionalOn* 不起作用,因为在初始化期间只读取一次
- 调度程序的子类化不起作用,因为调度方法也只在启动时调用一次
- 在预定方法中检查 属性 对我不起作用,因为它根本不能被调用
有人有好主意吗?
谢谢!
您可以通过编程方式启动和停止调度程序。
ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(<runnable>, <interval>);
然后你可以检查条件,如果它应该 运行 安排(或让它 运行)或者如果它不应该 运行 你取消它:
scheduledFuture.cancel(true);
我用 Aspect @Around Spring 的 @Scheduled 注释解决了它,然后没有调用 proceedingJoinPoint.proceed():
@Around("@annotation(org.springframework.scheduling.annotation.Scheduled)")
处理 Shedlock 不像 'easy' 但我能够用这个 @Around 停止执行然后返回 Optional.empty() (假装 Shedlock 无法获得锁):
@Around("execution(* net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider.lock(..)) "
+ "|| execution(* net.javacrumbs.shedlock.core.LockProvider.lock(..))")