我的@Service类中有一个标记为@Async的方法。这将返回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;
}
};
}
但是当我这样做时,它会在我的代码中抛出以下错误:
代表<{p>}行return new AsyncResult<Object>() {...}
构造函数AsyncResult()未定义。
当我要求Eclipse修复错误时,它会将requestString
对象添加到构造函数参数中,即AsyncResult<Object>(requestString)
它还要求我从@Override
方法中删除invoke()
。
它说
new AsyncResult(){}类型的方法invoke()必须覆盖 或实现超类型方法。
但是在要求eclipse为我修复错误时,它删除了@Override
我的问题是如何在没有任何这些问题的情况下将@Async方法转换为异步@HystrixCommand方法?
我还希望为此方法实现异步回退,以便在响应状态代码不是200时向用户显示默认消息。
我该怎么做?
谢谢。
答案 0 :(得分:0)
来自此消息
它还要求我从invoke()方法中删除@Override。,看起来你正在使用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 {
.....
}