Запуск резервного варианта с использованием тайм-аута @HystrixProperty для кодов состояния HTTP и других исключений

У меня есть функция в моем классе @Service, помеченная @HystrixCommand.

Этот метод действует как клиент, который отправляет запрос на другой URL-адрес службы и возвращает ответ.

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

Я хочу сделать это, используя @HystrixProperty или @HystrixCommandProperty.

Я хочу, чтобы клиент пропинговал URL-адрес и прослушал статус ответа 200, и если он не вернет статус 200 в течение определенного периода времени, я хочу, чтобы он вернулся.

Если он обычно возвращает статус 200 в течение определенного времени, он не должен вызывать откат.

@HystrixCommand(fallbackMethod="fallbackPerformOperation")
    public Future<Object> performOperation(String requestString) throws InterruptedException 

        return new AsyncResult<Object>() {

            @Override
            public Object invoke() {

                Client client = null;
                WebResource webResource  = null;
                ClientResponse response =null;
                String results = null; 
                try{
                    client = Client.create();       
                    webResource = client.resource(URL);
                    client.setConnectTimeout(10000);
                    client.setReadTimeout(10000);
                    response = webResource.type("application/xml")
                       .post(ClientResponse.class, requestString);  

              } finally {
                  client.destroy();
                  webResource = null;
              }

                return results;
            }

        };
}

Я специально хочу использовать @HystrixProperty или @HystrixCommandProperty, поэтому выполнение проверки внутри метода на наличие кода состояния ответа, отличного от 200, а затем создание исключения неприемлемо.

Вместо использования аннотаций будет ли создаваться моя собственная команда путем расширения интерфейса HystrixCommand?

Любые идеи или ресурсы о том, с чего я могу начать, приветствуются.


person Anshuman Tripathy    schedule 09.01.2018    source источник


Ответы (1)


Я не понимаю, почему вы не хотите проверять код статуса http ответа и кидать исключение, если он не 200? Это даст вам желаемое поведение. то есть это вызовет откат для исключений или ответов, отличных от 200.

Вы можете установить тайм-аут в клиенте, однако я бы предпочел использовать значения тайм-аута hystrix. Таким образом, вы можете использовать Archaius для динамического изменения значения во время выполнения, если это необходимо.

Вы можете использовать аннотацию команды Hystrix или расширить класс HystrixCommand. Оба варианта предоставят вам желаемое поведение

Вот пример использования аннотации.

 @HystrixCommand(fallbackMethod = "getRequestFallback")
  public String performGetRequest(String uri) {
    Client client = Client.create();
    WebResource webResource = client.resource(uri);
    ClientResponse response = webResource.get(ClientResponse.class);
    if (response.getStatus() != 200) {
      throw new RuntimeException("Invalid response status");
    }
    return response.getEntity(String.class);
  }

  public String getRequestFallback(String uri) {
    return "Fallback Value";
  }
person Davin    schedule 19.01.2018