在执行组件重新启动之前处理残留消息



我有一个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)。在收到此消息之前,只需忽略任何其他消息即可。

最新更新