Futures patterns
Dependency
The Akka dependencies are available from Akka’s library repository. To access them there, you need to configure the URL for this repository.
- sbt
resolvers += "Akka library repository".at("https://repo.akka.io/maven")
- Maven
<project> ... <repositories> <repository> <id>akka-repository</id> <name>Akka library repository</name> <url>https://repo.akka.io/maven</url> </repository> </repositories> </project>
- Gradle
repositories { mavenCentral() maven { url "https://repo.akka.io/maven" } }
Akka offers tiny helpers for use with Future
sCompletionStage
. These are part of Akka’s core module:
- sbt
val AkkaVersion = "2.10.0" libraryDependencies += "com.typesafe.akka" %% "akka-actor" % AkkaVersion
- Maven
<properties> <scala.binary.version>2.13</scala.binary.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka-bom_${scala.binary.version}</artifactId> <version>2.10.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka-actor_${scala.binary.version}</artifactId> </dependency> </dependencies>
- Gradle
def versions = [ ScalaBinary: "2.13" ] dependencies { implementation platform("com.typesafe.akka:akka-bom_${versions.ScalaBinary}:2.10.0") implementation "com.typesafe.akka:akka-actor_${versions.ScalaBinary}" }
After
akka.pattern.after
akka.pattern.Patterns.after
makes it easy to complete a Future
CompletionStage
with a value or exception after a timeout.
- Scala
-
source
val delayed = akka.pattern.after(200.millis)(Future.failed(new IllegalStateException("OHNOES"))) val future = Future { Thread.sleep(1000); "foo" } val result = Future.firstCompletedOf(Seq(future, delayed))
- Java
-
source
import akka.pattern.Patterns; CompletionStage<String> failWithException = CompletableFuture.supplyAsync( () -> { throw new IllegalStateException("OHNOES1"); }); CompletionStage<String> delayed = Patterns.after(Duration.ofMillis(200), system, () -> failWithException);
Retry
akka.pattern.retry
akka.pattern.Patterns.retry
will retry a Future
CompletionStage
some number of times with a delay between each attempt.
- Scala
-
source
import akka.actor.typed.scaladsl.adapter._ implicit val scheduler: akka.actor.Scheduler = system.scheduler.toClassic implicit val ec: ExecutionContext = system.executionContext //Given some future that will succeed eventually @volatile var failCount = 0 def futureToAttempt() = { if (failCount < 5) { failCount += 1 Future.failed(new IllegalStateException(failCount.toString)) } else Future.successful(5) } //Return a new future that will retry up to 10 times val retried: Future[Int] = akka.pattern.retry(() => futureToAttempt(), attempts = 10, 100 milliseconds)
- Java
-
source
import akka.pattern.Patterns; Callable<CompletionStage<String>> attempt = () -> CompletableFuture.completedFuture("test"); CompletionStage<String> retriedFuture = Patterns.retry(attempt, 3, java.time.Duration.ofMillis(200), system);