【发布时间】:2017-04-13 09:53:13
【问题描述】:
我有一个大致如下所示的演员系统:
class LocalActor extends Actor {
// create the remote actor
val remoteActor = context.actorSelection("akka.tcp://RemoteSystem@127.0.0.1:2552/user/RemoteActor")
def receive = {
case foo: String => remoteActor ! s"foo = ${foo}"
case bar: Int => remoteActor ! s"bar = ${bar}"
case _ => remoteActor ! "No clue..."
}
}
我想重构它,这样remoteActor 的 TCP/IP 就不会被硬编码。最简单的更改是将其显式传递给构造函数:
class LocalActor(TcpIp: String) extends Actor {
val remoteActor = context.actorSelection(TcpIp)
// ...
}
但我担心如果 TCP/IP 地址已在使用中,这可能会导致问题。对我来说最有意义的选项是将参与者(或引用或类似的)传递给构造函数——在 Akka 中是否有一种惯用的方式来做到这一点?
我有点困惑,因为remoteActor 的类型是akka.actor.ActorSelection,我可能预计它是Actor 或ActorRef。
幸运的是,远程参与者只与sender 交互,所以它的方式很好;但是本地演员还是很棘手的。
如果我上面的想法不是一个好的想法,那么让这个更通用和可测试的传统方法是什么?
【问题讨论】:
标签: scala unit-testing refactoring akka