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 e98eca52c7..eca8a779e9 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala @@ -113,5 +113,23 @@ class ReceiveTimeoutSpec extends AkkaSpec { ticks.cancel() system.stop(timeoutActor) } + + "get timeout while receiving only NotInfluenceReceiveTimeout messages" taggedAs TimingTest in { + val timeoutLatch = TestLatch(2) + + val timeoutActor = system.actorOf(Props(new Actor { + context.setReceiveTimeout(1 second) + + def receive = { + case ReceiveTimeout ⇒ + self ! TransperentTick + timeoutLatch.countDown() + case TransperentTick ⇒ + } + })) + + Await.ready(timeoutLatch, TestLatch.DefaultTimeout) + system.stop(timeoutActor) + } } } diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala b/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala index 35431c7241..be9bed96c1 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala @@ -26,16 +26,13 @@ private[akka] trait ReceiveTimeout { this: ActorCell ⇒ 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 { + 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() - } override final def cancelReceiveTimeout(): Unit =