我能够调用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();
}
}
答案 0 :(得分:0)
您只在stop方法中安排任务,这似乎有点奇怪。
您需要在开始时安排任务,将未来保留为句柄,然后在stop方法中调用取消将来。
您应该创建一次线程池并将其用于所有报告,否则就没有池化。