【问题标题】:Testing AKKA 2.6 persistence actor typed (alternatives to Kill and PoisonPill)测试 AKKA 2.6 持久性演员类型(Kill 和 PoisonPill 的替代品)
【发布时间】:2019-11-08 20:09:46
【问题描述】:

我对“Akka Classic”演员进行了测试,正在测试持久性。

逻辑很简单:

  1. 创建一个actor并发送一堆事件。
  2. 根据测试使用 akka.actor.Kill 或 akka.actor.PoisonKill 停止 actor。
  3. 再次启动actor并测试它是否已正确恢复。

我正在将其迁移到 AKKA 2.6 和“AKKA Typed”,但 Kill 和 PoisonKill 不可用。

来自文档:

Typed 不支持 PoisonPill。相反,如果您需要请求 要停止的演员,您应该定义一个消息,该演员 理解并让它在收到时返回 Behaviors.stopped 消息。

PoisonPill 行为很容易通过 TestKit.stop 实用程序重现。

但是杀死怎么样?它会抛出一个 ActorKilledException ,该异常将为主管进行管理。在 Akka Typed 中怎么做?

所以问题是:如何使用“AKKA Typed”来实现这个测试?

【问题讨论】:

    标签: akka akka-persistence akka-typed


    【解决方案1】:

    照顾stopping actorsActorRef可以在akka.actor.typed.scaladsl.adapter._被导入时使用toClassic并发送信号akka.actor.typed.internal.PoisonPill

    当定义 receiveSignal 并记录所有信号时,药丸会完成预期的工作,并且您的演员会停止。

    .receiveSignal {
        case (ctx, signal) =>
            ctx.log.debug("{}", signal)
            Behaviors.stopped
    }
    

    首先PoisonPill 然后PostStop 记录在我的案例中。

    【讨论】:

    • 嗨@sourcecodebot。感谢您的答复。关于它的几件事: 1. 添加不必要的运行时代码只是为了支持测试不是一个好习惯。 2. 它是一个内部类,所以使用它不是一个好习惯。 3. 此实现与经典 PoisonPill 类似地优雅地停止 actor,但它与 Kill 不同,后者会引发由主管管理的 ActorKilledException。一个新问题:返回 .toClassic 的 Actor 是否应该支持经典的 Kill 和 PoisonPill?
    • 嗨@angelcervera,为了匹配输入的内部信号api,我建议不要使用经典命令。 toClassic 允许您发送信号,该信号未在行为类型信息中定义。在处理您编辑的问题时,建议从您的行为命令类型扩展定义ShutdownInterrupt,并在这种情况下返回Behaviors.stoppedexample
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2014-03-09
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多