1

さて、私は見つけることができるすべてを調べましたが、私の問題に対する答えは見つかりませんでした。いくつかのアイテムは近かったが、十分に近かった。私はTomcat7で実行されているSpring3.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クラスが1分ごとに実行されます。それはうまくいきます。次に、そのクラス内でいくつかのデータベーステーブルをチェックし、まだスケジュールされていない場合は、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分ごとに1回実行する必要があります。代わりに、タスクは2分ごとに50〜60回連続して実行されます。

これは、あなたが与えることができるどんな助けも素晴らしいだろうと私を狂わせています。

詳細ここにいくつかのログ出力があります。XMLベースのスレッドが開始され、2分ごとに1つのレポートを実行するためのスレッドを作成していることがわかります。次に、そのレポートが60回連続して実行される2分ごとに表示されます。

// 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 * * * *)
4

2 に答える 2

6

とった。今、私は愚かだと感じています。cron パターンを理解していなかったことが判明しました。使った

* */2 * * * * 

2分に1回実行する必要があると考えています。これが実際に行うことは、2 分に 1 回、最後のトリガーから経過した 1 秒ごとに実行することです。正しいパターンは次のとおりです。

0 */2 * * * *
于 2012-11-19T16:14:35.623 に答える
0

スケジュールされたタスクの一部として、さらに多くのタスクをスケジュールしているように見えますか?

xml 構成の元の cron トリガーは無期限に実行されます...もっと多くのタスクをスケジュールしますか?

于 2012-11-19T10:19:33.463 に答える