diff --git a/akka-actor/src/main/mima-filters/2.6.19.backward.excludes/31055-actorContext-cancelReceiveTimeout.excludes b/akka-actor/src/main/mima-filters/2.6.19.backward.excludes/31055-actorContext-cancelReceiveTimeout.excludes new file mode 100644 index 0000000000..00916cc86e --- /dev/null +++ b/akka-actor/src/main/mima-filters/2.6.19.backward.excludes/31055-actorContext-cancelReceiveTimeout.excludes @@ -0,0 +1,2 @@ +# internal actor class +ProblemFilters.exclude[DirectMissingMethodProblem]("akka.actor.dungeon.ReceiveTimeout.cancelReceiveTimeout") \ No newline at end of file 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 c70799decd..797131ece2 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala @@ -43,7 +43,7 @@ private[akka] trait ReceiveTimeout { this: ActorCell => if (reschedule || (task eq emptyCancellable)) rescheduleReceiveTimeout(f) - case _ => cancelReceiveTimeout() + case _ => cancelReceiveTimeoutTask() } } @@ -60,12 +60,12 @@ private[akka] trait ReceiveTimeout { this: ActorCell => protected def cancelReceiveTimeoutIfNeeded(message: Any): (Duration, Cancellable) = { if (hasTimeoutData && !message.isInstanceOf[NotInfluenceReceiveTimeout]) - cancelReceiveTimeout() + cancelReceiveTimeoutTask() receiveTimeoutData } - override final def cancelReceiveTimeout(): Unit = + private def cancelReceiveTimeoutTask(): Unit = if (receiveTimeoutData._2 ne emptyCancellable) { receiveTimeoutData._2.cancel() receiveTimeoutData = (receiveTimeoutData._1, emptyCancellable) diff --git a/akka-docs/src/test/java/jdocs/actor/ActorDocTest.java b/akka-docs/src/test/java/jdocs/actor/ActorDocTest.java index 3b6c7cc1dd..3e1353623f 100644 --- a/akka-docs/src/test/java/jdocs/actor/ActorDocTest.java +++ b/akka-docs/src/test/java/jdocs/actor/ActorDocTest.java @@ -585,6 +585,46 @@ public class ActorDocTest extends AbstractJavaTest { }; } + static class ReceiveTimeoutWithCancelActor extends AbstractActor { + private ActorRef target = getContext().getSystem().deadLetters(); + + public ReceiveTimeoutWithCancelActor() { + getContext().setReceiveTimeout(Duration.ofSeconds(1)); + } + + @Override + public Receive createReceive() { + return receiveBuilder() + .matchEquals( + "Hello", + s -> { + target = getSender(); + target.tell("Hello world", getSelf()); + getContext().setReceiveTimeout(Duration.ofMillis(200)); + }) + .match( + ReceiveTimeout.class, + r -> { + getContext().cancelReceiveTimeout(); + target.tell("timeout", getSelf()); + }) + .build(); + } + } + + @Test + public void cancel_receiveTimeout() { + final ActorRef myActor = system.actorOf(Props.create(ReceiveTimeoutWithCancelActor.class)); + new TestKit(system) { + { + myActor.tell("Hello", getRef()); + expectMsgEquals("Hello world"); + expectMsgEquals("timeout"); + expectNoMessage(Duration.ofMillis(400)); + } + }; + } + public // #hot-swap-actor static class HotSwapActor extends AbstractActor {