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/ Оттогава го премахнахме, защото намерихме по-добро решение вътрешно, но изглежда правилното нещо за вас и AFAICT не трябва да блокира. - person Roland Kuhn; 02.05.2012
comment
Брилянтно решение! Не се сетих... внедрих нещо подобно и изглежда работи! Останах с впечатлението, че socket.close() блокира, но... - person user510159; 02.05.2012