将Spring-REST中的@Async方法转换为具有异步回退的异步@HystrixCommand方法

时间:2018-01-08 15:04:35

标签: asynchronous spring-cloud spring-cloud-netflix hystrix circuit-breaker

我的@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时向用户显示默认消息。

我该怎么做?

谢谢。

1 个答案:

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


 }