6

我已经实现了一个示例 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"/>

如何停止此计划方法?

4

2 回答 2

3

将 注入ThreadPoolTaskScheduler到另一个 bean 中,然后调用shutdown(). 如果这不可接受,您可以将cronbean 配置为接受标志。例如:

public class Job() {
    private final AtomicBoolean stop = new AtomicBoolean(false);

    public void show() {
        if (stop.get()) {
            return;
        }
        ...
    }

    public void stop() {
        stop.set(true);
    }
}

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

于 2012-10-02T14:30:48.980 回答
1

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

  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']}"/>

于 2012-10-02T14:38:31.843 回答