Scala RemoteActor несколько сетевых интерфейсов

Метод alive(port) в RemoteActor не принимает IP-адрес в качестве параметра.

Он строит внутренне TcpService объект, который получает IP-адрес, вызывая Java InetAddress.getLocalHost().getHostAddress() который возвращает IP первого доступного интерфейса.

Это вызывает проблемы на машинах с несколькими сетевыми интерфейсами, так как это может вернуть неправильный IP-адрес.

Есть ли возможный способ преодолеть эту проблему.

Благодарю.

1 ответ

Решение

Хороший вопрос. Это зависит от того, сколько вы хотите инвестировать в решение. Я могу представить два пути:

1) Первый способ изменить реализацию по умолчанию - написать что-то лучше для себя. Это не так сложно, поскольку весь код для удаленной библиотеки актеров доступен на GitHub.

Моим предложением было бы повторно реализовать части класса TcpSerice, особенно строку 73, примерно так:

private val internalNode = {
    val interfaces = NetworkInterface.getNetworkInterfaces()
    val interface  = ... // find the right interface here
    val addresses  = interface.getInetAddresses()
    val address    = ... // find the right address here
    new Node(address, port)
}

Этот метод также позволяет вам настраивать другие вещи, если вы хотите добавить или изменить что-то еще.

2) Другой (и, возможно, более простой) метод будет состоять в том, чтобы избегать использования реализации по умолчанию все вместе и вместо этого использовать очень популярный actor-framework akka. Akka предоставляет множество дополнительных функций, а также эффективность и надежность. Если вы посмотрите на их GitHub и класс Server, вы увидите, что хост фактически читается из глобальной записи конфигурации "hostname". Подробное руководство по работе с конфигами дано здесь. Вы должны быть в состоянии использовать код, подобный приведенному выше, чтобы найти правильный интерфейс и адрес.

Надеюсь, это поможет!

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