From 947cea3a8c321f081b19331650d063eba4151e9f Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 18 Sep 2012 18:17:44 +0200 Subject: [PATCH] more conversion to FiniteDuration, plus fix the build, see #2521 - also remove resetReceiveTimeout and change receiveTimeout() to return a Duration (which may be Undefined) - also move akka.actor.{cell -> dungeon}, because that is + an adequate name + and does not coincide with the lowercase version of a class name --- .../src/test/scala/akka/actor/IOActor.scala | 6 +- .../scala/akka/actor/ReceiveTimeoutSpec.scala | 5 +- .../{cell => dungeon}/AbstractActorCell.java | 8 +-- .../src/main/scala/akka/actor/ActorCell.scala | 32 +++++----- .../main/scala/akka/actor/ActorSystem.scala | 2 +- .../akka/actor/RepointableActorRef.scala | 2 +- .../src/main/scala/akka/actor/Scheduler.scala | 12 ++-- .../akka/actor/cell/ReceiveTimeout.scala | 59 ------------------- .../actor/{cell => dungeon}/Children.scala | 2 +- .../{cell => dungeon}/ChildrenContainer.scala | 2 +- .../actor/{cell => dungeon}/DeathWatch.scala | 2 +- .../actor/{cell => dungeon}/Dispatch.scala | 2 +- .../{cell => dungeon}/FaultHandling.scala | 7 ++- .../akka/actor/dungeon/ReceiveTimeout.scala | 49 +++++++++++++++ .../src/main/scala/akka/cluster/Cluster.scala | 12 ++-- .../project/migration-guide-2.0.x-2.1.x.rst | 21 +++++++ .../scala/akka/testkit/TestActorRefSpec.scala | 4 +- 17 files changed, 120 insertions(+), 107 deletions(-) rename akka-actor/src/main/java/akka/actor/{cell => dungeon}/AbstractActorCell.java (65%) delete mode 100644 akka-actor/src/main/scala/akka/actor/cell/ReceiveTimeout.scala rename akka-actor/src/main/scala/akka/actor/{cell => dungeon}/Children.scala (99%) rename akka-actor/src/main/scala/akka/actor/{cell => dungeon}/ChildrenContainer.scala (99%) rename akka-actor/src/main/scala/akka/actor/{cell => dungeon}/DeathWatch.scala (99%) rename akka-actor/src/main/scala/akka/actor/{cell => dungeon}/Dispatch.scala (99%) rename akka-actor/src/main/scala/akka/actor/{cell => dungeon}/FaultHandling.scala (98%) create mode 100644 akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala diff --git a/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala b/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala index ccb18e60ea..58ffb9c602 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala @@ -245,9 +245,9 @@ class IOActorSpec extends AkkaSpec with DefaultTimeout { * @return a future containing the result or the last exception before a limit was hit. */ def retry[T](count: Option[Int] = None, - timeout: Option[FiniteDuration] = None, - delay: Option[FiniteDuration] = Some(100 millis), - filter: Option[Throwable ⇒ Boolean] = None)(future: ⇒ Future[T])(implicit executor: ExecutionContext): Future[T] = { + timeout: Option[FiniteDuration] = None, + delay: Option[FiniteDuration] = Some(100 millis), + filter: Option[Throwable ⇒ Boolean] = None)(future: ⇒ Future[T])(implicit executor: ExecutionContext): Future[T] = { val promise = Promise[T]() diff --git a/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala index dc5229ae41..a74cbc9839 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala @@ -5,13 +5,12 @@ package akka.actor import language.postfixOps - import akka.testkit._ import scala.concurrent.util.duration._ - import java.util.concurrent.atomic.AtomicInteger import scala.concurrent.Await import java.util.concurrent.TimeoutException +import scala.concurrent.util.Duration @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class ReceiveTimeoutSpec extends AkkaSpec { @@ -65,7 +64,7 @@ class ReceiveTimeoutSpec extends AkkaSpec { case ReceiveTimeout ⇒ count.incrementAndGet timeoutLatch.open - context.resetReceiveTimeout() + context.setReceiveTimeout(Duration.Undefined) } })) diff --git a/akka-actor/src/main/java/akka/actor/cell/AbstractActorCell.java b/akka-actor/src/main/java/akka/actor/dungeon/AbstractActorCell.java similarity index 65% rename from akka-actor/src/main/java/akka/actor/cell/AbstractActorCell.java rename to akka-actor/src/main/java/akka/actor/dungeon/AbstractActorCell.java index 2d8c4fbc1e..6735b6e2cb 100644 --- a/akka-actor/src/main/java/akka/actor/cell/AbstractActorCell.java +++ b/akka-actor/src/main/java/akka/actor/dungeon/AbstractActorCell.java @@ -2,7 +2,7 @@ * Copyright (C) 2009-2012 Typesafe Inc. */ -package akka.actor.cell; +package akka.actor.dungeon; import akka.actor.ActorCell; import akka.util.Unsafe; @@ -14,9 +14,9 @@ final class AbstractActorCell { static { try { - mailboxOffset = Unsafe.instance.objectFieldOffset(ActorCell.class.getDeclaredField("akka$actor$cell$Dispatch$$_mailboxDoNotCallMeDirectly")); - childrenOffset = Unsafe.instance.objectFieldOffset(ActorCell.class.getDeclaredField("akka$actor$cell$Children$$_childrenRefsDoNotCallMeDirectly")); - nextNameOffset = Unsafe.instance.objectFieldOffset(ActorCell.class.getDeclaredField("akka$actor$cell$Children$$_nextNameDoNotCallMeDirectly")); + mailboxOffset = Unsafe.instance.objectFieldOffset(ActorCell.class.getDeclaredField("akka$actor$dungeon$Dispatch$$_mailboxDoNotCallMeDirectly")); + childrenOffset = Unsafe.instance.objectFieldOffset(ActorCell.class.getDeclaredField("akka$actor$dungeon$Children$$_childrenRefsDoNotCallMeDirectly")); + nextNameOffset = Unsafe.instance.objectFieldOffset(ActorCell.class.getDeclaredField("akka$actor$dungeon$Children$$_nextNameDoNotCallMeDirectly")); } catch(Throwable t){ throw new ExceptionInInitializerError(t); } diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index c34b9ac05e..2c12dae8e4 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -4,13 +4,13 @@ package akka.actor -import cell.ChildrenContainer.{ WaitingForChildren } import java.io.{ ObjectOutputStream, NotSerializableException } import scala.annotation.tailrec import scala.collection.immutable.TreeSet import scala.concurrent.util.Duration import scala.util.control.NonFatal -import akka.actor.cell.ChildrenContainer +import akka.actor.dungeon.ChildrenContainer +import akka.actor.dungeon.ChildrenContainer.WaitingForChildren import akka.dispatch.{ Watch, Unwatch, Terminate, SystemMessage, Suspend, Supervise, Resume, Recreate, NoMessage, MessageDispatcher, Envelope, Create, ChildTerminated } import akka.event.Logging.{ LogEvent, Debug, Error } import akka.japi.Procedure @@ -55,23 +55,25 @@ trait ActorContext extends ActorRefFactory { def props: Props /** - * Gets the current receive timeout + * Gets the current receive timeout. * When specified, the receive method should be able to handle a 'ReceiveTimeout' message. */ - def receiveTimeout: Option[Duration] + def receiveTimeout: Duration /** - * Defines the default timeout for an initial receive invocation. + * Defines the inactivity timeout after which the sending of a `ReceiveTimeout` message is triggered. * When specified, the receive function should be able to handle a 'ReceiveTimeout' message. * 1 millisecond is the minimum supported timeout. + * + * Please note that the receive timeout might fire and enqueue the `ReceiveTimeout` message right after + * another message was enqueued; hence it is '''not guaranteed''' that upon reception of the receive + * timeout there must have been an idle period beforehand as configured via this method. + * + * Once set, the receive timeout stays in effect (i.e. continues firing repeatedly after inactivity + * periods). Pass in `Duration.Undefined` to switch off this feature. */ def setReceiveTimeout(timeout: Duration): Unit - /** - * Clears the receive timeout, i.e. deactivates this feature. - */ - def resetReceiveTimeout(): Unit - /** * Changes the Actor's behavior to become the new 'Receive' (PartialFunction[Any, Unit]) handler. * Puts the behavior on top of the hotswap stack. @@ -290,11 +292,11 @@ private[akka] class ActorCell( val props: Props, val parent: InternalActorRef) extends UntypedActorContext with Cell - with cell.ReceiveTimeout - with cell.Children - with cell.Dispatch - with cell.DeathWatch - with cell.FaultHandling { + with dungeon.ReceiveTimeout + with dungeon.Children + with dungeon.Dispatch + with dungeon.DeathWatch + with dungeon.FaultHandling { import ActorCell._ diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index bce966b99e..3d3c4b83d4 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -17,7 +17,7 @@ import akka.util._ import akka.util.internal.{ HashedWheelTimer, ConcurrentIdentityHashMap } import java.util.concurrent.{ ThreadFactory, CountDownLatch, TimeoutException, RejectedExecutionException } import java.util.concurrent.TimeUnit.MILLISECONDS -import akka.actor.cell.ChildrenContainer +import akka.actor.dungeon.ChildrenContainer import scala.concurrent.util.FiniteDuration import util.{ Failure, Success } diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 3f0539f123..8ca8ab5cb7 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -12,7 +12,7 @@ import scala.annotation.tailrec import scala.collection.mutable.Queue import scala.concurrent.forkjoin.ThreadLocalRandom -import akka.actor.cell.ChildrenContainer +import akka.actor.dungeon.ChildrenContainer import akka.dispatch.{ Envelope, Supervise, SystemMessage, Terminate } import akka.event.Logging.Warning import akka.util.Unsafe diff --git a/akka-actor/src/main/scala/akka/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala index a3822d90ce..c210bc0976 100644 --- a/akka-actor/src/main/scala/akka/actor/Scheduler.scala +++ b/akka-actor/src/main/scala/akka/actor/Scheduler.scala @@ -30,13 +30,13 @@ trait Scheduler { * Schedules a message to be sent repeatedly with an initial delay and * frequency. E.g. if you would like a message to be sent immediately and * thereafter every 500ms you would set delay=Duration.Zero and - * frequency=Duration(500, TimeUnit.MILLISECONDS) + * interval=Duration(500, TimeUnit.MILLISECONDS) * * Java & Scala API */ def schedule( initialDelay: FiniteDuration, - frequency: FiniteDuration, + interval: FiniteDuration, receiver: ActorRef, message: Any)(implicit executor: ExecutionContext): Cancellable @@ -44,23 +44,23 @@ trait Scheduler { * Schedules a function to be run repeatedly with an initial delay and a * frequency. E.g. if you would like the function to be run after 2 seconds * and thereafter every 100ms you would set delay = Duration(2, TimeUnit.SECONDS) - * and frequency = Duration(100, TimeUnit.MILLISECONDS) + * and interval = Duration(100, TimeUnit.MILLISECONDS) * * Scala API */ def schedule( - initialDelay: FiniteDuration, frequency: FiniteDuration)(f: ⇒ Unit)(implicit executor: ExecutionContext): Cancellable + initialDelay: FiniteDuration, interval: FiniteDuration)(f: ⇒ Unit)(implicit executor: ExecutionContext): Cancellable /** * Schedules a function to be run repeatedly with an initial delay and * a frequency. E.g. if you would like the function to be run after 2 * seconds and thereafter every 100ms you would set delay = Duration(2, - * TimeUnit.SECONDS) and frequency = Duration(100, TimeUnit.MILLISECONDS) + * TimeUnit.SECONDS) and interval = Duration(100, TimeUnit.MILLISECONDS) * * Java API */ def schedule( - initialDelay: FiniteDuration, frequency: FiniteDuration, runnable: Runnable)(implicit executor: ExecutionContext): Cancellable + initialDelay: FiniteDuration, interval: FiniteDuration, runnable: Runnable)(implicit executor: ExecutionContext): Cancellable /** * Schedules a Runnable to be run once with a delay, i.e. a time period that diff --git a/akka-actor/src/main/scala/akka/actor/cell/ReceiveTimeout.scala b/akka-actor/src/main/scala/akka/actor/cell/ReceiveTimeout.scala deleted file mode 100644 index 6ff6a39dea..0000000000 --- a/akka-actor/src/main/scala/akka/actor/cell/ReceiveTimeout.scala +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.actor.cell - -import ReceiveTimeout.emptyReceiveTimeoutData -import akka.actor.ActorCell -import akka.actor.ActorCell.emptyCancellable -import akka.actor.Cancellable -import scala.concurrent.util.Duration -import scala.concurrent.util.FiniteDuration - -private[akka] object ReceiveTimeout { - final val emptyReceiveTimeoutData: (Option[FiniteDuration], Cancellable) = (None, ActorCell.emptyCancellable) -} - -private[akka] trait ReceiveTimeout { this: ActorCell ⇒ - - import ReceiveTimeout._ - import ActorCell._ - - private var receiveTimeoutData: (Option[FiniteDuration], Cancellable) = emptyReceiveTimeoutData - - final def receiveTimeout: Option[FiniteDuration] = receiveTimeoutData._1 - - final def setReceiveTimeout(timeout: Option[FiniteDuration]): Unit = - receiveTimeoutData = receiveTimeoutData.copy(_1 = timeout) - - final def setReceiveTimeout(timeout: Duration): Unit = { - import Duration._ - setReceiveTimeout(timeout match { - case x if x eq Undefined ⇒ None - case Inf | MinusInf ⇒ throw new IllegalArgumentException("receiveTimeout cannot be infinite") - case f: FiniteDuration ⇒ - if (f < Zero) throw new IllegalArgumentException("receiveTimeout cannot be negative") - else Some(f) - }) - } - - final def resetReceiveTimeout(): Unit = setReceiveTimeout(None) - - final def checkReceiveTimeout() { - val recvtimeout = receiveTimeoutData - if (recvtimeout._1.isDefined && !mailbox.hasMessages) { - recvtimeout._2.cancel() //Cancel any ongoing future - //Only reschedule if desired and there are currently no more messages to be processed - receiveTimeoutData = (recvtimeout._1, system.scheduler.scheduleOnce(recvtimeout._1.get, self, akka.actor.ReceiveTimeout)(this.dispatcher)) - } else cancelReceiveTimeout() - - } - - final def cancelReceiveTimeout(): Unit = - if (receiveTimeoutData._2 ne emptyCancellable) { - receiveTimeoutData._2.cancel() - receiveTimeoutData = (receiveTimeoutData._1, emptyCancellable) - } - -} \ No newline at end of file diff --git a/akka-actor/src/main/scala/akka/actor/cell/Children.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala similarity index 99% rename from akka-actor/src/main/scala/akka/actor/cell/Children.scala rename to akka-actor/src/main/scala/akka/actor/dungeon/Children.scala index 7fa8eceece..85dfd7095a 100644 --- a/akka-actor/src/main/scala/akka/actor/cell/Children.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009-2012 Typesafe Inc. */ -package akka.actor.cell +package akka.actor.dungeon import scala.annotation.tailrec import scala.collection.JavaConverters.asJavaIterableConverter diff --git a/akka-actor/src/main/scala/akka/actor/cell/ChildrenContainer.scala b/akka-actor/src/main/scala/akka/actor/dungeon/ChildrenContainer.scala similarity index 99% rename from akka-actor/src/main/scala/akka/actor/cell/ChildrenContainer.scala rename to akka-actor/src/main/scala/akka/actor/dungeon/ChildrenContainer.scala index d0bf76953a..eeb28cf018 100644 --- a/akka-actor/src/main/scala/akka/actor/cell/ChildrenContainer.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/ChildrenContainer.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009-2012 Typesafe Inc. */ -package akka.actor.cell +package akka.actor.dungeon import scala.collection.immutable.TreeMap diff --git a/akka-actor/src/main/scala/akka/actor/cell/DeathWatch.scala b/akka-actor/src/main/scala/akka/actor/dungeon/DeathWatch.scala similarity index 99% rename from akka-actor/src/main/scala/akka/actor/cell/DeathWatch.scala rename to akka-actor/src/main/scala/akka/actor/dungeon/DeathWatch.scala index f994e956c6..5407afc2c8 100644 --- a/akka-actor/src/main/scala/akka/actor/cell/DeathWatch.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/DeathWatch.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009-2012 Typesafe Inc. */ -package akka.actor.cell +package akka.actor.dungeon import akka.actor.{ Terminated, InternalActorRef, ActorRef, ActorCell, Actor, Address, AddressTerminated } import akka.dispatch.{ Watch, Unwatch } diff --git a/akka-actor/src/main/scala/akka/actor/cell/Dispatch.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala similarity index 99% rename from akka-actor/src/main/scala/akka/actor/cell/Dispatch.scala rename to akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala index 0f3619e208..e071c1605d 100644 --- a/akka-actor/src/main/scala/akka/actor/cell/Dispatch.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009-2012 Typesafe Inc. */ -package akka.actor.cell +package akka.actor.dungeon import scala.annotation.tailrec import akka.actor.{ ActorRef, ActorCell } diff --git a/akka-actor/src/main/scala/akka/actor/cell/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala similarity index 98% rename from akka-actor/src/main/scala/akka/actor/cell/FaultHandling.scala rename to akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala index 383db82b70..f7c06032c8 100644 --- a/akka-actor/src/main/scala/akka/actor/cell/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009-2012 Typesafe Inc. */ -package akka.actor.cell +package akka.actor.dungeon import scala.annotation.tailrec import akka.actor.{ PreRestartException, PostRestartException, InternalActorRef, Failed, ActorRef, ActorInterruptedException, ActorCell, Actor } @@ -16,6 +16,7 @@ import akka.actor.PreRestartException import akka.actor.Failed import akka.actor.PostRestartException import akka.event.Logging.Debug +import scala.concurrent.util.Duration private[akka] trait FaultHandling { this: ActorCell ⇒ @@ -121,7 +122,7 @@ private[akka] trait FaultHandling { this: ActorCell ⇒ assert(mailbox.isSuspended, "mailbox must be suspended during failed creation, status=" + mailbox.status) assert(perpetrator == self) - setReceiveTimeout(None) + setReceiveTimeout(Duration.Undefined) cancelReceiveTimeout // stop all children, which will turn childrenRefs into TerminatingChildrenContainer (if there are children) @@ -137,7 +138,7 @@ private[akka] trait FaultHandling { this: ActorCell ⇒ } protected def terminate() { - setReceiveTimeout(None) + setReceiveTimeout(Duration.Undefined) cancelReceiveTimeout // stop all children, which will turn childrenRefs into TerminatingChildrenContainer (if there are children) diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala b/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala new file mode 100644 index 0000000000..0c3661b59a --- /dev/null +++ b/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala @@ -0,0 +1,49 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.actor.dungeon + +import ReceiveTimeout.emptyReceiveTimeoutData +import akka.actor.ActorCell +import akka.actor.ActorCell.emptyCancellable +import akka.actor.Cancellable +import scala.concurrent.util.Duration +import scala.concurrent.util.FiniteDuration + +private[akka] object ReceiveTimeout { + final val emptyReceiveTimeoutData: (Duration, Cancellable) = (Duration.Undefined, ActorCell.emptyCancellable) +} + +private[akka] trait ReceiveTimeout { this: ActorCell ⇒ + + import ReceiveTimeout._ + import ActorCell._ + + private var receiveTimeoutData: (Duration, Cancellable) = emptyReceiveTimeoutData + + final def receiveTimeout: Duration = receiveTimeoutData._1 + + final def setReceiveTimeout(timeout: Duration): Unit = receiveTimeoutData = receiveTimeoutData.copy(_1 = timeout) + + final def checkReceiveTimeout() { + val recvtimeout = receiveTimeoutData + //Only reschedule if desired and there are currently no more messages to be processed + if (!mailbox.hasMessages) recvtimeout._1 match { + case f: FiniteDuration ⇒ + recvtimeout._2.cancel() //Cancel any ongoing future + val task = system.scheduler.scheduleOnce(f, self, akka.actor.ReceiveTimeout)(this.dispatcher) + receiveTimeoutData = (f, task) + case _ ⇒ cancelReceiveTimeout() + } + else cancelReceiveTimeout() + + } + + final def cancelReceiveTimeout(): Unit = + if (receiveTimeoutData._2 ne emptyCancellable) { + receiveTimeoutData._2.cancel() + receiveTimeoutData = (receiveTimeoutData._1, emptyCancellable) + } + +} \ No newline at end of file diff --git a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala index 9d9e955272..f924dc20de 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala @@ -109,16 +109,16 @@ class Cluster(val system: ExtendedActorSystem) extends Extension { new Scheduler with Closeable { override def close(): Unit = () // we are using system.scheduler, which we are not responsible for closing - override def schedule(initialDelay: FiniteDuration, frequency: FiniteDuration, + override def schedule(initialDelay: FiniteDuration, interval: FiniteDuration, receiver: ActorRef, message: Any)(implicit executor: ExecutionContext): Cancellable = - systemScheduler.schedule(initialDelay, frequency, receiver, message) + systemScheduler.schedule(initialDelay, interval, receiver, message) - override def schedule(initialDelay: FiniteDuration, frequency: FiniteDuration)(f: ⇒ Unit)(implicit executor: ExecutionContext): Cancellable = - systemScheduler.schedule(initialDelay, frequency)(f) + override def schedule(initialDelay: FiniteDuration, interval: FiniteDuration)(f: ⇒ Unit)(implicit executor: ExecutionContext): Cancellable = + systemScheduler.schedule(initialDelay, interval)(f) - override def schedule(initialDelay: FiniteDuration, frequency: FiniteDuration, + override def schedule(initialDelay: FiniteDuration, interval: FiniteDuration, runnable: Runnable)(implicit executor: ExecutionContext): Cancellable = - systemScheduler.schedule(initialDelay, frequency, runnable) + systemScheduler.schedule(initialDelay, interval, runnable) override def scheduleOnce(delay: FiniteDuration, runnable: Runnable)(implicit executor: ExecutionContext): Cancellable = diff --git a/akka-docs/project/migration-guide-2.0.x-2.1.x.rst b/akka-docs/project/migration-guide-2.0.x-2.1.x.rst index 2444e4c791..94f3d65b7f 100644 --- a/akka-docs/project/migration-guide-2.0.x-2.1.x.rst +++ b/akka-docs/project/migration-guide-2.0.x-2.1.x.rst @@ -385,3 +385,24 @@ v2.1:: final FiniteDuration d = Duration.create("1 second"); final Timeout t = new Timeout(d); // always required finite duration, now also in type +Actor Receive Timeout +===================== + +The API for setting and querying the receive timeout has been made more +consisten in always taking and returning a ``Duration``, the wrapping in +``Option`` has been removed. + +v2.0:: + + getContext().setReceiveTimeout(Duration.create(10, SECONDS)); + final Option timeout = getContext().receiveTimeout(); + final isSet = timeout.isDefined(); + resetReceiveTimeout(); + +v2.1:: + + getContext().setReceiveTimeout(Duration.create(10, SECONDS)); + final Duration timeout = getContext().receiveTimeout(); + final isSet = timeout.isFinite(); + getContext().setReceiveTimeout(Duration.Undefined()); + diff --git a/akka-testkit/src/test/scala/akka/testkit/TestActorRefSpec.scala b/akka-testkit/src/test/scala/akka/testkit/TestActorRefSpec.scala index f033df302f..2e835b408f 100644 --- a/akka-testkit/src/test/scala/akka/testkit/TestActorRefSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/TestActorRefSpec.scala @@ -4,7 +4,6 @@ package akka.testkit import language.{ postfixOps, reflectiveCalls } - import org.scalatest.matchers.MustMatchers import org.scalatest.{ BeforeAndAfterEach, WordSpec } import akka.actor._ @@ -14,6 +13,7 @@ import scala.concurrent.util.duration._ import akka.actor.ActorSystem import akka.pattern.ask import akka.dispatch.Dispatcher +import scala.concurrent.util.Duration /** * Test whether TestActorRef behaves as an ActorRef should, besides its own spec. @@ -244,7 +244,7 @@ class TestActorRefSpec extends AkkaSpec("disp1.type=Dispatcher") with BeforeAndA "set receiveTimeout to None" in { val a = TestActorRef[WorkerActor] - a.underlyingActor.context.receiveTimeout must be(None) + a.underlyingActor.context.receiveTimeout must be theSameInstanceAs Duration.Undefined } "set CallingThreadDispatcher" in {