Fix ReceiveTimeout issue with NotInfluenceReceiveTimeout #24770

This commit is contained in:
Olivier ROLAND 2018-05-22 10:42:35 +02:00 committed by Johan Andrén
parent f750f73e1f
commit 00f07c2429
2 changed files with 19 additions and 4 deletions

View file

@ -113,5 +113,23 @@ class ReceiveTimeoutSpec extends AkkaSpec {
ticks.cancel() ticks.cancel()
system.stop(timeoutActor) 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)
}
} }
} }

View file

@ -26,16 +26,13 @@ private[akka] trait ReceiveTimeout { this: ActorCell ⇒
final def checkReceiveTimeout() { final def checkReceiveTimeout() {
val recvtimeout = receiveTimeoutData val recvtimeout = receiveTimeoutData
//Only reschedule if desired and there are currently no more messages to be processed recvtimeout._1 match {
if (!mailbox.hasMessages) recvtimeout._1 match {
case f: FiniteDuration case f: FiniteDuration
recvtimeout._2.cancel() //Cancel any ongoing future recvtimeout._2.cancel() //Cancel any ongoing future
val task = system.scheduler.scheduleOnce(f, self, akka.actor.ReceiveTimeout)(this.dispatcher) val task = system.scheduler.scheduleOnce(f, self, akka.actor.ReceiveTimeout)(this.dispatcher)
receiveTimeoutData = (f, task) receiveTimeoutData = (f, task)
case _ cancelReceiveTimeout() case _ cancelReceiveTimeout()
} }
else cancelReceiveTimeout()
} }
override final def cancelReceiveTimeout(): Unit = override final def cancelReceiveTimeout(): Unit =