CircuitBreaker

org.apache.pekko.pattern.CircuitBreaker
See theCircuitBreaker companion object
class CircuitBreaker(scheduler: Scheduler, maxFailures: Int, callTimeout: FiniteDuration, val resetTimeout: FiniteDuration, maxResetTimeout: FiniteDuration, exponentialBackoffFactor: Double, randomFactor: Double, val allowExceptions: Set[String], val telemetry: CircuitBreakerTelemetry)(implicit executor: ExecutionContext)

Provides circuit breaker functionality for stability when working with "dangerous" operations, e.g. calls to remote systems.

Transitions through three states:

  • In Closed state, calls pass through until the maxFailures count is reached. This causes the circuit breaker to open. Both exceptions and calls exceeding callTimeout are considered failures.
  • In Open state, calls fail-fast with an exception. After resetTimeout, circuit breaker transitions to half-open state.
  • In Half-Open state, the first call will be allowed through, if it succeeds the circuit breaker will reset to closed state. If it fails, the circuit breaker will re-open to open state. All calls beyond the first that execute while the first is running will fail-fast with an exception.

Value parameters

callTimeout

scala.concurrent.duration.FiniteDuration of time after which to consider a call a failure

executor

scala.concurrent.ExecutionContext used for execution of state transition listeners

maxFailures

Maximum number of failures before opening the circuit

randomFactor

after calculation of the exponential back-off an additional random delay based on this factor is added, e.g. 0.2 adds up to 20% delay. randomFactor should be in range 0.0 (inclusive) and 1.0 (inclusive). In order to skip this additional delay pass in 0.

resetTimeout

scala.concurrent.duration.FiniteDuration of time after which to attempt to close the circuit

scheduler

Reference to Pekko scheduler

Attributes

Companion
object
Source
CircuitBreaker.scala
Graph
Supertypes
class Object
trait Matchable
class Any

Members list

Value members

Constructors

def this(scheduler: Scheduler, maxFailures: Int, callTimeout: FiniteDuration, resetTimeout: FiniteDuration, maxResetTimeout: FiniteDuration, exponentialBackoffFactor: Double, randomFactor: Double)(implicit executor: ExecutionContext)

Attributes

Source
CircuitBreaker.scala
def this(executor: ExecutionContext, scheduler: Scheduler, maxFailures: Int, callTimeout: Duration, resetTimeout: Duration)

Attributes

Source
CircuitBreaker.scala
def this(scheduler: Scheduler, maxFailures: Int, callTimeout: FiniteDuration, resetTimeout: FiniteDuration)(implicit executor: ExecutionContext)

Attributes

Source
CircuitBreaker.scala
def this(scheduler: Scheduler, maxFailures: Int, callTimeout: FiniteDuration, resetTimeout: FiniteDuration, maxResetTimeout: FiniteDuration, exponentialBackoffFactor: Double)(implicit executor: ExecutionContext)

Attributes

Source
CircuitBreaker.scala

Concrete methods

def addOnCallBreakerOpenListener(callback: Runnable): CircuitBreaker

JavaAPI for onCallBreakerOpen.

JavaAPI for onCallBreakerOpen.

Value parameters

callback

Handler to be invoked on call failed due to open breaker.

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def addOnCallFailureListener(callback: Consumer[Long]): CircuitBreaker

JavaAPI for onCallFailure.

JavaAPI for onCallFailure.

Value parameters

callback

Handler to be invoked on failed call, where passed value is elapsed time in nanoseconds.

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def addOnCallSuccessListener(callback: Consumer[Long]): CircuitBreaker

JavaAPI for onCallSuccess

JavaAPI for onCallSuccess

Value parameters

callback

Handler to be invoked on successful call, where passed value is elapsed time in nanoseconds.

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def addOnCallTimeoutListener(callback: Consumer[Long]): CircuitBreaker

JavaAPI for onCallTimeout.

JavaAPI for onCallTimeout.

Value parameters

callback

Handler to be invoked on call finished with timeout, where passed value is elapsed time in nanoseconds.

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def addOnCloseListener(callback: Runnable): CircuitBreaker

JavaAPI for onClose

JavaAPI for onClose

Value parameters

callback

Handler to be invoked on state change

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def addOnHalfOpenListener(callback: Runnable): CircuitBreaker

JavaAPI for onHalfOpen

JavaAPI for onHalfOpen

Value parameters

callback

Handler to be invoked on state change

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def addOnOpenListener(callback: Runnable): CircuitBreaker

Java API for onOpen

Java API for onOpen

Value parameters

callback

Handler to be invoked on state change

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def callWithCircuitBreaker[T](body: Callable[Future[T]]): Future[T]

Java API for withCircuitBreaker.

Java API for withCircuitBreaker.

Value parameters

body

Call needing protected

Attributes

Returns

scala.concurrent.Future containing the call result or a scala.concurrent.TimeoutException if the call timed out

Source
CircuitBreaker.scala
def callWithCircuitBreaker[T](body: Callable[Future[T]], defineFailureFn: BiFunction[Optional[T], Optional[Throwable], Boolean]): Future[T]

Java API for withCircuitBreaker.

Java API for withCircuitBreaker.

Value parameters

body

Call needing protected

defineFailureFn

function that define what should be consider failure and thus increase failure count

Attributes

Returns

scala.concurrent.Future containing the call result or a scala.concurrent.TimeoutException if the call timed out

Source
CircuitBreaker.scala
def callWithCircuitBreakerCS[T](body: Callable[CompletionStage[T]]): CompletionStage[T]

Java API (8) for withCircuitBreaker.

Java API (8) for withCircuitBreaker.

Value parameters

body

Call needing protected

Attributes

Returns

java.util.concurrent.CompletionStage containing the call result or a scala.concurrent.TimeoutException if the call timed out

Source
CircuitBreaker.scala
def callWithCircuitBreakerCS[T](body: Callable[CompletionStage[T]], defineFailureFn: BiFunction[Optional[T], Optional[Throwable], Boolean]): CompletionStage[T]

Java API (8) for withCircuitBreaker.

Java API (8) for withCircuitBreaker.

Value parameters

body

Call needing protected

defineFailureFn

function that define what should be consider failure and thus increase failure count

Attributes

Returns

java.util.concurrent.CompletionStage containing the call result or a scala.concurrent.TimeoutException if the call timed out

Source
CircuitBreaker.scala
def callWithSyncCircuitBreaker[T](body: Callable[T]): T

Java API for withSyncCircuitBreaker. Throws java.util.concurrent.TimeoutException if the call timed out.

Java API for withSyncCircuitBreaker. Throws java.util.concurrent.TimeoutException if the call timed out.

Value parameters

body

Call needing protected

Attributes

Returns

The result of the call

Source
CircuitBreaker.scala
def callWithSyncCircuitBreaker[T](body: Callable[T], defineFailureFn: BiFunction[Optional[T], Optional[Throwable], Boolean]): T

Java API for withSyncCircuitBreaker. Throws java.util.concurrent.TimeoutException if the call timed out.

Java API for withSyncCircuitBreaker. Throws java.util.concurrent.TimeoutException if the call timed out.

Value parameters

body

Call needing protected

defineFailureFn

function that define what should be consider failure and thus increase failure count

Attributes

Returns

The result of the call

Source
CircuitBreaker.scala
def fail(): Unit

Mark a failed call through CircuitBreaker. Sometimes the callee of CircuitBreaker sends back a message to the caller Actor. In such a case, it is convenient to mark a failed call instead of using Future via withCircuitBreaker

Mark a failed call through CircuitBreaker. Sometimes the callee of CircuitBreaker sends back a message to the caller Actor. In such a case, it is convenient to mark a failed call instead of using Future via withCircuitBreaker

Attributes

Source
CircuitBreaker.scala

Return true if the internal state is Closed. WARNING: It is a "power API" call which you should use with care. Ordinal use cases of CircuitBreaker expects a remote call to return Future, as in withCircuitBreaker. So, if you check the state by yourself, and make a remote call outside CircuitBreaker, you should manage the state yourself.

Return true if the internal state is Closed. WARNING: It is a "power API" call which you should use with care. Ordinal use cases of CircuitBreaker expects a remote call to return Future, as in withCircuitBreaker. So, if you check the state by yourself, and make a remote call outside CircuitBreaker, you should manage the state yourself.

Attributes

Source
CircuitBreaker.scala

Return true if the internal state is HalfOpen. WARNING: It is a "power API" call which you should use with care. Ordinal use cases of CircuitBreaker expects a remote call to return Future, as in withCircuitBreaker. So, if you check the state by yourself, and make a remote call outside CircuitBreaker, you should manage the state yourself.

Return true if the internal state is HalfOpen. WARNING: It is a "power API" call which you should use with care. Ordinal use cases of CircuitBreaker expects a remote call to return Future, as in withCircuitBreaker. So, if you check the state by yourself, and make a remote call outside CircuitBreaker, you should manage the state yourself.

Attributes

Source
CircuitBreaker.scala

Return true if the internal state is Open. WARNING: It is a "power API" call which you should use with care. Ordinal use cases of CircuitBreaker expects a remote call to return Future, as in withCircuitBreaker. So, if you check the state by yourself, and make a remote call outside CircuitBreaker, you should manage the state yourself.

Return true if the internal state is Open. WARNING: It is a "power API" call which you should use with care. Ordinal use cases of CircuitBreaker expects a remote call to return Future, as in withCircuitBreaker. So, if you check the state by yourself, and make a remote call outside CircuitBreaker, you should manage the state yourself.

Attributes

Source
CircuitBreaker.scala

Adds a callback to execute if call was failed due to open breaker.

Adds a callback to execute if call was failed due to open breaker.

The callback is run in the scala.concurrent.ExecutionContext supplied in the constructor.

Value parameters

callback

Handler to be invoked on call failed due to open breaker.

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def onCallFailure(callback: Long => Unit): CircuitBreaker

Adds a callback to execute if the call finished with failure.

Adds a callback to execute if the call finished with failure.

The callback is run in the scala.concurrent.ExecutionContext supplied in the constructor.

Value parameters

callback

Handler to be invoked on failed call, where passed value is elapsed time in nanoseconds.

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def onCallSuccess(callback: Long => Unit): CircuitBreaker

Adds a callback to execute when call finished with success.

Adds a callback to execute when call finished with success.

The callback is run in the scala.concurrent.ExecutionContext supplied in the constructor.

Value parameters

callback

Handler to be invoked on successful call, where passed value is elapsed time in nanoseconds.

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def onCallTimeout(callback: Long => Unit): CircuitBreaker

Adds a callback to execute if a call finished with timeout.

Adds a callback to execute if a call finished with timeout.

The callback is run in the scala.concurrent.ExecutionContext supplied in the constructor.

Value parameters

callback

Handler to be invoked on call finished with timeout, where passed value is elapsed time in nanoseconds.

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def onClose(callback: => Unit): CircuitBreaker

Adds a callback to execute when circuit breaker state closes

Adds a callback to execute when circuit breaker state closes

The callback is run in the scala.concurrent.ExecutionContext supplied in the constructor.

Value parameters

callback

Handler to be invoked on state change

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def onHalfOpen(callback: => Unit): CircuitBreaker

Adds a callback to execute when circuit breaker transitions to half-open The callback is run in the scala.concurrent.ExecutionContext supplied in the constructor.

Adds a callback to execute when circuit breaker transitions to half-open The callback is run in the scala.concurrent.ExecutionContext supplied in the constructor.

Value parameters

callback

Handler to be invoked on state change

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def onOpen(callback: => Unit): CircuitBreaker

Adds a callback to execute when circuit breaker opens

Adds a callback to execute when circuit breaker opens

The callback is run in the scala.concurrent.ExecutionContext supplied in the constructor.

Value parameters

callback

Handler to be invoked on state change

Attributes

Returns

CircuitBreaker for fluent usage

Source
CircuitBreaker.scala
def succeed(): Unit

Mark a successful call through CircuitBreaker. Sometimes the callee of CircuitBreaker sends back a message to the caller Actor. In such a case, it is convenient to mark a successful call instead of using Future via withCircuitBreaker

Mark a successful call through CircuitBreaker. Sometimes the callee of CircuitBreaker sends back a message to the caller Actor. In such a case, it is convenient to mark a successful call instead of using Future via withCircuitBreaker

Attributes

Source
CircuitBreaker.scala
def withCircuitBreaker[T](body: => Future[T], defineFailureFn: (Try[T]) => Boolean): Future[T]

Wraps invocations of asynchronous calls that need to be protected.

Wraps invocations of asynchronous calls that need to be protected.

Value parameters

body

Call needing protected

defineFailureFn

function that define what should be consider failure and thus increase failure count

Attributes

Returns

scala.concurrent.Future containing the call result or a scala.concurrent.TimeoutException if the call timed out

Source
CircuitBreaker.scala
def withCircuitBreaker[T](body: => Future[T]): Future[T]

Wraps invocations of asynchronous calls that need to be protected.

Wraps invocations of asynchronous calls that need to be protected.

Value parameters

body

Call needing protected

Attributes

Returns

scala.concurrent.Future containing the call result or a scala.concurrent.TimeoutException if the call timed out

Source
CircuitBreaker.scala

The resetTimeout will be increased exponentially for each failed attempt to close the circuit. The default exponential backoff factor is 2.

The resetTimeout will be increased exponentially for each failed attempt to close the circuit. The default exponential backoff factor is 2.

Value parameters

maxResetTimeout

the upper bound of resetTimeout

Attributes

Source
CircuitBreaker.scala
def withExponentialBackoff(maxResetTimeout: Duration): CircuitBreaker

The resetTimeout will be increased exponentially for each failed attempt to close the circuit. The default exponential backoff factor is 2.

The resetTimeout will be increased exponentially for each failed attempt to close the circuit. The default exponential backoff factor is 2.

Value parameters

maxResetTimeout

the upper bound of resetTimeout

Attributes

Source
CircuitBreaker.scala
def withRandomFactor(randomFactor: Double): CircuitBreaker

Adds jitter to the delay.

Adds jitter to the delay.

Value parameters

randomFactor

after calculation of the back-off an additional random delay based on this factor is added, e.g. 0.2 adds up to 20% delay. In order to skip this additional delay pass in 0.

Attributes

Source
CircuitBreaker.scala
def withSyncCircuitBreaker[T](body: => T): T

Wraps invocations of synchronous calls that need to be protected.

Wraps invocations of synchronous calls that need to be protected.

Calls are run in the caller's thread. Because of the synchronous nature of this call, the scala.concurrent.TimeoutException will only be thrown after the body has completed.

Throws java.util.concurrent.TimeoutException if the call timed out.

Value parameters

body

Call needing protected

Attributes

Returns

The result of the call

Source
CircuitBreaker.scala
def withSyncCircuitBreaker[T](body: => T, defineFailureFn: (Try[T]) => Boolean): T

Wraps invocations of synchronous calls that need to be protected.

Wraps invocations of synchronous calls that need to be protected.

Calls are run in caller's thread. Because of the synchronous nature of this call the scala.concurrent.TimeoutException will only be thrown after the body has completed.

Throws java.util.concurrent.TimeoutException if the call timed out.

Value parameters

body

Call needing protected

defineFailureFn

function that define what should be consider failure and thus increase failure count

Attributes

Returns

The result of the call

Source
CircuitBreaker.scala

Concrete fields