=act Reset receiveTimeoutData to emptyReceiveTimeoutData when cancel (#31059)
This commit is contained in:
parent
9d0684d875
commit
4585c3823e
3 changed files with 45 additions and 3 deletions
|
|
@ -0,0 +1,2 @@
|
||||||
|
# internal actor class
|
||||||
|
ProblemFilters.exclude[DirectMissingMethodProblem]("akka.actor.dungeon.ReceiveTimeout.cancelReceiveTimeout")
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue