0

我有一个在我的@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 修复错误时,它会将requestStringObject 添加到构造函数参数中,即AsyncResult<Object>(requestString)

它还要求我@Overrideinvoke()方法中删除。

它说

new AsyncResult(){} 类型的方法 invoke() 必须覆盖或实现超类型方法。

但是在要求 eclipse 为我修复错误时,它删除了@Override

我的问题是如何将 @Async 方法变成异步 @HystrixCommand 方法而没有任何这些问题?

我还想为此方法实现异步回退,以防响应状态代码不是 200,向用户显示默认消息。

我该怎么做呢?

谢谢你。

4

1 回答 1

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 {
   .....


 }
于 2018-01-08T15:20:02.813 回答