0

使用している: JBoss AS 7.1.1、Spring 3.1.0、Hibernate、..

以下があります:

applicationContext.xml スニペット:

    <task:scheduler id="taskScheduler" />
    <task:executor id="taskExecutor" pool-size="10" />
    <task:annotation-driven executor="taskExecutor"
            scheduler="taskScheduler" />

方法:

    import org.springframework.scheduling.annotation.Scheduled;
    ...
      @Scheduled(cron = "0 0 0 1 * *")
    public void reportMonthly() {
      // do database stuff.
    }

問題は、Web アプリケーションがクラスター (2 ~ 4 ノード) で実行され、すべてのノードがこのメソッドを呼び出すことです。どうすればそれを回避できますか?

それとも春の虫のようなものですか?

4

1 に答える 1

1

Springは、クラスターで実行していることをどのように知る必要がありますか?いいえ、それはSpringのバグではありません。

とにかくあなたが望む行動は何ですか?スケジューラーを1つのノードでのみ実行しますか?または、1つを除くすべてのタスクを1回だけ実行する必要がありますか?

それが最初の場合は、1つのノードを除くすべてのノードで何らかの構成手段を使用して、スケジューラー(または個々のタスク)を無効にする必要があります。

フェイルセーフの理由から、各ノードでスケジューラーを実行することをお勧めします。(単一の)データベースを使用してタスクを同期します。巧妙なロックメカニズムが必要ですが、基本的にタスクを実行する前に、データベースにクエリを実行して、その兄弟の1つがすでに実行されているかどうかを確認します。そうでない場合は、ステータス「running」をデータベースに書き込み、完了するとこれをクリアします。

于 2012-12-21T10:05:06.273 に答える