Как перезагрузить application.properties во время выполнения, которое не является частью jar - PullRequest
0 голосов
/ 13 декабря 2018

У меня проблема с файлом application.properties, который не является частью моего файла war.Я хочу создать приложение, в котором я смогу изменять значения application.properties во время выполнения.Мой файл свойств будет bean-компонентом, который мы будем использовать в сервисе.

Классы PoC ниже:

@Configuration
@Slf4j
public class ServiceReaderConfiguration {
    @Bean
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    ServiceOutputProperties serviceProperties() {
        log.info("create serviceProperties");
        return new ServiceOutputProperties();
    }

    @Bean
    ServiceOutput serviceOutput() {
        log.info("create serviceOutput");
        return new ServiceOutput(serviceProperties());
    }
}

ServiceProperty

@Configuration
@ConfigurationProperties(prefix = "prefix")
@Setter
@Getter
public class ServiceOutputProperties {
    private int param;
}

ServiceOutputProperties

@Slf4j
public class ServiceOutput {

    private ServiceOutputProperties serviceOutputProperties;

    public ServiceOutput(ServiceOutputProperties serviceOutputProperties) {
        log.info("creating serviceOutputProperties");
        this.serviceOutputProperties = serviceOutputProperties;
    }

    public int printValueFromFile() {
        int param = serviceOutputProperties.getParam();
        return param;
    }
}

Контроллер

@RestController
@RequestMapping("/api")
public class ControllerConfiguration {

    @Autowired
    private ServiceOutput serviceOutput;

    @GetMapping("/print")
    public ResponseEntity<Integer> postValueFromPropertiesFile() {
        return ResponseEntity.ok(serviceOutput.printValueFromFile());
    }

}

application.properties

prefix.param=2

XML-файл помещен в файл Catalina

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Environment name="spring.config.location"
value="file:/home/marcin/tomcat/application.properties"
type="java.lang.String"/>
</Context>

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

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете добиться этого, используя функцию обновления области из весеннего облака, рассмотрите случай:

@ConfigurationProperties(prefix = "prefix")
@PropertySource("path to properties file, you can inject it as property ${spring.config.location}")
@RefreshScope
public class ServiceOutputProperties {
  private int param;

//getters & setters
}

Позже вы можете обновить бины следующим образом: отправив запрос POST в конечную точку /actuator/refresh (если выиспользуется пружинный привод) или путем введения компонента RefreshScope и вызова метода refreshAll() (или refresh(String name), если вы хотите обновить отдельный компонент).

Вы можете использовать WatchService API длясоздайте прослушиватель, который будет вызывать один из указанных выше методов при каждой модификации файла.

Функция обновления области действия включена в spring-cloud-context , поэтому я считаю, что она достаточно светлая

...