Система нескольких акка в одном ПК

Как мы можем запустить несколько узлов 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,

Другие вопросы по тегам