在actor重启之前处理残留消息

时间:2016-02-18 04:43:24

标签: java akka

我有一个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)留在邮箱中。

有没有办法让这种演员在重启后处于干净的初始状态?

1 个答案:

答案 0 :(得分:0)

使用getContext().become(),我们可以构建状态机。当actor处于初始状态时,它只期望一种消息开始处理(在这种情况下为T1)。收到此消息之前,请忽略任何其他消息。