Akka ZeroMQ — есть ли способ получить адрес сокета?

Предположим, что следующий фрагмент кода:

class MQActor extends Actor {

    // Bind on port 0... Technically this should pick a free port
    val pubSocket = context.system.newSocket(SocketType.Pub, Bind("tcp://127.0.0.1:0"))

    def receive = {
        // ...
    }

}

Мои вопросы:

1) Правильно ли указать порт 0, чтобы запросить сокет на любом доступном порту?

2) Предполагая, что 1) работает, как я могу узнать, к какому порту был привязан сокет?

3) Если 1) не работает и/или 2) невозможно, как привязаться к любому доступному порту?

Заранее спасибо!

Билли


person user510159    schedule 01.05.2012    source источник


Ответы (1)


Насколько я знаю, это невозможно с ZMQ. Однако вы можете запросить у актера параметры сокета. Вот варианты:

https://github.com/akka/akka/blob/master/akka-zeromq/src/main/scala/akka/zeromq/ConcurrentSocketActor.scala#L85

Вы можете самостоятельно определить неиспользуемый порт. Но каков именно ваш вариант использования? Зачем вам нужно привязывать сокет к случайному порту? Как издатели узнают, какой порт им следует использовать?

person drexin    schedule 01.05.2012
comment
Спасибо за Ваш ответ! По сути, мое приложение создавало бы 1 или более MQ на лету. Невозможно определить это число перед выполнением, и по соображениям безопасности эти MQ должны быть разными (т. е. один единственный MQ не работает). Мне все равно, к какому порту они привязаны, но мне, очевидно, нужен способ запросить его. Да, я мог бы сам найти неиспользуемый порт, но мне дали понять, что блокирующий код не должен использоваться при инициализации актора, и я не знаю, как это сделать, не итеративно пытаясь привязать ServerSocket до тех пор, пока он работает. Любое предложение по этому поводу? - person user510159; 02.05.2012
comment
Вы можете использовать метод, показанный здесь: github.com/akka/akka/commit/ С тех пор мы удалили его, потому что мы нашли лучшее внутреннее решение, но оно кажется вам правильным, и НАСТОЯТЕЛЬНО оно не должно блокировать. - person Roland Kuhn; 02.05.2012
comment
Гениальное решение! Я не подумал об этом... Я реализовал что-то подобное, и, кажется, это работает! У меня сложилось впечатление, что socket.close() блокирует, хотя... - person user510159; 02.05.2012