@xtccc
2017-01-17T08:31:46.000000Z
字数 2283
阅读 2041
Akka
目录
参考:
val systemConfigs =
ConfigFactory.parseString(s""" akka.remote.netty.tcp.hostname = "$localIP" """)
.withFallback(ConfigFactory.parseString(s""" akka.remote.netty.tcp.port = 0 """))
.withFallback(ConfigFactory.load(param.configName))
.resolve()
implicit val system = ActorSystem("systemName", systemConfigs)
// config中:akka.remote.netty.tcp.port = 0
// system运行时真正的external port是什么?
当我们将akka.remote.netty.tcp.port设置为0时,akka system在启动时会随机的选择一个可用端口,那么怎么来知道这个端口号呢?
要获取akka system运行时真正的port(或者称之为external port),需要用到remote information:
class AddressExtension(system: ExtendedActorSystem) extends Extension {
// The address of the akka system (contains remote information)
val address = system.provider.getDefaultAddress
}
object AddressExtension extends ExtensionKey[AddressExtension]
def addressOf(system: ActorSystem): Address = AddressExtension(system).address
ActorSelection
参考 When Should I Use Actor Selection?
我们在本地启动一个master actor,它的名字为master
,端口为3000
,system名为CrossFilterSystem
。那么,我在同一个Akka System中的另一个actor内,可以用如下的代码找到该master actor:
private def lookupMaster(address: Address): Unit = {
// import scala.concurrent.ExecutionContext.Implicits.global
implicit val timeout = Timeout(10 seconds)
val f: Future[ActorRef] = context.system.actorSelection(address.toString).resolveOne()
val master: ActorRef = Await.result(f, timeout.duration)
logger.info("找到了Master: " + master.path.toString)
}
运行输出为:
找到了Master: akka.tcp://CrossFilterSystem@127.0.0.1:3000/
可见,通过地址akka.tcp://CrossFilterSystem@127.0.0.1:3000/
,可以找到master actor。
但是这个master actor的name为master
,并且它应该在/user
这个guardian actor下面(/user
is the guardian actor for all user-created top-level actors; actors created using ActorSystem.actorOf
are found below this one.)。
所以,这个master actor的地址能不能用akka.tcp://CrossFilterSystem@127.0.0.1:3000/user/master
来表达呢?我们来试一下。
将以下代码
val f: Future[ActorRef] = context.system.actorSelection(address.toString).resolveOne()
改为
val f: Future[ActorRef] = context.system.actorSelection(RootActorPath(address)/"user"/"master").resolveOne()
运行后输出为:
找到了Master: akka.tcp://CrossFilterSystem@127.0.0.1:3000/user/master
所以,这两个地址应该是等价的,毕竟一个actor必须有自己的独一无二的port。