【问题标题】:How to stop jobs scheduled using spring task如何停止使用 spring 任务安排的作业
【发布时间】:2012-10-02 14:18:27
【问题描述】:

我已经实现了一个示例spring计划任务,applicationContext如下,

<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="cron" method="show" cron="0/10 * * * * ?"/>
    <task:scheduled ref="cron" method="show2" cron="0/15 * * * * ?"/>
</task:scheduled-tasks>

<task:scheduler id="myScheduler" pool-size="10"/>

如何停止这种调度方法?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    ThreadPoolTaskScheduler 注入另一个bean,并调用shutdown()。如果这不可接受,您可以配置 cron bean 以接受标志。例如:

    public class Job() {
        private final AtomicBoolean stop = new AtomicBoolean(false);
    
        public void show() {
            if (stop.get()) {
                return;
            }
            ...
        }
    
        public void stop() {
            stop.set(true);
        }
    }
    

    请注意,这不会从调度程序中删除作业。防止这种情况发生的唯一方法是获取对ScheduledFuture 的引用并调用cancel()

    【讨论】:

    • 嗯,你能给我写一个示例方法来停止我的任务计划方法 show() 吗?
    • 好的,那么如何从调度程序中删除作业?可以给我一个例子吗?
    • 获取作业的引用,并调用取消。我已经在我的答案中添加了这个。
    • 我怎样才能对作业做参考?
    • 您必须手动添加到TaskScheduler,即不使用Spring config。
    【解决方案2】:

    取决于你所说的“停止”。

    1. 业务状况停止: 由于业务条件而停止,您应该在您的方法中评估这些条件,而只是不执行代码。这样您就可以在运行时停止不需要的执行,运行您的逻辑来处理结果失败的条件(日志记录、通知等)。

    2. 非商业条件: 将 chron 表达式外部化到属性文件,或者我更喜欢 JVM 中的系统变量。然后,您只需将属性值更改为 9999 场景即可停止任何执行。

    系统变量示例。

    <task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="cron" method="show" cron="#{systemProperties['chron1']}"/>
    <task:scheduled ref="cron" method="show2" cron="#{systemProperties['chron2']}"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 2011-05-02
      • 1970-01-01
      • 2023-04-04
      • 2019-05-20
      • 2017-08-18
      • 2019-06-28
      相关资源
      最近更新 更多