【问题标题】:How to wrap existing ActorRef by TestActorRef in Akka?如何在 Akka 中通过 TestActorRef 包装现有的 ActorRef?
【发布时间】:2018-03-10 17:38:59
【问题描述】:

在测试 akka 演员系统时,我使用多个嵌套演员实例化它。作为入口点,父actor生成嵌套的子actor树。类似于生产树,但包含来自 H2 db 源的测试数据。

我需要验证整个系统的一部分(假设是单个参与者状态),由于数据不一致,无法单独访问或实例化其他部分。

我知道,对于独立的 actor 测试,可以通过使用以下构造来获取它的内部状态:

TestActorRef<RoutingRequestHandlerActor> fsmRef = TestActorRef.create(getSystem(), RoutingRequestHandler.props(), getTestActor());
RoutingRequestHandlerActor fsm = fsmRef.underlyingActor();

但是如果actor是间接创建的,我该怎么办? 是否有可能以某种方式包装它以获得Actor 而不是ActorRef

作为替代解决方案,我知道可以发送附加诊断消息以响应状态描述。但也许还有另一种更智能的方法?

【问题讨论】:

    标签: java scala akka


    【解决方案1】:

    是否有可能以某种方式包装它以获取 Actor 而不是 ActorRef?

    一般情况下这是不可能的,因为 Actor 实例可能会在远程服务器上创建。

    作为替代解决方案,我知道可以发送附加诊断消息以响应状态描述。

    我建议你这样做。只需发送一条特殊消息,例如 RetrieveState() 给参与者,然后向参与者添加一些代码以响应其应用程序特定的状态。

    这就是 Akka 在内部用于类似目的的方式。查看识别消息:

    https://doc.akka.io/japi/akka/current/akka/actor/Identify.html

    case class RetrieveStateRequest()
    case class RetrieveStateResponse[T](actorState: T)
    
    ...
    
    class YourActor extends Actor {
    
      def receive: Receive = {
        case RetrieveStateRequest() => 
             sender() ! RetrieveStateResponse(actorState)
        case m => unhandled(m)
      }
    }
    

    【讨论】:

    • 谢谢详细解释
    猜你喜欢
    • 2021-07-22
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多