2016-04-14 16 views
2

Hystrix Devre Kesici uygulamasına sahibim ve test ettiğimde, CircuitBreker zaman aşımına uğradı ve geri dönüş başarısızlığıyla ilgili bir Hystrix Runtime Exception alıyorum. CircutBreaker'da zaman aşımını artırmam gerekir mi? Kod zaman aşımına uğradığında devre kesiciyi açar mı? aşağıdaki gibiHystrix Devre Kesici Zaman Aşımını Artırın mı?

Benim junit testidir:

@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()); 
} 

My Sınıf sadece web çalıştırmaktır alır nasılsa arızası durumunda CircuitBreaker kullanarak vb/koyar /. şöyle Benim sınıftır:

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

cevap

1

Sen CircuitBreaker üzerinde zaman aşımı artırmak için deneyin ve ne görebilirsiniz:

HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(5000) 

Hystrix Wiki göre HystrixCommand varsayılan zaman aşımı 1 saniye olduğundan, HttpGet'iniz bir şey döndürmek için 1 saniyeden uzun sürebilir.

0

Google'a basit bir istek yapmak için zaman aşımını artırmanız gerekmemelidir. Bunu dene.

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

} 

Ve basit bir test

@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()); 
    } 
İlgili konular