2016-04-14 7 views
2

私はHystrixサーキットブレーカを実装しています。テストするとき、CircuitBrekerのタイムアウトとフォールバックに失敗したというエラーでHystrixランタイム例外を取得しています。 CircutBreakerのタイムアウトを増やす必要がありますか?コードがタイムアウトすると、サーキットブレーカをトリップするだけですか?Hystrixサーキットブレーカのタイムアウトを延長しますか?

次のように私のJUnitテストがある:

@Test 
public void test4(){ 
    client = new DefaultHttpClient(); 
    httpget = new HttpGet("http://www.google.com:81"); 
    resp = new CircuitBreaker(client, "test4", httpget).execute(); 
    //assertEquals(HttpStatus.SC_GATEWAY_TIMEOUT, resp.getStatusLine().getStatusCode()); 
    System.out.println(resp.getStatusLine().getStatusCode()); 
} 

私のクラスだけでウェブを実行することですが何とか障害が発生した場合にCircuitBreakerを使用して/プットは/ etcを取得します。次のように私のクラスは次のとおりです。

public class CircuitBreaker extends HystrixCommand<HttpResponse> { 
private HttpClient client; 
private HttpRequestBase req; 
protected String key; 
//Set up logger 
private static final Logger logger = (Logger)LoggerFactory.getLogger(CircuitBreaker.class); 

    /* 
    * This method is a constructor and sets http client based on provides args. 
    * This version accepts user input Hystrix key. 
    */ 
    public CircuitBreaker (HttpClient client, String key, HttpRequestBase req, int threshold) { 
     super(HystrixCommandGroupKey.Factory.asKey(key)); 
     this.client = client; 
     this.key = key; 
     this.req = req; 
     logger.info("Hystrix Circut Breaker with Hystrix key:" + key); 
     logger.setLevel(Level.DEBUG); 
     HystrixCommandProperties.Setter().withCircuitBreakerEnabled(true); 
     HystrixCommandProperties.Setter().withCircuitBreakerErrorThresholdPercentage(threshold); 
     //HystrixCommandProperties.Setter().withCircuitBreakerRequestVolumeThreshold(50); 
    } 
    /* 
    * This method is a constructor and sets http client based on provides args. 
    * This version uses the default threshold of 50% failures if one isn't provided. 
    */ 
    public CircuitBreaker (HttpClient client,String key, HttpRequestBase req){ 
     this(client, key, req, 50); 
    } 
    /* 
    * This method runs the command and returns the response. 
    */ 
@Override 
protected HttpResponse run() throws Exception { 
    HttpResponse resp = null; 
    resp = client.execute(req); 
    if (resp != null) 
     logger.info("Request to " + req.getURI() + " succeeded!"); 
    return resp; 
} 
/* 
* Fallback method in in the event the circuit breaker is tripped. 
* Overriding the default fallback implemented by Hystrix that just throws an exception. 
* @see com.netflix.hystrix.HystrixCommand#getFallback() 
*/ 
@Override 
protected HttpResponse getFallback() { 
    //For later expansion as needed. 
    logger.error("Circuit Breaker has " + getExecutionEvents() + ". Reason: "+ getFailedExecutionException().getMessage()); 
    return null; 
} 
} 

答えて

1

あなたのCircuitBreakerのタイムアウトを高めるためにしようとすると何が起こるかを見ることができます。

HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(5000) 

Hystrix Wikiによると、HystrixCommandのデフォルトのタイムアウトは1秒ですので、 HttpGetが何かを返すためには1秒以上かかることがあります。

0

Googleに簡単にリクエストを送信するには、タイムアウトを長くする必要はありません。これを試して。

public class HttpCommand extends HystrixCommand<HttpResponse> { 

    private final HttpClient client; 
    private final HttpRequestBase req; 

    public HttpCommand(HttpClient client, HttpRequestBase req) { 
    super(HystrixCommandGroupKey.Factory.asKey("HttpCommandGroup")); 
    this.client = client; 
    this.req = req; 
    } 

    @Override 
    protected HttpResponse run() throws Exception { 
    return client.execute(req); 
    } 

} 

、簡単なテスト

@Test 
    public void executeCommandTest(){ 
    HttpClient client = HttpClientBuilder.create().build(); 
    HttpGet httpget = new HttpGet("http://www.google.com"); 
    HttpResponse resp = new HttpCommand(client, httpget).execute(); 
    assertEquals(HttpStatus.SC_OK, resp.getStatusLine().getStatusCode()); 
    } 
関連する問題