使用@HystrixProperty超时触发HTTP状态代码和其他异常的回退

时间:2018-01-09 21:56:36

标签: http connection-timeout spring-cloud-netflix hystrix circuit-breaker

我的@Service类中有一个用@HystrixCommand标记的函数。

此方法充当客户端,将请求发送到另一个服务URL并获取响应。

我想要做的是在响应状态代码不是200时触发回退功能。它还会触发任何其他异常(RuntimeExceptions等)的回退。

我想通过使用@HystrixProperty或@HystrixCommandProperty来做到这一点。

我希望客户端ping该URL并侦听200响应状态,如果它在某个时间范围内没有恢复到200状态,我希望它能够回退。

如果它在一定时间内正常恢复200状态,则不应触发回退。

@HystrixCommand(fallbackMethod="fallbackPerformOperation")
    public Future<Object> performOperation(String requestString) throws InterruptedException 

        return new AsyncResult<Object>() {

            @Override
            public Object invoke() {

                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);  

              } finally {
                  client.destroy();
                  webResource = null;
              }

                return results;
            }

        };
}

我特别想使用 @HystrixProperty @HystrixCommandProperty ,因此在方法内部执行检查,以便响应状态代码不是200,然后抛出异常是不能接受。

而不是使用Annotations将通过扩展HystrixCommand Interface工作来创建我自己的Command吗?

我可以从中获得任何想法或资源。

1 个答案:

答案 0 :(得分:0)

我不明白为什么你不想检查响应http状态代码并在不是200时抛出异常?这样做会给你你想要的行为。即它会触发异常或非200响应的后退。

您可以在客户端设置超时,但我会选择使用hystrix超时值。这样,如果需要,您可以使用Archaius在运行时动态更改值。

您可以使用Hystrix命令注释或扩展HystrixCommand类。这两个选项都将为您提供所需的行为

以下是使用注释的示例。

 @HystrixCommand(fallbackMethod = "getRequestFallback")
  public String performGetRequest(String uri) {
    Client client = Client.create();
    WebResource webResource = client.resource(uri);
    ClientResponse response = webResource.get(ClientResponse.class);
    if (response.getStatus() != 200) {
      throw new RuntimeException("Invalid response status");
    }
    return response.getEntity(String.class);
  }

  public String getRequestFallback(String uri) {
    return "Fallback Value";
  }