java - spring bean启动/关闭顺序配置(启动h2 db作为服务器)

标签 java spring spring-boot h2

我想创建配置/bean 以在我的开发配置文件中自动启动 H2DB。我想让它作为 TCP 服务器运行。它需要在任何数据源配置之前启动。有人可以告诉我如何实现这一目标吗?

我做了什么

@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 顺序,我想成为 FILO。

最佳答案

混合@Profile和@Component对我来说是个坏主意。配置文件旨在与配置 ( documentation ) 一起使用

您真的需要个人资料吗?在我看来,如果您有几种可能的配置(一种基于 H2),并且如果您希望能够在这些配置之间进行切换(通常在启动时通过设置属性...),那么这是有意义的。

使用 bean ( documentation ) 管理 H2 服务器对我来说是正确的(如 Stefen 的建议)。也许您会更喜欢注释...如果您想要一个 spring 配置文件,那么您也需要一个 Configuration 对象。它将简单地加载 H2 服务器 bean(在我看来,使用 bean 管理 H2 服务器生命周期比使用上下文/配置更好)。

关于java - spring bean启动/关闭顺序配置(启动h2 db作为服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37066925/

相关文章:

java - Spring boot 演示项目的问题

java - Spring Boot WAR 在 Tomcat 7 中不起作用,但在 Tomcat 8 中起作用

java - 为什么增强的 for 循环的局部变量必须是局部变量?

java - 如何在 Java 中为 true if 语句打印多个值?

java - Hibernate 显示错误,类未映射

java - 无法解析类型 org.springframework.beans.BeansException。它是从所需的 .class 文件中间接引用的

java - Spring Data 不保存相关实体

spring - grails 3 spring安全启动启动程序登录页面自定义

java - 无法从Spring云配置服务器中的GIT读取属性源

java - JScrollPane 困惑