【问题标题】:How to run setup code for WAR file in External Tomcat Server如何在外部 Tomcat 服务器中运行 WAR 文件的设置代码
【发布时间】:2020-06-10 20:53:57
【问题描述】:

我正在构建一个 Spring Boot 应用程序,一开始,我需要检查一些系统文件并使用应用程序在那里找到的信息准备一些数据库池。通常,我会将它包含在 @SpringBootApplication 注释类的主要方法中,但是,当我将我的应用程序作为 WAR 文件部署到外部 Tomcat 服务器时,该主类似乎没有运行。我已经检查了你应该在那个主类中拥有什么,我的主应用程序类现在看起来像这样:

package com.companyname.projectname;

import com.companyname.projectname.database.DatabasePoolManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class WebApplication extends SpringBootServletInitializer {

    private static final Logger logger = LoggerFactory.getLogger(WebApplication.class);

    public static void main(String[] args) {
        ApplicationContext applicationContext = SpringApplication.run(WebApplication.class, args);
        DatabasePoolManager dpm = applicationContext.getBean(DatabasePoolManager.class);
        dpm.setUpPools();
        logger.error("\n\nIS ANYBODY OUT THERE?\n\n");
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        logger.error("\n\nIS ANYBODY OUT THERE? (But in the configure method)\n\n");
        return builder.sources(WebApplication.class);
    }

}

由于extendsconfigure 的覆盖,这与我的原始设置不同。

到目前为止,我的 Intellij IDE 仍然可以正常运行,但是一旦移动并部署到 tomcat 服务器,就不会出现任何日志消息。该应用程序仍然有效,但显然缺少一些授予其功能的设置(与数据库的连接)。当我将此应用程序部署为 WAR 文件时,我将如何在应用程序启动时运行一些设置代码?

【问题讨论】:

  • 将该设置代码放入ApplicationRunnerCommandLineRunner 中,这将在应用程序启动时执行。这样它就可以在任何一种情况下工作。我还想知道您需要设置什么样的池,以及您是否真的应该以不同的方式进行设置。
  • 这正是我所需要的,谢谢。我设置的只是 Hikari 数据库池,在设置过程中,我让我的程序查找本地 TNS 文件和密码服务,然后基于此创建池。您有其他方法可以做到这一点吗?
  • 这似乎有点骇人听闻?您如何在应用程序上下文中注册它们?最简单的方法是使setUpPools 方法成为一个init-method 或在启动后从应用程序侦听器调用它。这样它就可以在任何情况下工作。
  • 啊,好吧。所以类似于本文档第 2.3 节中的内容:baeldung.com/running-setup-logic-on-startup-in-spring
  • 类似的东西是的。另外,如果您知道有多少个游泳池,为什么不直接把它们做成豆子呢?或者甚至可以为它创建一个BeanDefinitionRegistryPostProcessor,这样您就可以添加 bean 定义,这些定义将由 Spring 处理和管理。在 Spring 之外创建池的事实再次让人感觉很笨拙。

标签: java spring spring-boot tomcat tomcat9


【解决方案1】:

再次感谢上面 cmets 中的 M. Deinum,为了在启动时运行一次,我使用了如下所示的这个新类:

package com.companyname.projectname;

import com.companyname.projectname.database.DatabasePoolManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class AppStartupRunner implements ApplicationRunner {

    @Autowired
    ApplicationContext applicationContext;

    private static final Logger logger = LoggerFactory.getLogger(AppStartupRunner.class);

    @Override
    public void run(ApplicationArguments args) throws Exception {
        DatabasePoolManager dpm = applicationContext.getBean(DatabasePoolManager.class);
        dpm.setUpPools();
    }
}

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多