=act Reset receiveTimeoutData to emptyReceiveTimeoutData when cancel (#31059)

This commit is contained in:
kerr 2022-01-19 19:17:51 +08:00 committed by GitHub
parent 9d0684d875
commit 4585c3823e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 3 deletions

View file

@ -0,0 +1,2 @@
# internal actor class
ProblemFilters.exclude[DirectMissingMethodProblem]("akka.actor.dungeon.ReceiveTimeout.cancelReceiveTimeout")

View file

@ -43,7 +43,7 @@ private[akka] trait ReceiveTimeout { this: ActorCell =>
if (reschedule || (task eq emptyCancellable)) if (reschedule || (task eq emptyCancellable))
rescheduleReceiveTimeout(f) rescheduleReceiveTimeout(f)
case _ => cancelReceiveTimeout() case _ => cancelReceiveTimeoutTask()
} }
} }
@ -60,12 +60,12 @@ private[akka] trait ReceiveTimeout { this: ActorCell =>
protected def cancelReceiveTimeoutIfNeeded(message: Any): (Duration, Cancellable) = { protected def cancelReceiveTimeoutIfNeeded(message: Any): (Duration, Cancellable) = {
if (hasTimeoutData && !message.isInstanceOf[NotInfluenceReceiveTimeout]) if (hasTimeoutData && !message.isInstanceOf[NotInfluenceReceiveTimeout])
cancelReceiveTimeout() cancelReceiveTimeoutTask()
receiveTimeoutData receiveTimeoutData
} }
override final def cancelReceiveTimeout(): Unit = private def cancelReceiveTimeoutTask(): Unit =
if (receiveTimeoutData._2 ne emptyCancellable) { if (receiveTimeoutData._2 ne emptyCancellable) {
receiveTimeoutData._2.cancel() receiveTimeoutData._2.cancel()
receiveTimeoutData = (receiveTimeoutData._1, emptyCancellable) receiveTimeoutData = (receiveTimeoutData._1, emptyCancellable)

View file

@ -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 public
// #hot-swap-actor // #hot-swap-actor
static class HotSwapActor extends AbstractActor { static class HotSwapActor extends AbstractActor {