2012-11-06 30 views
1

好吧,我瀏覽了所有可以找到的內容,但沒有找到我的問題的答案。幾件物品很近但不夠近。我有一個Spring 3.0.7基於Web的應用程序在Tomcat中7.在applicationContext.xml中運行我有:Spring 3.0.7 CronTrigger在觸發時多次執行任務

<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以上)執行。問題是,他們在正確的觸發時間執行多次。例如,如果一個新任務具有'* */2 * * * *'的cron模式,它應該每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 * * * *) 
+0

你可以檢查彈簧上下文被加載了多少次?你還可以檢查任務每分鐘執行50次嗎? (或者是數量在增加?) –

+0

正在處理它... – Scott

+0

在上面添加了更多信息。我似乎無法弄清楚如何判斷上下文被加載了多少次。我試着添加一個ApplicationListener ,但我從來沒有看到它的任何日誌輸出。 – Scott

回答

4

明白了。現在我感到很蠢。原來我並不瞭解cron模式。我用

* */2 * * * * 

思維應該運行每兩分鐘。真正做的是每兩分鐘運行一次自上次觸發後經過的每秒鐘。正確的模式是:

0 */2 * * * * 
0

它看起來像你安排更多的任務作爲你的計劃任務的一部分?

你的XML配置中的原始cron觸發器會不確定地運行......你真的想安排更多的任務嗎?

+1

是的,我需要的XML調度程序定期運行該線程,所以我可以安排其他線程必須動態處理。 – Scott

相關問題