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