Akka Remote:获取自动生成的端口

时间:2016-03-31 12:18:05

标签: akka akka-remote-actor

我有一个Java客户端,它获取一个自动生成的端口。启动actor系统后,我想访问端口。

Config clientConfig = ConfigFactory.parseString("akka.remote.netty.tcp.port = 0")
        .withFallback(ConfigFactory.parseString("akka.remote.netty.tcp.hostname = " + serverHostName))
        .withFallback(ConfigFactory.load("common"));

actorSystem = ActorSystem.create("clientActorSystem", clientConfig);

// how to access the generated port here..!?

由于ActorSystem.create(...)之后的日志输出是这样的,因此必须已设置端口:

[INFO] [03/31/2016 14:11:32.042] [main] [akka.remote.Remoting] Starting remoting
[INFO] [03/31/2016 14:11:32.233] [main] [akka.remote.Remoting] Remoting started; listening on addresses :[akka.tcp://actorSystem@localhost:58735]
[INFO] [03/31/2016 14:11:32.234] [main] [akka.remote.Remoting] Remoting now listens on addresses: [akka.tcp://actorSystem@localhost:58735]

如果我试图通过actorSystem.settings().config().getValue("akka.remote.netty.tcp.port")的配置来获取它,我仍然按照之前的定义得到0。

有谁知道如何访问此端口(示例中为58735)?

2 个答案:

答案 0 :(得分:1)

使用scala,您可以获得当前正在运行Actor系统的端口选项:

val port = system.provider.getDefaultAddress.port

希望您能够在Java中获得相同的代码。

答案 1 :(得分:0)

接受的答案可能适用于旧版本的Akka,但截至目前(版本2.5.x),您将得到类似的内容:

  

错误:(22,18)特征ActorRefFactory中的方法提供程序无法在akka.actor.ActorSystem中访问

解决方案是使用akka extensions。以下是我如何使用它:

实施例。阶

package example

import akka.actor._

class AddressExtension(system: ExtendedActorSystem) extends Extension {
  val address: Address = system.provider.getDefaultAddress
}

object AddressExtension extends ExtensionId[AddressExtension] {
  def createExtension(system: ExtendedActorSystem): AddressExtension = new AddressExtension(system)

  def hostOf(system: ActorSystem): String = AddressExtension(system).address.host.getOrElse("")
  def portOf(system: ActorSystem): Int    = AddressExtension(system).address.port.getOrElse(0)
}

object Main extends App {
  val system = ActorSystem("Main")
  println(AddressExtension.portOf(system))
}