Использовать 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)";
}