37

ここに、5秒ごとに実行するように設定された簡単なテスト方法がありますが、System.outを見ると、奇妙なことをしているように見えます。

@Scheduled(cron="*/5 * * * * ?")
public void testScheduledMethod() {
     System.out.println(new Date()+" > Running testScheduledMethod...");
}

出力:

Wed Jan 09 16:49:15 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:15 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:20 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:20 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:25 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:25 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:30 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:30 GMT 2013 > Running testScheduledMethod...

なぜ毎回2回(表示)実行されているのですか?

4

24 に答える 24

27

ドキュメントを見ると、この現象を明示的に呼び出すメモがあります。

メモはこのリンクのセクション 25.5.1 の下にあり、次のように書かれています。

そのようなインスタンスごとにコールバックをスケジュールする場合を除き、実行時に同じ @Scheduled アノテーション クラスの複数のインスタンスを初期化していないことを確認してください。これに関連して、@Scheduled でアノテーションが付けられ、通常の Spring Bean としてコンテナーに登録されている Bean クラスで @Configurable を使用しないようにしてください。 、各 @Scheduled メソッドが 2 回呼び出される結果となります。

現時点では、これが単なる提案であることは理解していますが、問題をさらに診断するのに十分な情報が得られていないと思います。

于 2013-01-09T17:24:14.433 に答える
3

コンテキストリスナーが原因で発生しています

取り除くだけ

<リスナー>

< リスナークラス >org.springframework.web.context.ContextLoaderListener< /リスナークラス >

< /リスナー>

web.xml から動作するはずです。

于 2014-01-12T08:10:09.377 に答える
2

同様の問題が発生しました。以下の理由が考えられます。

  1. 春バージョンのバグ https://jira.spring.io/browse/SPR-10830

  2. コンテキストが 2 回読み込まれています。

  3. log4j.xml がログを 2 回書き込みます。それは私の場合に起こりました。あなたのことはわかりません。他のオプションを試した場合は、これも試してください。

于 2015-01-15T09:11:56.733 に答える
1

私はこれと同じ問題を抱えていましたが、最終的に、 と で作成された Bean の結果として問題が発生していることがわかりましroot contextservlet context

したがって、これを修正するには、Bean の作成を適切なコンテキストに分離する必要があります。

この回答は、その方法を非常によく説明しており、私の問題を解決しました。

于 2015-02-23T23:17:12.523 に答える
0

この投稿とSpring Jiraによると、これはSpring Framework Schedulerコンポーネントのバグです。

于 2014-10-30T06:58:34.720 に答える
0

私の場合、ジョブの Bean には @Component アノテーションがあり、これは applicationContext.xml にありました。

<task:annotation-driven/> <bean id="getxxx" class="com.kitar.xxxx.jobs.RomeExample"></bean>

したがって、解決策は、次の理由により、Bean 定義 (2 行目) を削除することです。

<task:annotation-driven/>: Spring 管理オブジェクトで @Async および @Scheduled アノテーションを検出できるようにするため、ジョブの Bean を定義する必要がなく、2 回呼び出されます。

于 2014-08-03T19:10:03.407 に答える
0

私は同じ状況に直面し、これで解決しました:

1) スケジューラーサービス

@Service
public class SchedulerService {

    @Autowired
    @Qualifier("WorkerClass")
    private Worker worker;

    @Scheduled(cron="0/5 * * * * ?", zone="Asia/Colombo")//zone is a sample
    public void doSchedule() {
        worker.work();
    }

}

2) 労働者階級

@Component("WorkerClass")
public class WorkerClass implements Worker {

    @Override
    public void work() {
        doSomething();
    }

    protected void doSomething() {
        system.out.pringln("What must I do?");
    }

}
于 2016-06-01T12:43:06.450 に答える
-1

今日も同じ問題がありました。

私のプロジェクトでは、スプリング ブート アプリケーションでスケジューラを使用し、ScheduledTaks クラスでは @Component アノテーションを使用していました。しかし、@Component は私のクラスの Bean を表し、Application クラスでコードを使用してこのクラスの別の Bean を作成したため、間違いを犯しました。

public class Application extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
      return application.sources(Application.class);
  }

  public static void main(String[] args) throws Exception {
      SpringApplication.run(Application.class, args);
  }

  @Bean
  public ScheduledTasks getScheduledTasks() {
    return new ScheduledTasks();
  }
}

この注釈を削除するだけで、スケジューラは完全に機能します。

私のコードのScheduledTasksクラスの例に従ってください:

public class ScheduledTasks {
  private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

  @Scheduled(cron = "00 14 11  * * *")
  public void reportCurrentTime() {
    log.info("The date is: {} " + dateFormat.format(new Date()) );
  }
}

そして結果:

2016-10-20 11:13:41.298  INFO 6832 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-10-20 11:13:41.302  INFO 6832 --- [           main] br.com.Application                       : Started Application in 9.257 seconds (JVM running for 9.676)
2016-10-20 11:14:00.002  INFO 6832 --- [pool-2-thread-1] br.com.scheduler.ScheduledTasks          : The date is: {} 11:14:00
于 2016-10-20T14:19:52.017 に答える