我有一个UntypedActor
在运行PinnedDispatcher
,当启动时,它会尝试执行一个且只有一个繁重的任务 T。
为了使参与者响应更快,任务 T 被切成许多连续的子任务 T1 ...Tn,每个子任务处理程序self()
发送一条新消息以继续下一个子任务:
@Override
public void onReceive(Object message) throws Exception {
try {
MethodUtils.invokeMethod(this, "handleMessage", message);
} catch (NoSuchMethodException nsme) {
unhandled(message);
}
}
@SuppressWarnings("unused")
public void handleMessage(T1 message) {
doTask1();
getSelf().tell(new T2(), getSelf());
}
@SuppressWarnings("unused")
public void handleMessage(T2 message) {
doTask2();
getSelf().tell(new T3(), getSelf());
}
问题是,如果参与者崩溃于来自其他参与者的消息,则可能是一些残留消息(例如 重新启动后,T3
) 将保留在邮箱中。
有没有办法让这种演员在重启后处于干净的初始状态?
有了getContext().become()
,我们可以构建一个状态机。当参与者处于初始状态时,它只期望一种消息开始处理(在本例中T1
)。在收到此消息之前,只需忽略任何其他消息即可。