spring bean启动/关闭命令配置(启动h2 db作为服务器)

时间:2016-05-06 07:38:54

标签: java spring spring-boot h2

我想创建配置/ 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。

2 个答案:

答案 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更好)。