Преобразование метода @Async в Spring-REST в асинхронный метод @HystrixCommand с асинхронным резервом

У меня есть метод, который помечен как @Async в моем классе @Service. Это возвращает тип Future.

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

@Async
public Future<Object> performOperation(String requestString) throws InterruptedException {
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);
if(response.getStatus()!=200) {
   webResource=null;
   logger.error("request failed with HTTP Status: " + response.getStatus());
   throw new RuntimeException("request failed with HTTP Status: " + response.getStatus());
  }
results=response.getEntity(String.class);
 } finally {
    client.destroy();
    webResource=null;
    }
   return new AsyncResult<>(results);
}

Я хочу преобразовать этот метод @Async в асинхронный метод @HystrixCommand в следующем формате:

@HystrixCommand
    public Future<Object> performOperation(String requestString) throws InterruptedException {
        return new AsyncResult<Object>() {

            @Override
            public Product invoke() {
                ...
                return results;
            }
        };
    }

Но когда я это делаю, в моем коде появляются следующие ошибки:

для строки return new AsyncResult<Object>() {...}это говорит

Конструктор AsyncResult() не определен.

Когда я прошу Eclipse исправить ошибку, он добавляет объект requestString в параметр конструктора, т.е. AsyncResult<Object>(requestString)

Также он просит меня удалить @Override из метода invoke().

Это говорит

Метод invoke() типа new AsyncResult(){} должен переопределять или реализовывать метод супертипа.

Но при запросе eclipse исправить ошибку для меня он удаляет @Override

Мой вопрос: как мне превратить метод @Async в асинхронный метод @HystrixCommand без каких-либо из этих проблем?

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

Как мне это сделать?

Благодарю вас.


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


Ответы (1)


Из этого сообщения

Также он просит меня удалить @Override из метода invoke(). Похоже, вы используете org.springframework.scheduling.annotation.AsyncResult
, а не com.netflix.hystrix.contrib.javanica.command.AsyncResult.

Изменение типа должно решить проблему.

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

@HystrixCommand(fallbackMethod="myFallbackMethod")
    public Future<Object> performOperation(String requestString) throws InterruptedException {
        return new AsyncResult<Object>() {

            @Override
            public Product invoke() {
                ...
                return results;
            }
        };
    }

 public Future<Object> myFallbackMethod(String requestString) {
      return new AsyncResult<Object>() {

            @Override
            public Product invoke() {
               ....... // return some predefined results;
            }

   }

Еще кое-что. Вместо объявления как Genric Object. Укажите его как любой тип бетона, например Product

public Future<Product> performOperation(String requestString) throws InterruptedException {
   .....


 }
person pvpkiran    schedule 08.01.2018
comment
попробуйте использовать синхронный резервный метод и посмотрите, работает ли он. Я имею в виду изменить сигнатуру резервного метода, чтобы возвращать Object вместо Future<Object> - person pvpkiran; 08.01.2018
comment
проверьте дополнительную информацию здесь github.com/Netflix/Hystrix /tree/master/hystrix-contrib/ - person pvpkiran; 08.01.2018
comment
Хорошо, я думаю, что могу использовать аннотацию HystrixProperty в commandProperties, чтобы выбрать, когда я хочу, чтобы метод откатился. т. е. я могу указать в HystrixProperty, что если код состояния ответа не равен 200, я хочу, чтобы он был резервным. Я знаю, что люди используют HystrixProperty для запуска отката, если время ожидания превышает определенное количество секунд, например, HystrixProperty(name=execution.isolation.thread.timeoutInMilliseconds, value=5000). Есть ли что-то, что я мог бы использовать для проверки кодов состояния ответа? - person Anshuman Tripathy; 08.01.2018