停止/取消ScheduledFuture

时间:2013-03-26 16:45:47

标签: java spring scheduling

我能够调用start()函数来运行这个实现Runnable的季度度量报告调度服务来安排某个任务,但我还需要能够在以后的情况下停止/取消计划任务需要改变安排时间。

我已经阅读了很多帖子并尝试了几种方法使stop()功能正常工作,但没有运气。 我想我的问题也可以是如何找到/检索计划任务并取消它们?

请有人帮忙吗?非常感谢。

    @Configuration
    @EnableScheduling
    public class QuarterlyMetricReportScheduling{

        @Autowired
        QuarterlyMetricReportService qmrService;

        ScheduledFuture sf;

        CronTrigger trigger;

        int shutdownTimeout = 1 * 60 * 1000;//10 sec

        @Autowired
        QuarterlyMetricReportSchedulingService task;

        public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
            ThreadPoolTaskScheduler tps = new ThreadPoolTaskScheduler();
        tps.setThreadNamePrefix("job");
        return tps;
        }

        public void changeTrigger(String cronExpression){
        System.out.println("change trigger to: " + cronExpression);
        trigger = new CronTrigger(cronExpression);
        start();
        }

        public void start(){

        ThreadPoolTaskScheduler  tps = new ThreadPoolTaskScheduler();
        tps.initialize();
        task = new QuarterlyMetricReportSchedulingService();
        tps.schedule(task, trigger);
        }

        public void stop() {

        ThreadPoolTaskScheduler tps = threadPoolTaskScheduler();
        //tps = new ThreadPoolTaskScheduler();
        //tps.setThreadNamePrefix("job");
        tps.initialize();
            task = new QuarterlyMetricReportSchedulingService();
        trigger = new CronTrigger("0 59 11 26 3 ?");
        tps.schedule(task, trigger);
        ScheduledExecutorService scheduledExecutorService = tps.getScheduledExecutor();
            try {
            //ScheduledServiceExecutor service = 
                //Executors.newSingleThreadScheduledExecutor();
            task = new QuarterlyMetricReportSchedulingService();
            ScheduledFuture future = scheduledExecutorService.scheduleWithFixedDelay(
            task, 1, 1, TimeUnit.MILLISECONDS);

            future.cancel(true);
            scheduledExecutorService.shutdown();
            }


    }

1 个答案:

答案 0 :(得分:0)

您只在stop方法中安排任务,这似乎有点奇怪。

您需要在开始时安排任务,将未来保留为句柄,然后在stop方法中调用取消将来。

您应该创建一次线程池并将其用于所有报告,否则就没有池化。