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