Ich wollte @Async
Methoden (für das parallele Senden von Mails) in meiner SpringBoot-Anwendung einführen. Aber wenn ich die @EnableAsync
Annotation auf unserer Hauptklasse (mit @SpringBootApplication
annotiert) setzen, werden die Flyway DB-Migrationen ausgeführt, bevor die DataSourceInitializer
(die schema.sql und data.sql für meine Tests ausführt) ausgeführt wird.Spring @EnableAsync bricht die Initialisierungsreihenfolge der Bean ab?
Die erste Operation mit einer 'zu migrierenden' Datenbanktabelle schlägt fehl.
Durch das Entfernen der @EnableAsync
wird alles wieder normal. Warum passiert das und wie kann ich das beheben (oder das Problem umgehen)?
aktualisieren Einige weitere Erkenntnisse: @EnableAsync(mode = AdviceMode.ASPECTJ)
hält die ursprüngliche Reihenfolge der DB-Setup, aber die @Async
Verfahren läuft auf dem selben Thread wie Anrufer-Thread dann. Ich habe auch gesehen, dass der Bean 'objectPostProcessor' früher erstellt wird (3. Bean), wenn @EnableAsync
nicht vorhanden ist oder @EnableAsync(mode = AdviceMode.ASPECTJ)
verwendet wird. Wenn nur @EnableAsync
verwendet wird, wird diese Bean viel später erstellt.
Update 2 Während ich nicht in der Lage war, ein minimal-Projekt zu erstellen, die noch das Problem reproduziert, fand ich heraus, dass die richtige DB-Setup, um in meiner betroffenen Anwendung gestellt wird, wenn ich die @EnableWebSocketMessageBroker
in dem folgenden Kommentar aus:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer
{
...
}
Bean 'webSocketConfig' ist die erste bean erstellt (gemäß INFO-level Konsolausgabe), wenn @EnableWebSocketMessageBroker
vorhanden ist.
Erhalten Sie irgendwelche Fehler von Flyway? Wie stellen Sie sicher, dass das asynchrone Zeug immer noch ausgeführt wird, nachdem die Migration abgeschlossen wurde? – Thilo
Bitte überprüfen Sie mein Update zu der Frage. Eigentlich scheint die Migration gut zu funktionieren, die gesamte DB wird später neu erstellt. – sorrymissjackson
Ich verstehe die Frage nicht. Sie müssen den Migrationscode ausführen, bevor Sie versuchen, die Datenbank zu verwenden. Warum möchten Sie es "asynchron" ausführen? – Thilo