Флаг динамической функции весной

в моем веб-приложении есть метод 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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 026
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы можете использовать аннотацию @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/

спасибо, я думаю, это работает, только если у вас есть внешняя конфигурация и вы фиксируете ее?

rawData 20.03.2019 18:26

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

Jonathan JOhx 20.03.2019 19:04

Понятно, но когда я пытаюсь обновить значение conditional.istrue с истинного по умолчанию на ложное с помощью команды curl localhost:8080/actuator/refresh -d { conditional.istrue=false } -H "Content-Type: application/json", значение не меняется, я пропустил какой-либо шаг?

rawData 20.03.2019 23:51

вам не нужно передавать {} условие.isTrue=false, вам нужно установить из application.properties @rawData

Jonathan JOhx 21.03.2019 19:49

Что произойдет, если значение будет обновлено/обновлено одновременно с чтением? разве это не состояние гонки?

Diego Ramos 19.01.2021 06:10

Другие вопросы по теме