We live in times where software systems are built by small services that are talking to each other. In such systems, transient errors can occur and interfere with the normal program execution flow. Transient faults are temporary abnormal conditions such as offline services, infrastructure faults, or network issues. It is common practice to retry transient faults using a retry loop mechanism. This minimalistic library tries to solve this problem by implementing the retry side effect and give the user different backoff strategies.
libraryDependencies += "com.github.hipjim" %% "scala-retry" % "0.4.0"
compile group: 'com.github.hipjim', name: 'scala-retry_2.13', version: '0.4.0'
<dependency>
<groupId>com.github.hipjim</groupId>
<artifactId>scala-retry_2.13</artifactId>
<version>0.4.0</version>
</dependency>
Versions for Scala 2.12
, Scala 2.11
and Scala 2.10
are available.
import scala.concurrent.duration._
import util.retry.blocking.{RetryStrategy, Failure, Retry, Success}
// define the retry strategy
implicit val retryStrategy =
RetryStrategy.fixedBackOff(retryDuration = 1.seconds, maxAttempts = 2)
// pattern match the result
val r = Retry(1 / 1) match {
case Success(x) => x
case Failure(t) => log("I got 99 problems but you won't be one", t)
}
// recover in case of a failure
val recover = Retry(1 / 0) recover {
case NonFatal(t) => Int.MaxValue
}
// get or else in case of failure
val result = Retry(1 / 0).getOrElse(1)
// can be used in for comprehensions
val result = for {
x <- Retry(1 / 0) // fails with java.lang.ArithmeticException: / by zero
y <- Retry(1 / 1) // success
} yield x + y // result is Failure with java.lang.ArithmeticException: / by zero
val retryStrategy =
RetryStrategy.fixedBackOff(retryDuration = 3.seconds, maxAttempts = 5)
val retryStrategy =
RetryStrategy.fibonacciBackOff(initialWaitDuration = 3.seconds, maxAttempts = 5)
val retryStrategy =
RetryStrategy.randomBackOff(
minimumWaitDuration = 1.seconds,
maximumWaitDuration = 10.seconds,
maxAttempts = 10
)
val retryStrategy = RetryStrategy.noBackOff(maxAttempts = 10)
val retryStrategy = RetryStrategy.noRetry