Springboot flyway migrate执行完毕再执行
2019-05-25 本文已影响0人
鹅鹅鹅_
我在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执行完毕后再执行数据库相关操作。要实现这个目标,有两种方法(其他方法也有,需要你自己探索了)
- 使用
DependsOn
对相关Bean添加依赖,让数据库相关DAO Bean依赖flyway的Bean。这样DAO Bean初始化和使用就会在flyway Bean初始化之后了。
@DependsOn({"flyway", "flywayInitializer"})
@Component
public class UserDao {
}
- 继承
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...");
}
}