如何使用spring任务停止计划的作业

时间:2012-10-02 14:18:28

标签: java 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"/>

如何停止此计划方法?

2 个答案:

答案 0 :(得分:3)

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()

答案 1 :(得分:1)

取决于“停止”的含义。

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

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

  3. 系统变量示例。

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