diff --git a/akka-actor-tests/src/test/java/akka/actor/StashJavaAPI.java b/akka-actor-tests/src/test/java/akka/actor/StashJavaAPI.java new file mode 100644 index 0000000000..50df3d0a6b --- /dev/null +++ b/akka-actor-tests/src/test/java/akka/actor/StashJavaAPI.java @@ -0,0 +1,36 @@ +package akka.actor; + +import akka.actor.ActorSystem; +import akka.japi.Creator; +import akka.testkit.AkkaSpec; +import com.typesafe.config.ConfigFactory; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; + +public class StashJavaAPI { + + private static ActorSystem system; + + @BeforeClass + public static void beforeAll() { + system = ActorSystem.create("StashJavaAPI", ConfigFactory.parseString(ActorWithStashSpec.testConf())); + } + + @AfterClass + public static void afterAll() { + system.shutdown(); + system = null; + } + + @Test + public void mustBeAbleToUseStash() { + ActorRef ref = system.actorOf(new Props(StashJavaAPITestActor.class).withDispatcher("my-dispatcher")); + ref.tell("Hello", ref); + ref.tell("Hello", ref); + ref.tell(new Object()); + } + +} diff --git a/akka-actor-tests/src/test/java/akka/actor/StashJavaAPITestActor.java b/akka-actor-tests/src/test/java/akka/actor/StashJavaAPITestActor.java new file mode 100644 index 0000000000..8bc1bcc0d6 --- /dev/null +++ b/akka-actor-tests/src/test/java/akka/actor/StashJavaAPITestActor.java @@ -0,0 +1,23 @@ +package akka.actor; + +import static org.junit.Assert.*; + +public class StashJavaAPITestActor extends UntypedActorWithStash { + int count = 0; + public void onReceive(Object msg) { + if (msg instanceof String) { + if (count < 0) { + getSender().tell(new Integer(((String) msg).length())); + } else if (count == 2) { + count = -1; + unstashAll(); + } else { + count += 1; + stash(); + } + } else if (msg instanceof Integer) { + int value = ((Integer) msg).intValue(); + assertEquals(value, 5); + } + } +} diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorWithStashSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorWithStashSpec.scala index cd0b9308b9..c516a17a42 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorWithStashSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorWithStashSpec.scala @@ -11,6 +11,7 @@ import akka.pattern.ask import akka.util.duration._ import com.typesafe.config.{ Config, ConfigFactory } import org.scalatest.BeforeAndAfterEach +import org.scalatest.junit.JUnitSuite object ActorWithStashSpec { @@ -76,6 +77,8 @@ object ActorWithStashSpec { } +class JavaActorWithStashSpec extends StashJavaAPI with JUnitSuite + @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class ActorWithStashSpec extends AkkaSpec(ActorWithStashSpec.testConf) with DefaultTimeout with BeforeAndAfterEach { import ActorWithStashSpec._ diff --git a/akka-actor/src/main/scala/akka/actor/UntypedActorWithStash.scala b/akka-actor/src/main/scala/akka/actor/UntypedActorWithStash.scala new file mode 100644 index 0000000000..9b55e9397b --- /dev/null +++ b/akka-actor/src/main/scala/akka/actor/UntypedActorWithStash.scala @@ -0,0 +1,33 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.actor + +/** + * Actor base class that should be extended to create an actor with a stash. + * + * The stash enables an actor to temporarily stash away messages that can not or + * should not be handled using the actor's current behavior. + *

+ * Example: + *

+ *   public class MyActorWithStash extends UntypedActorWithStash {
+ *     int count = 0;
+ *     public void onReceive(Object msg) {
+ *       if (msg instanceof String) {
+ *         if (count < 0) {
+ *           getSender().tell(new Integer(((String) msg).length()));
+ *         } else if (count == 2) {
+ *           count = -1;
+ *           unstashAll();
+ *         } else {
+ *           count += 1;
+ *           stash();
+ *         }
+ *       }
+ *     }
+ *   }
+ * 
+ */ +abstract class UntypedActorWithStash extends UntypedActor with Stash