в моем веб-приложении есть метод test, который вызывается cronjob каждые две минуты, и мне нравится иметь возможность динамически переключаться между solution a и solution b с некоторым флагом функции, не развертывая его каждый раз.
@Scheduled(fixedRateService = "120000")
public void test(){
if (conditionA()) {
// do solution A
} else {
// do solution B
}
}
Я думал использовать файл cookie для этой цели, но он работает только в сеансе, который я открыл, и, тем не менее, другое решение может быть вызвано другими сеансами.
есть ли способ, которым я могу обеспечить только одно решение, работающее в производстве, и динамически заменять их, не выпуская их каждый раз?
Обновлять: Ответ Джонатана Джокса правильный, и я добавляю здесь некоторые пояснения
чтобы обновить значение свойств, которые вам нужны, сначала POST ваш ключ/значение в формате x-www-form-urlencoded на \actuator\env, а затем принудительно перезагрузите его, отправив пустую полезную нагрузку в \actuator\refresh




вы можете использовать аннотацию @RefreshScope для обновления свойств:
1.- Добавить @RefreshScope к уроку
@RefreshScope
@Component
public class Test {
@Value("${conditional.istrue}")
private boolean conditional;
@Scheduled(fixedRateService = "120000")
public void test(){
if (conditional) {
// do solution A
} else {
// do solution B
}
}
}
2.- Добавить свойство флага и разрешить доступ к конечной точке /refresh, чтобы обновить новые свойства.
приложение.свойства
conditional.istrue=true
management.endpoints.web.exposure.include=*
3.- После изменения application.properties, например:
conditional.istrue=false
Затем вы можете refresh вводить конфигурации, выполняя:
curl localhost:8080/actuator/refresh -d {} -H "Content-Type: application/json"
ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА - https://spring.io/guides/gs/centralized-configuration/
Не обязательно, потому что у вас может быть application.properties в ресурсах вашего проекта, тогда вам не нужно иметь внешнюю конфигурацию какой-либо службы, если это так.
Понятно, но когда я пытаюсь обновить значение conditional.istrue с истинного по умолчанию на ложное с помощью команды curl localhost:8080/actuator/refresh -d { conditional.istrue=false } -H "Content-Type: application/json", значение не меняется, я пропустил какой-либо шаг?
вам не нужно передавать {} условие.isTrue=false, вам нужно установить из application.properties @rawData
Что произойдет, если значение будет обновлено/обновлено одновременно с чтением? разве это не состояние гонки?
спасибо, я думаю, это работает, только если у вас есть внешняя конфигурация и вы фиксируете ее?