我有一个UntypedActor
正在运行PinnedDispatcher
,启动时会尝试执行一个重任务 T 。
为了使演员更具响应性,任务 T 被切入许多连续的子任务 T 1 ... T n ,每个子任务处理程序发送一条新消息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
)留在邮箱中。
有没有办法让这种演员在重启后处于干净的初始状态?
答案 0 :(得分:0)
使用getContext().become()
,我们可以构建状态机。当actor处于初始状态时,它只期望一种消息开始处理(在这种情况下为T1
)。收到此消息之前,请忽略任何其他消息。