我想@Async在我的 SpringBoot 应用程序中引入方法(用于并行发送邮件)。但是,当我将@EnableAsync注释放在我们应用程序的主@Configuration类上(用 注释@SpringBootApplication)时,Flyway DB 迁移会在执行之前执行DataSourceInitializer(它为我的测试运行 schema.sql 和 data.sql)。
涉及“应该迁移”的数据库表的第一个操作失败。
删除@EnableAsync使一切恢复正常。为什么会发生这种情况,我该如何解决这个问题(或解决这个问题)?
更新更多发现:@EnableAsync(mode = AdviceMode.ASPECTJ)保持数据库设置的原始顺序,但该@Async方法在与调用者线程相同的线程上运行。我还看到 Bean 'objectPostProcessor' 是在@EnableAsync不存在或@EnableAsync(mode = AdviceMode.ASPECTJ)使用时提前创建的(第 3 个 bean)。当使用 only 时@EnableAsync,这个 bean 会在很久以后创建。
更新 2虽然我还无法创建一个重现问题的最小项目,但当我@EnableWebSocketMessageBroker在以下注释中注释掉时,我发现受影响的应用程序中恢复了正确的数据库设置顺序:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer
{
...
}
如果存在,Bean 'webSocketConfig' 是创建的第一个 bean(根据 INFO 级控制台输出)@EnableWebSocketMessageBroker。