Spring Boot: захват события во время загрузки контекста и при изменении свойства - PullRequest
0 голосов
/ 02 мая 2018

Я хотел выполнить пользовательскую логику, как только приложение запускалось, а также всякий раз, когда изменялись свойства в конфигурационном репо / сервере Spring Cloud. Итак, я написал что-то вроде этого:

import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfiguration implements ApplicationListener<EnvironmentChangeEvent> {

    @Override
    public void onApplicationEvent(EnvironmentChangeEvent event) {
        // Custom logic goes here. It should be executed on both app context load time
        // and on any property change time

    }

}

Этот код работал несколько месяцев назад во время загрузки приложения и при изменении свойства. Но этот код недавно перестал работать с, я думаю, весенними обновлениями загрузочной / облачной версии.

В настоящее время я использую Sprig boot 1.5.10 и Cloud Edgware.SR3

1 Ответ

0 голосов
/ 03 мая 2018

Найден способ запуска пользовательской логики для запуска как во время загрузки, так и во время изменения свойства.

В основном изменен на вышеприведенный код, который вызывается при любом событии, а затем внутри переопределенного метода на onApplicationEvent, проверяющего только событие ниже

  1. ContextRefreshedEvent - Событие, возникающее при инициализации или обновлении контекста приложения.
  2. EnvironmentChangeEvent - Событие опубликовано, чтобы сообщить об изменении среды, например о свойствах в config repo.

    import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
    import org.springframework.context.ApplicationEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    
    public class AppConfiguration implements ApplicationListener<ApplicationEvent> {
    
      @Override
      public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof EnvironmentChangeEvent || event instanceof ContextRefreshedEvent) {
           // Custom logic goes here. It should be executed on both app context load time 
           // and on any property change time
        }
      }
    }
    

Обновлено

Мы также можем использовать аннотацию @ EventListener , чтобы сделать аналогичную вещь, которая очень проста и удобна в использовании. Ниже приведен пример:

@Configuration
public class AppConfiguration {

    @EventListener({EnvironmentChangeEvent.class, ContextRefreshedEvent.class})
    public void onRefresh() {
        // Your code goes here...
    }

}
...