【问题标题】:Akka ZeroMQ - Any way to get the socket address?Akka ZeroMQ - 有什么方法可以获取套接字地址?
【发布时间】:2012-05-01 17:44:01
【问题描述】:

让我们假设以下代码:

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) 不可能,我如何绑定到任何可用端口?

提前致谢!

比利

【问题讨论】:

    标签: sockets scala port akka zeromq


    【解决方案1】:

    据我所知,ZMQ 无法做到这一点。但是,您可以向参与者询问套接字选项。以下是选项:

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

    您可以自己确定未使用的端口。但是你的用例到底是什么?为什么需要将套接字绑定到随机端口?发布者如何知道他们应该使用哪个端口?

    【讨论】:

    • 感谢您的回答!基本上,我的应用程序会即时创建 1 个或多个 MQ。在运行前不可能确定这个数字,出于安全原因,这些 MQ 必须是不同的(即一个单独的 MQ 不起作用)。我不在乎它们绑定到哪个端口,但我显然需要一种方法来查询它。是的,我自己可以找到一个未使用的端口,但我被告知不应在演员的初始化中使用阻塞代码,而且我不知道没有迭代尝试绑定 ServerSocket 的方法来做到这一点,直到它作品。对此有何建议?
    • 您可以使用此处显示的技术:github.com/akka/akka/commit/… 我们已将其删除,因为我们在内部找到了更好的解决方案,但它似乎对您来说是正确的,并且 AFAICT 它不应该阻止它。跨度>
    • 绝妙的解决方案!我没有想到......我实现了类似的东西,它似乎工作!我的印象是 socket.close() 被阻塞了,虽然......
    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多