diff --git a/akka-docs/java/code/docs/future/FutureDocTestBase.java b/akka-docs/java/code/docs/future/FutureDocTestBase.java index d84c728dfe..6454926e9b 100644 --- a/akka-docs/java/code/docs/future/FutureDocTestBase.java +++ b/akka-docs/java/code/docs/future/FutureDocTestBase.java @@ -48,6 +48,11 @@ import scala.concurrent.ExecutionContext$; //#imports7 +//#imports8 +import static akka.pattern.Patterns.after; + +//#imports8 + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -508,6 +513,25 @@ public class FutureDocTestBase { } + @Test(expected = IllegalStateException.class) + public void useAfter() throws Exception { + //#after + final ExecutionContext ec = system.dispatcher(); + Future failExc = Futures.failed(new IllegalStateException("OHNOES1")); + Future delayed = Patterns.after(Duration.parse("500 millis"), + system.scheduler(), ec, failExc); + Future future = future(new Callable() { + public String call() throws InterruptedException { + Thread.sleep(1000); + return "foo"; + } + }, ec); + Future result = Futures.firstCompletedOf( + Arrays.asList(future, delayed), ec); + //#after + Await.result(result, Duration.create(2, SECONDS)); + } + public static class MyActor extends UntypedActor { public void onReceive(Object message) { if (message instanceof String) { diff --git a/akka-docs/java/futures.rst b/akka-docs/java/futures.rst index e0639420cb..641f7e7eda 100644 --- a/akka-docs/java/futures.rst +++ b/akka-docs/java/futures.rst @@ -235,3 +235,10 @@ and is use like this: .. includecode:: code/docs/future/FutureDocTestBase.java :include: try-recover +After +----- + +``akka.pattern.Patterns.after`` makes it easy to complete a ``Future`` with a value or exception after a timeout. + +.. includecode:: code/docs/future/FutureDocTestBase.java + :include: imports8,after diff --git a/akka-docs/scala/code/docs/future/FutureDocSpec.scala b/akka-docs/scala/code/docs/future/FutureDocSpec.scala index 4f3d8e2fd3..908a33523b 100644 --- a/akka-docs/scala/code/docs/future/FutureDocSpec.scala +++ b/akka-docs/scala/code/docs/future/FutureDocSpec.scala @@ -377,4 +377,16 @@ class FutureDocSpec extends AkkaSpec { intercept[IllegalArgumentException] { Await.result(otherFuture, 1 second) } } + "demonstrate usage of pattern.after" in { + //#after + import akka.pattern.after + + val delayed = after(500 millis, using = system.scheduler)(Promise.failed( + new IllegalStateException("OHNOES")).future) + val future = Future { Thread.sleep(1000); "foo" } + val result = Future.firstCompletedOf(Seq(Promise[String]().future, delayed)) + //#after + intercept[IllegalStateException] { Await.result(result, 2 second) } + } + } diff --git a/akka-docs/scala/futures.rst b/akka-docs/scala/futures.rst index 26936b0493..5a31482e81 100644 --- a/akka-docs/scala/futures.rst +++ b/akka-docs/scala/futures.rst @@ -261,3 +261,10 @@ and is use like this: .. includecode:: code/docs/future/FutureDocSpec.scala :include: try-recover +After +----- + +``akka.pattern.after`` makes it easy to complete a ``Future`` with a value or exception after a timeout. + +.. includecode:: code/docs/future/FutureDocSpec.scala + :include: after