Рубрики
Без рубрики

Программный перезапуск приложения Spring Boot

Узнайте несколько способов перезапуска приложения Spring Boot с помощью Java

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы покажем, как программно перезапустить приложение Spring Boot .

Перезапуск нашего приложения может быть очень удобным в некоторых случаях:

  • Перезагрузка конфигурационных файлов при изменении какого-либо параметра
  • Изменение текущего активного профиля во время выполнения
  • Повторная инициализация контекста приложения по любой причине

Хотя в этой статье рассматриваются функции перезапуска приложения Spring Boot, обратите внимание, что у нас также есть отличный учебник по завершению работы приложений Spring Boot .

Теперь давайте рассмотрим различные способы реализации перезапуска приложения Spring Boot.

2. Перезагрузитесь, создав новый контекст

Мы можем перезапустить наше приложение, закрыв контекст приложения и создав новый контекст с нуля. Хотя этот подход довольно прост, есть некоторые тонкие детали, с которыми мы должны быть осторожны, чтобы заставить его работать.

Давайте посмотрим, как это реализовать в методе main нашего приложения Spring Boot:

@SpringBootApplication
public class Application {

    private static ConfigurableApplicationContext context;

    public static void main(String[] args) {
        context = SpringApplication.run(Application.class, args);
    }

    public static void restart() {
        ApplicationArguments args = context.getBean(ApplicationArguments.class);

        Thread thread = new Thread(() -> {
            context.close();
            context = SpringApplication.run(Application.class, args.getSourceArgs());
        });

        thread.setDaemon(false);
        thread.start();
    }
}

Как мы можем видеть в приведенном выше примере, важно воссоздать контекст в отдельном потоке, не являющемся демоном,-таким образом, мы предотвратим завершение работы JVM, вызванное методом close , от закрытия нашего приложения. В противном случае наше приложение остановится, так как JVM не ждет завершения потоков демонов, прежде чем завершить их.

Кроме того, давайте добавим конечную точку REST, через которую мы можем запустить перезапуск:

@RestController
public class RestartController {
    
    @PostMapping("/restart")
    public void restart() {
        Application.restart();
    } 
}

Здесь мы добавили контроллер с методом сопоставления, который вызывает наш метод restart .

Затем мы можем вызвать нашу новую конечную точку, чтобы перезапустить приложение:

curl -X POST localhost:port/restart

Конечно, если мы добавим такую конечную точку в реальное приложение, нам также придется обеспечить ее безопасность.

3. Конечная точка перезапуска Приводов

Другой способ перезапустить наше приложение-использовать встроенный RestartEndpoint из Пружинного загрузочного привода .

Во-первых, давайте добавим необходимые зависимости Maven:


    org.springframework.boot
    spring-boot-starter-actuator


    org.springframework.boot
    spring-cloud-starter

Затем мы должны включить встроенную конечную точку перезапуска в нашем файле application.properties :

management.endpoint.restart.enabled=true

Теперь, когда мы все настроили, мы можем ввести Перезапуск конечную точку в нашу службу:

@Service
public class RestartService {
    
    @Autowired
    private RestartEndpoint restartEndpoint;
    
    public void restartApp() {
        restartEndpoint.restart();
    }
}

В приведенном выше коде мы используем конечную точку Restart bean для перезапуска нашего приложения. Это хороший способ перезапуска, потому что нам нужно вызвать только один метод, который выполняет всю работу.

Как мы видим, использование конечной точки Restart – это простой способ перезапустить наше приложение. С другой стороны, у этого подхода есть недостаток, поскольку он требует, чтобы мы добавили упомянутые библиотеки. Если мы их еще не используем, это может быть слишком много накладных расходов только для этой функции. В этом случае мы можем придерживаться ручного подхода из предыдущего раздела, поскольку для этого требуется всего несколько строк кода.

4. Обновление контекста приложения

В некоторых случаях мы можем перезагрузить контекст приложения, вызвав его метод refresh .

Хотя этот метод может показаться многообещающим, только некоторые типы контекста приложения поддерживают обновление уже инициализированного контекста. Например, FileSystemXmlApplicationContext , Groovy Web Application Context, и некоторые другие поддерживают его.

К сожалению, если мы попробуем это сделать в веб-приложении Spring Boot, мы получим следующую ошибку:

java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts:
just call 'refresh' once

Наконец, хотя существуют некоторые типы контекста, которые поддерживают многократное обновление, нам следует избегать этого. Причина в том, что метод refresh разработан как внутренний метод, используемый платформой для инициализации контекста приложения.

5. Заключение

В этой статье мы рассмотрели несколько различных способов программного перезапуска приложения Spring Boot.

Как всегда, мы можем найти исходный код для примеров на GitHub .