У меня есть метод, который помечен как @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.
Как мне это сделать?
Благодарю вас.