Как передать данные из бизнес-метода в резервный метод при использовании автоматического выключателя с пружинной загрузкой (Hystrix)? - PullRequest
0 голосов
/ 18 сентября 2018

В официальном https://spring.io/guides/gs/circuit-breaker/ руководстве есть

  1. бизнес-метод (readList)
  2. резервный метод (надежный)
@HystrixCommand(fallbackMethod = "reliable")
  public String readingList() {
    URI uri = URI.create("http://localhost:8090/recommended");

    return this.restTemplate.getForObject(uri, String.class);
  }

  public String reliable() {
    return "Cloud Native Java (O'Reilly)";
  }

Как передать данные из бизнес-метода в резервный метод?Использовать ThreadLocal, неизменные коллекции, параллельные коллекции, любые идеи / лучшие практики?

1 Ответ

0 голосов
/ 25 апреля 2019

Использовать ThreadLocal?

@HystrixCommand и соответствующие fallbackMethod обычно выполняются (вместе) в отдельном потоке из-за значения по умолчанию execution.isolation.strategy, равного ExecutionIsolationStrategy.THREAD.

Таким образом, это означает, что если вы используете ThreadLocal для установки каких-либо переменных до выполнения @HystrixCommand, они не будут доступны для @HystrixCommand, поскольку поток будет другим.

Если вышеописанное необходимо, вы можете использовать другую стратегию изоляции - ExecutionIsolationStrategy.SEMAPHORE.

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

@HystrixCommand(fallbackMethod = "reliable",
    commandProperties = {
        @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
)

Передача данных входных параметров

Методы, помеченные @HystrixCommand и соответствующим fallbackMethod, должны иметь одинаковую сигнатуру метода (плюс необязательный параметр в резервном дляисключения), поэтому метод резервирования будет иметь доступ ко всем входным параметрам для @HystrixCommand.

Передача данных исключений

Добавление Throwable в фалСигнатура метода lback будет включать исключение, полученное из @HystrixCommand:

   public String reliable(Throwable t) {
     return "Cloud Native Java (O'Reilly)";
   }

Передача данных выполнения

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

Например, в коде, который вы указали, URL может стать входным параметром, поэтому он будет доступен дляа также запасной метод:

@HystrixCommand(fallbackMethod = "reliable")
  public String readingList(String url) {
    URI uri = URI.create(url);

    return this.restTemplate.getForObject(uri, String.class);
  }

   public String reliable(String url, Throwable t) {
     return "Cloud Native Java (O'Reilly)";
   }
...