@xtccc
2017-01-17T00:31:46.000000Z
字数 2283
阅读 2401
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.globalimplicit 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。
