2015-12-25 15:27:45 +00:00
|
|
|
package akka.contrib.circuitbreaker.sample
|
|
|
|
|
|
|
|
|
|
import akka.actor.{ Actor, ActorLogging, ActorRef }
|
2015-12-31 18:46:29 +00:00
|
|
|
import akka.contrib.circuitbreaker.CircuitBreakerActor.{ CircuitBreakerActorPropsBuilder, CircuitOpenFailure }
|
2015-12-25 15:27:45 +00:00
|
|
|
|
|
|
|
|
import scala.concurrent.duration._
|
|
|
|
|
|
|
|
|
|
//#basic-sample
|
|
|
|
|
class CircuitBreaker(potentiallyFailingService: ActorRef) extends Actor with ActorLogging {
|
|
|
|
|
import SimpleService._
|
|
|
|
|
|
|
|
|
|
val serviceCircuitBreaker =
|
|
|
|
|
context.actorOf(
|
2015-12-31 18:46:29 +00:00
|
|
|
CircuitBreakerActorPropsBuilder(maxFailures = 3, callTimeout = 2.seconds, resetTimeout = 30.seconds)
|
2015-12-25 15:27:45 +00:00
|
|
|
.copy(
|
|
|
|
|
failureDetector = {
|
|
|
|
|
_ match {
|
|
|
|
|
case Response(Left(_)) ⇒ true
|
|
|
|
|
case _ ⇒ false
|
|
|
|
|
}
|
|
|
|
|
})
|
2015-12-31 18:46:29 +00:00
|
|
|
.props(potentiallyFailingService),
|
2015-12-25 15:27:45 +00:00
|
|
|
"serviceCircuitBreaker")
|
|
|
|
|
|
|
|
|
|
override def receive: Receive = {
|
|
|
|
|
case AskFor(requestToForward) ⇒
|
|
|
|
|
serviceCircuitBreaker ! Request(requestToForward)
|
|
|
|
|
|
|
|
|
|
case Right(Response(content)) ⇒
|
|
|
|
|
//handle response
|
|
|
|
|
log.info("Got successful response {}", content)
|
|
|
|
|
|
|
|
|
|
case Response(Right(content)) ⇒
|
|
|
|
|
//handle response
|
|
|
|
|
log.info("Got successful response {}", content)
|
|
|
|
|
|
|
|
|
|
case Response(Left(content)) ⇒
|
|
|
|
|
//handle response
|
|
|
|
|
log.info("Got failed response {}", content)
|
|
|
|
|
|
|
|
|
|
case CircuitOpenFailure(failedMsg) ⇒
|
|
|
|
|
log.warning("Unable to send message {}", failedMsg)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//#basic-sample
|
|
|
|
|
|