1

かなり標準的な 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 回供給されることを意味します。では、これを防ぐにはどうすればよいでしょうか。

4

1 に答える 1

0

同じ問題がありました。私の場合、理由は@Scheduled注釈のinitialDelayパラメーターの不在でした-アプリケーションの開始時にメソッドが呼び出されました。

于 2016-07-02T19:39:17.013 に答える