2012-05-01 17 views
0

假設下面的一段代碼: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)是不可能的,如何可以結合到任何可用的端口?

在此先感謝!

比利

回答

0

據我知道這是不可能的ZMQ。但是,您可以向演員詢問套接字選項。下面是選項:

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

你可以自己確定一個未使用的端口。但是,你的用例究竟是什麼?你爲什麼需要將套接字綁定到隨機端口?發佈者如何知道他們應該使用哪個端口?

+0

感謝您的回答! 基本上,我的應用程序將在運行中創建1個或多個MQ。無法在運行時間之前確定此編號,並且出於安全原因,這些MQ必須是不同的(即一個MQ不起作用)。我不在乎他們綁定哪個端口,但我顯然需要一種方法來查詢它。 是的,我能找到一個未使用的端口自己,但我得到了理解,阻斷代碼不應該在一個演員的初始化中使用,我不知道的方式做到這一點無需反覆試圖綁定一個ServerSocket直到它工作。對此有何建議? – user510159

+1

您可以使用此處所示的技術:https://github.com/akka/akka/commit/cb86591656629f1d69d5c2a558eab5420dd49042我們已經因爲刪除它,因爲我們找到了一個更好的解決方案在內部,但它似乎正確的事情找你,AFAICT應該不阻擋。 –

+0

輝煌的解決方案!我沒有想到它......我實現了類似的東西,它似乎工作!我的印象是socket.close()阻塞,但... – user510159

相關問題