每个命令的Hystrix类?

时间:2018-04-03 09:21:21

标签: java hystrix

我的应用程序有一组可配置的(在运行时)要调用的外部端点:

/foo
/bar

用于使用apache HttpClient进行http调用。

我想在这里使用Hystrix包装HttpClient,但是我想为每个端点分隔断路器,这样如果一个端点失败,它就不会影响其他端点。

我可以通过两个班来做到这一点:

FooCommand extends HystrixCommand<...> {
}

BarCommand extends HystrixCommand<...> {
}

但这是一个硬编码的解决方案,阻止我在运行时动态配置它。

如何构建单个hystrix命令类来实现此目的?

理想情况是这样的:

class MyHystrixHttpClient extends HystrixCommand<Data> {
    public MyHystrixHttpClient(String endpoint) {
        // here somehow tell hystrix to use "endpoint" string getHash() as a grouping key
    }
}

那么我可以像这样使用它:

new MyHystrixHttpClient("/foo").execute(); // (1)
new MyHystrixHttpClient("/bar").execute(); // (2)

如果(1)失败,(2)仍将被执行并单独处理

1 个答案:

答案 0 :(得分:1)

您可以在构造函数中设置命令键。这样的事情。

public class HttpCommand extends HystrixCommand<HttpResponse> {

  private final HttpClient httpClient;
  private final HttpRequestBase request;

  public HttpCommand(String commandKey, HttpClient httpClient, HttpRequestBase request) {
    super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("HttpGroup"))
        .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey)));
    this.httpClient = httpClient;
    this.request = request;
  }

  @Override
  protected HttpResponse run() throws Exception {
    return httpClient.execute(request);
  }

}