@Async
SpringBoot アプリケーションに (メールを並行して送信するための) メソッドを導入したいと考えていました。しかし、@EnableAsync
アプリケーションのメイン@Configuration
クラス (注釈付き) に注釈を付けると、 (テスト用に schema.sql と data.sql を@SpringBootApplication
実行する) が実行される前に、Flyway DB の移行が実行されます。DataSourceInitializer
'should-be-migrated' データベース テーブルを含む最初の操作が失敗します。
を削除すると、@EnableAsync
すべてが正常に戻ります。これが発生する理由と、これを修正する方法 (または問題を回避する方法) を教えてください。
更新いくつかの調査結果: @EnableAsync(mode = AdviceMode.ASPECTJ)
DB セットアップの元の順序を保持しますが、@Async
メソッドは呼び出し元スレッドと同じスレッドで実行されます。また、Bean 'objectPostProcessor' が@EnableAsync
存在しない場合、または@EnableAsync(mode = AdviceMode.ASPECTJ)
使用されている場合に、早期に (3 番目の Bean) が作成されることも確認しました。only@EnableAsync
を使用すると、この Bean はかなり後で作成されます。
更新 2@EnableWebSocketMessageBroker
問題を再現する最小限のプロジェクトをまだ作成できませんでしたが、次のコードをコメントアウトすると、影響を受けるアプリケーションで適切な DB セットアップ順序が復元されることがわかりました。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer
{
...
}
Bean 'webSocketConfig' は、(INFO レベルのコンソール出力に従って) 作成された最初の Bean です (@EnableWebSocketMessageBroker
存在する場合)。