2017-02-28 41 views
2

akka http客户端上看起来完全简单的断路器示例对我而言并不适用。http客户端上的断路器无法在故障后关闭

object HttpWithCircuitBreaker extends App { 
    implicit val system = ActorSystem() 
    implicit val materializer = ActorMaterializer() 
    implicit val ec = system.dispatcher 
    val breaker = 
    new CircuitBreaker(
     system.scheduler, 
     maxFailures = 2, 
     callTimeout = 3.seconds, 
     resetTimeout = 25.seconds) 
     .onOpen(println("circuit breaker opened")) 
     .onClose(println("circuit breaker closed")) 
     .onHalfOpen(println("circuit breaker half-open")) 
    while (true) { 
    val futureResponse: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = "https://www.random.org/integers/?num=1&min=1&max=6&col=1&base=10&format=plain&rnd=new")) 
    breaker.withCircuitBreaker(futureResponse).map(resp => resp.status match { 
     case Success(_) => 
     resp.entity.dataBytes.runWith(Sink.ignore) 
     println("http success") 
     case _ => 
     resp.entity.dataBytes.runWith(Sink.ignore) 
     println(s"http error ${resp.status.intValue()}") 
    }).recover { 
     case [email protected]_ => 
     println(s"exception ${e.getMessage}") 
    } 
    Thread.sleep(1000) 
    } 
} 

它开始完美地取得随机数。它在从网络断开时打开,但在重新连接时从不关闭。正如你可以从日志中看到有恢复的尝试,但它失败超时:

http success 
http success 
http success 
exception Tcp command [Connect(www.random.org:443,None,List(),Some(10 seconds),true)] failed 
exception Circuit Breaker Timed out. 
circuit breaker opened 
exception Tcp command [Connect(www.random.org:443,None,List(),Some(10 seconds),true)] failed 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker Timed out. 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
circuit breaker half-open    <--- new http call should start here 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker Timed out. <--- but it fails with timeout 
circuit breaker opened 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 
exception Circuit Breaker is open; calls are failing fast 

的直觉说,它必须有一些未消费的HTTP实体,但我还是很没能作出正确选择。

Here is the sample on github to play with

回答

2

对于断路器正常工作,这val

val futureResponse: Future[HttpResponse] = Http().singleRequest(...) 

应该是一个def

def futureResponse: Future[HttpResponse] = Http().singleRequest(...) 

断路器需要来包装异步调用 - 如果你使用val,异步呼叫将在断路器外部启动。

此外:避免在代码中使用Thread.sleep,尝试使用 - 例如 - Akka after

+0

谢谢。终于弄明白了。 – kharole