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

Akka Remote: get autogenerated port

我有一个 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)?

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

val port = system.provider.getDefaultAddress.port

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

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

Error:(22, 18) method provider in trait ActorRefFactory cannot be accessed in 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))
}