Как запустить код установки для файла WAR на внешнем сервере Tomcat

У меня есть приложение для весенней загрузки, которое я создаю, и в начале мне нужно проверить некоторые системные файлы и подготовить некоторые пулы баз данных, используя информацию, которую приложение находит там. Обычно я бы включил это в основной метод аннотированного класса @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);
    }

}

Это отличается от моей первоначальной настройки из-за extends и переопределения configure.

До сих пор это все еще отлично работает с моей Intellij IDE, но после перемещения и развертывания на сервере tomcat ни одно из сообщений журнала не появляется. Приложение по-прежнему работает, но в нем явно отсутствуют какие-либо настройки, обеспечивающие его функциональность (подключения к базам данных). Как мне запустить некоторый код установки при запуске приложения, когда я развертываю это приложение в виде файла WAR?


person JAF    schedule 26.02.2020    source источник
comment
Поместите этот код установки в ApplicationRunner или CommandLineRunner, который будет выполняться при запуске приложения. Таким образом, это будет работать в любом сценарии. Мне также интересно, какие пулы вам нужно настроить, и действительно ли вы должны делать это по-другому.   -  person M. Deinum    schedule 27.02.2020
comment
Это то, что мне было нужно, спасибо. То, что я настраиваю, - это просто пулы баз данных Hikari, во время установки моя программа ищет локальный файл TNS и службу паролей, а затем создает пулы на основе этого. У вас есть мысли о другом способе сделать это?   -  person JAF    schedule 28.02.2020
comment
Что кажется немного хакерским? Как вы регистрируете их в контексте приложения? Проще всего сделать метод setUpPools init-методом или вызвать его из слушателя приложения после запуска. Таким образом, это будет работать в любом сценарии.   -  person M. Deinum    schedule 02.03.2020
comment
Ах хорошо. Что-то вроде раздела 2.3 этого документа: baeldung.com/ логика запуска-настройки-при-запуске-весной   -  person JAF    schedule 02.03.2020
comment
Как-то так да. Кроме того, если вы знаете, сколько существует пулов, почему бы просто не сделать их бобами? Или, может быть, даже создайте для него BeanDefinitionRegistryPostProcessor, чтобы вы могли добавлять определения bean-компонентов, которые будут обрабатываться и управляться Spring. Опять же, тот факт, что вы создаете пулы за пределами Spring, кажется хакерским.   -  person M. Deinum    schedule 03.03.2020
comment
Текущая идея состоит в том, что он является динамическим на основе файла TNS и файла паролей yaml (файл yaml скоро будет заменен чем-то более безопасным). На основе этого будут созданы пулы, и в дальнейшем я хотел бы сделать так, чтобы новые пулы БД можно было настроить во время работы приложения. Можно ли добавить bean-компоненты после запуска проекта с этим BeanDefinitionRegistryPostProcessor?   -  person JAF    schedule 09.03.2020
comment
Нет, так как это не будет работать снова, но и ваш боб тоже. И как используются эти пулы? В настоящее время они не являются весенними бобами, поэтому их нельзя использовать для инъекций.   -  person M. Deinum    schedule 10.03.2020
comment
Прямо сейчас каждый пул используется для захвата готового соединения с базой данных для выполнения заданного пользователем запроса. Аналогичен SQL Developer, но с более тонкой настройкой доступа к данной базе данных и т.д.   -  person JAF    schedule 10.03.2020


Ответы (1)


Еще раз спасибо 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();
    }
}
person JAF    schedule 17.03.2020