我想创建配置/ bean以在我的开发配置文件中自动启动H2DB。我想让它作为tcp服务器运行。需要在任何DataSource配置之前启动它。有人能告诉我如何实现这个目标吗?
我做了什么
@Profile("h2")
@Component
public class H2DbServerConfiguration implements SmartLifecycle {
private static final Logger logger = LoggerFactory.getLogger(H2DbServerConfiguration.class);
private Server server;
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void stop(Runnable callback) {
stop();
new Thread(callback).start();
}
@Override
public void start() {
logger.debug("############################################");
logger.debug("############################################");
logger.debug("STARTING SERVER");
logger.debug("############################################");
logger.debug("############################################");
try {
server = Server.createTcpServer("-web", "-webAllowOthers", "-webPort", "8082").start();
} catch (SQLException e) {
throw new RuntimeException("Unable to start H2 server", e);
}
}
@Override
public void stop() {
logger.debug("############################################");
logger.debug("############################################");
logger.debug("STOPPING SERVER");
logger.debug("############################################");
logger.debug("############################################");
if (server != null)
if (server.isRunning(true))
server.stop();
}
@Override
public boolean isRunning() {
return server != null ? server.isRunning(true) : false;
}
@Override
public int getPhase() {
return 0;
}
}
但这对我来说不是一个选项,因为组件是在数据源之后创建的(我已经设置了liquibase,所以它为时已晚)而且Phase仍然是相同的,这意味着FIFO顺序和I' d喜欢成为FILO。
答案 0 :(得分:0)
将您的服务器创建为bean:
@Bean(initMethod = "start", destroyMethod = "stop")
Server h2Server() throws Exception {
return Server.createTcpServer("-tcp","-tcpAllowOthers","-tcpPort","9192");
}
现在你可以配置spring来创建其他bean(例如数据源) 在使用@DependsOn的bean h2Server之后
@DependsOn("h2Server")
@Bean
DataSource dataSource(){
...
}
嗨,使用弹簧靴怎么样?它已自动配置数据源,因此我不想重新配置它。
你是对的,要使用上述方法,你必须创建自己的数据源,以便用@DependsOn注释它。
但看起来这不是必要的。 在我的一个项目中,我正在创建h2Server作为所描述的bean。 我使用spring创建的数据源,所以没有任何@DependsOn。 它完美地运作。试试吧。
使用SmartLifecycle的解决方案不起作用,因为它在ApplicationContext刷新时创建服务器,这在创建所有bean(包括数据源)之后发生。
答案 1 :(得分:0)
将@Profile和@Component接缝混合给我一个坏主意。配置文件旨在与配置(documentation)
一起使用你真的需要个人资料吗?在我看来,如果您有几种可能的配置,一种基于H2,并且您希望能够在这些配置之间切换(通常在开始时通过设置属性......),这是有道理的。
使用bean(documentation)接缝管理H2服务器对我来说是正确的(正如Stefen所建议的那样)。也许你会更喜欢注释......如果你想要一个弹簧轮廓,那么你也需要一个Configuration对象。它只会加载H2服务器bean(在我看来,使用bean管理H2服务器生命周期比使用context / config更好)。