gpt4 book ai didi

Spring 3.0.7 CronTrigger触发时多次执行任务

转载 作者:行者123 更新时间:2023-12-01 22:41:04 24 4
gpt4 key购买 nike

好的,我已经查看了我能找到的所有内容,但没有找到我的问题的答案。一些项目很接近但不够接近。我有一个在 Tomcat 7 中运行的基于 Spring 3.0.7 的 Web 应用程序。在 applicationContext.xml 中我有:

<task:scheduler id="scheduledReportsScheduler" pool-size="1"/> 
<task:scheduled-tasks scheduler="scheduledReportsScheduler">
<task:scheduled ref="scheduledReportsQueuer" method="process" cron="0 */1 * * * *"/>
</task:scheduled-tasks>
<bean id="scheduledReportsQueuer" class="com.foo.scheduledServices.ScheduledReportsQueuerService"></bean>

这每分钟执行一次我的 ScheduledReportsQueuerService 类。那很好用。然后在该类中,我检查一些数据库表并尝试根据 CronTrigger 安排任务(如果尚未安排):

if(!_workers.containsKey(schedule.getRptScheduleId())){
_logger.debug(Thread.currentThread().getName() + " Creating and scheduling ScheduledReportQueuerWorker for scheduled report ID: "+schedule.getRptScheduleId()+"("+schedule.getReportName()+") "+schedule.getCronPattern());
ScheduledReportQueuerWorker newWorker = new ScheduledReportQueuerWorker(schedule);
newWorker.setRptRequestDAO(getRptRequestDao());
newWorker.setRptScheduleDAO(getRptScheduleDao());
_workers.put(schedule.getRptScheduleId(), newWorker);
ScheduledFuture<?> newFuture = _scheduler.schedule(newWorker, new CronTrigger(schedule.getCronPattern()));
_futures.put(schedule.getRptScheduleId(), newFuture);
}

private ConcurrentTaskScheduler _scheduler;

这似乎也适用于执行新任务(上面的 newWorker)。问题是它们在正确的触发时间被多次执行。例如,如果一个新任务的 cron 模式为 '* */2 * * * *',它应该每 2 分钟执行一次。相反,实际情况是任务每 2 分钟连续执行 50-60 次。

这让我抓狂,如果你能提供帮助,那就太好了。

更多信息 这是一些日志输出,您可以看到基于 XML 的线程启动,它告诉我们正在为一份报告创建一个线程,每两分钟运行一次。然后您会看到该报告每两分钟连续运行 60 次。

// here it schedules a single report to be run every 2 minutes
2012-11-19 08:30:02,876 DEBUG - ScheduledReportsQueuerService - scheduledReportsScheduler-1 Creating and scheduling ScheduledReportQueuerWorker for scheduled report ID: 20182(Jasper Test Report 1) * */2 * * * *

// here the worker thread gets kicked off 57 times
2012-11-19 08:30:03,016 INFO - workers.ScheduledReportQueuerWorker - !!!!!!!!!!!!! 20182 (* */2 * * * *)
...
2012-11-19 08:30:59,012 INFO - workers.ScheduledReportQueuerWorker - !!!!!!!!!!!!! 20182 (* */2 * * * *)

// two minutes later the worker thread gets kicked off 60 times
2012-11-19 08:32:00,017 INFO - workers.ScheduledReportQueuerWorker - !!!!!!!!!!!!! 20182 (* */2 * * * *)
...
2012-11-19 08:32:59,003 INFO - workers.ScheduledReportQueuerWorker - !!!!!!!!!!!!! 20182 (* */2 * * * *)

// two minutes later the worker thread gets kicked off 60 times
2012-11-19 08:34:00,019 INFO - workers.ScheduledReportQueuerWorker - !!!!!!!!!!!!! 20182 (* */2 * * * *)
...
2012-11-19 08:34:59,014 INFO - workers.ScheduledReportQueuerWorker - !!!!!!!!!!!!! 20182 (* */2 * * * *)

// two minutes later the worker thread gets kicked off 60 times
2012-11-19 08:36:00,010 INFO - workers.ScheduledReportQueuerWorker - !!!!!!!!!!!!! 20182 (* */2 * * * *)
...
2012-11-19 08:36:59,006 INFO - workers.ScheduledReportQueuerWorker - !!!!!!!!!!!!! 20182 (* */2 * * * *)

最佳答案

明白了。现在我觉得很愚蠢。原来我不理解 cron 模式。我用过

* */2 * * * * 

认为应该每两分钟运行一次。真正做的是每两分钟一次,在上次触发后的每一秒运行一次。正确的模式是:

0 */2 * * * *

关于Spring 3.0.7 CronTrigger触发时多次执行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13255644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com