我想@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
。