1

我正在使用 Java+Akka 创建一个演员系统。特别是,我通过提供 onReceive() 方法的实现来定义无类型的参与者。

在该方法中,我通过定义在接收到消息时要执行的逻辑来实现参与者的行为。它可能是这样的:

public void onReceive(Object msg) throws Exception {
  if(msg instanceof MsgType1){ ... }
  else if(msg instanceof MsgType2){ ... }
  else unhandled(msg);
}

但是,如果演员只对单一类型的味精感兴趣怎么办?是否可以实现选择性接收,让actor等待某个msg(并且系统会自动将所有其他类型的消息重新排队)???

4

1 回答 1

3

这种“a la Erlang”消息处理模式在 Akka AFAIK 中不可用。但是,您可以使用Stash来获得您想要的效果。

所以代码看起来像这样

public void onReceive(Object msg) throws Exception {
    if(msg instanceof MsgType1){ ... }
    else if(msg instanceof MsgType2){ ... }
    else stash();
}

在消息处理的某个时刻,您会切换到另一种状态(可能是通过调用getContext().become)。您还可以unstashAll()拨打电话,以便将您忽略的消息重新附加到邮箱中。

于 2013-08-27T14:54:50.220 回答