我有一个在我的@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;
}
};
}
但是当我这样做时,它会在我的代码中引发以下错误:
对于return new AsyncResult<Object>() {...}
它说的那一行
构造函数 AsyncResult() 未定义。
当我要求 Eclipse 修复错误时,它会将requestString
Object 添加到构造函数参数中,即AsyncResult<Object>(requestString)
它还要求我@Override
从invoke()
方法中删除。
它说
new AsyncResult(){} 类型的方法 invoke() 必须覆盖或实现超类型方法。
但是在要求 eclipse 为我修复错误时,它删除了@Override
我的问题是如何将 @Async 方法变成异步 @HystrixCommand 方法而没有任何这些问题?
我还想为此方法实现异步回退,以防响应状态代码不是 200,向用户显示默认消息。
我该怎么做呢?
谢谢你。