かなり標準的な Spring Boot (1.3.5) アプリケーションを入手しました。
@EnableScheduling
(メイン アプリケーション エントリ ポイントと@Configuration
注釈付きクラスで試行された) でスケジューリングを有効にしました。
メソッドを使用して単純なクラスを作成しました@Scheduled
(単純な fixedDelay スケジュール)。
スケジュールされたタスクは 2 回 (常に) 実行されます。
これまでに収集したことから、おそらく 2 つのコンテキストがロードされているため、Bean が 2 回取得されています。Ok。すべての構成は基本的にSpring Bootの魔法を隠しているため、この二重実行を修正/防止するにはどうすればよいですか?
フレームワークのバージョン:
- スプリング ブート 1.3.5
- スプリング クラウド ブリクストン SR1
主な用途:
@SpringBootApplication
@EnableDiscoveryClient
@EnableAsync
@EnableCircuitBreaker
public class AlertsApplication {
public static void main(final String[] args) {
SpringApplication.run(AlertsApplication.class, args);
}
}
私のタスククラス(HookCreateRequestリストはから取り込まれますapplication.yml
-現在関連性があるとは思いませんが、必要に応じて提供できます):
@ConditionalOnProperty(name = "init.runner", havingValue = "InitRunner")
@ConfigurationProperties(prefix = "webhook")
public class InitRunner /*implements CommandLineRunner*/ {
private final List<HookCreateRequest> receivers = new ArrayList<>();
@Autowired
private WebHookService hookService;
@Scheduled (fixedRate = 300000)
public void run() throws Exception {
getReceivers().stream().forEach(item -> {
log.debug("Request : {}", item);
hookService.create(item);
});
}
public List<HookCreateRequest> getReceivers() {
return receivers;
}
}
xml 構成はありません。他に何が関連しているのかわかりませんか?
編集 2016/07/04
実行時にスケジュールされたインスタンスを出力するように変更しました (2 つの異なるインスタンスが作成されているのではないかと疑っていました)。ただし、ログはそれがタスク オブジェクトの同じインスタンスであることを示しているようです。logs:
15:01:16.170 DEBUG - scheduled.ScheduleHookRecreation - Schedule task running: scheduled.ScheduleHookRecreation@705a651b
...task stuff happening
...first run completes, then:
15:01:39.050 DEBUG - scheduled.ScheduleHookRecreation - Schedule task running: scheduled.ScheduleHookRecreation@705a651b
同じタスク インスタンス ( ) のように見えます@705a651b
。では、なぜ甘いものの名の下に 2 回実行されるのでしょうか?
編集 2016/07/05
@PostConstruct
スケジュールされたメソッドを実行するメソッドをクラスに追加し、ログ出力をいくつか追加しました。これにより、@PostConstruct
メソッドが 2 回呼び出されていることを確認できました。これは、Bean が 2 回取得されていることを確認しているようです。スケジューラに 2 回供給されることを意味します。では、これを防ぐにはどうすればよいでしょうか。