Scala 阿克卡:如何检查演员目前的行为

Scala 阿克卡:如何检查演员目前的行为,scala,akka,Scala,Akka,我的演员有两种行为: context.become(running) context.become(stopped) 如何确定同一参与者的当前行为?以下是完整的代码: 新版本 我决定将代码移动到链接,因为stackoverflow不允许我在这里发布代码。您可以使用Akka FSM来实现相同的行为,而不是使用Been。使用Akka FSM,您必须能够注册状态更改通知。参考 通过此操作,感兴趣的参与者可以向EventFeedActor发送SubscribeTransionCallback(se

我的演员有两种行为:

context.become(running)
context.become(stopped)
如何确定同一参与者的当前行为?以下是完整的代码:

新版本


我决定将代码移动到链接,因为stackoverflow不允许我在这里发布代码。

您可以使用Akka FSM来实现相同的行为,而不是使用Been。使用Akka FSM,您必须能够注册状态更改通知。参考


通过此操作,感兴趣的参与者可以向EventFeedActor发送
SubscribeTransionCallback(self)
,并立即接收
CurrentState(actorRef,stateName)
转换(actorRef,oldState,newState)
每次进一步的状态转换。

向它发送另一条消息,并查看它在收到该消息时的行为。如果这符合新状态的预期行为,那么切换确实发生了。是的,但必须有更好的方法。您只能通过发送消息与参与者交互。否则,你就打破了参与者模型的观点。在看你的例子时,你的两个接收到的每个都有一条他们处理的消息,而另一个则没有。因此,如果您不想按照我最初的建议发送另一条消息,那么您可以调用
underyingactor.receive.isDefinedAt(msg)
,根据要检查的状态使用不同的类型。使用
Stop
查看是否处于
running
状态,使用
KeepAlive
检查是否处于
stopped
状态。仅为了可测试性而切换到FSM似乎不是最佳方法。另外,由于只有两种可能的状态,FSM在我看来有点过分了。好吧,没有其他方法可以满足您的需求。此外,我总是默认使用FSMs。如果我不能将某些东西放入FSM中,那么只能使用普通参与者。如果只是出于测试目的,那么我建议使用EventFilter机制。只需记录行为的切换,然后根据这些日志消息进行测试,以证明行为已经改变。
sealed trait State
case object Running extends State
case object Stopped extends State

case object Data

case object KeepAlive
case object Stop
case object CheckIfRunning

class EventsFeedActor extends Actor with FSM[State, Data.type] {
  startWith(Stopped, Data)
  when(Stopped) {
    case Event(KeepAlive, Data) => {
      ???
      goto(Running)
    }
    case Event(CheckIfRunning, Data) => {
      ???
      stay
    }
  }

  when(Running) {
    case Event(Stop, Data) => {
      ???
      goto(Stopped)
    }
    case Event(CheckIfRunning, Data) => {
      ???
      stay
    }
  }
}