Система нескольких акка в одном ПК
Как мы можем запустить несколько узлов akka на одном компьютере? В настоящее время я следую за application.conf
файл. Для каждой системы я добавил разные номера портов, но я не могу запустить более одного экземпляра. Ошибка говорит, Address already in use failed to bind
,
application.conf
файл
remotelookup {
include "common"
akka {
remote.server.port = 2500
cluster.nodename = "n1"
}
}
Обновление: несколько узлов akka, значит, у меня есть разные разные серверные приложения, которые будут связываться с удаленным главным узлом, используя akka.
3 ответа
Проблема была в определении порта. Должно быть как
remotelookup {
include "common"
akka {
remote.netty.port = 2500
cluster.nodename = "n1"
}
}
В противном случае, akka примет порт по умолчанию.
Подход, который мы используем:
Создайте разные настройки в вашем application.conf
для каждой из систем:
systemOne {
akka {
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = ${public-hostname}
port = 2552
}
}
}
}
systemTwo {
akka {
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = ${public-hostname}
port = 2553
}
}
}
}
Application.conf
это файл конфигурации по умолчанию, поэтому в вашем модуле настроек добавьте настройки для вашей системы:
object Configs {
private val root = ConfigFactory.load()
val one = root.getConfig("systemOne")
val two = root.getConfig("systemTwo")
}
и затем создайте системы с этими конфигами:
val one = ActorSystem("SystemName", one)
val two = ActorSystem("AnotherSystemName", two)
Не забывайте, что системные имена должны отличаться
Если вы не хотите жестко закодировать информацию в свой application.conf
, вы можете сделать это:
def remoteConfig(hostname: String, port: Int, commonConfig: Config): Config = {
val configStr = s"""
|akka.remote.netty.hostname = $hostname
|akka.remote.netty.port = $port
""".stripMargin
ConfigFactory.parseString(configStr).withFallback(commonConfig)
}
Тогда используйте это как:
val appConfig = ConfigFactory.load
val sys1 = ActorSystem("sys1", remoteConfig(args(0), args(1).toInt, appConfig))
val sys2 = ActorSystem("sys2", remoteConfig(args(0), args(2).toInt, appConfig))
Если вы используете 0 для порта, Akka назначит случайный порт # этому ActorSystem
,