Springboot flyway migrate执行完毕再执行其他数据库操作

我在Springboot中同时集成了Akka actor和flyway。在WeatherActor中启动actor时执行了数据库查询写入等操作

@Override
    public void preStart() throws Exception {
        log.info(this.getClass().getSimpleName() + " preStart called");

        Duration timeout = Duration.create(2, TimeUnit.HOURS);
        getContext().setReceiveTimeout(timeout);

       //抓取天气数据,并存入数据库
        fetchWeatherData();

        super.preStart();
    }

然后启动测试程序,报错了。原因是flyway的migrate还未执行完毕,相关数据库表还没建立,然鹅actor已经启动,这个时候执行数据库相关查询当然会报错了。

org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "SUBSCRIBE" not found;

所以,我们的目标是在migrate执行完毕后再执行数据库相关操作。要实现这个目标,有两种方法(其他方法也有,需要你自己探索了)

  1. 使用DependsOn对相关Bean添加依赖,让数据库相关DAO Bean依赖flyway的Bean。这样DAO Bean初始化和使用就会在flyway Bean初始化之后了。
@DependsOn({"flyway", "flywayInitializer"})
@Component
public class UserDao {
}
  1. 继承FlywayMigrationStrategy。这种方式可以在migrate执行前后注入特定的操作。从执行日志也可以看到,真的起效果了,达到了我们的目标要求。
@Component
@Slf4j
public class CallbackFlywayMigrationStrategy implements FlywayMigrationStrategy {


    @Override
    public void migrate(Flyway flyway) {
        log.info("before flyway migration...");

        flyway.migrate();
       //fetchWeatherData();
        log.info("after flyway migration...");
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容