0

我收到以下错误

线程“主”org.zeromq.ZMQException 中的异常:Errno 48:org.zeromq.ZMQ$Socket.mayRaise(ZMQ.java:3533) 的地址已在 org.zeromq.ZMQ$Socket.bind(ZMQ.java :2987) 在 com.zmq.pub_sub.Publisher.main(Publisher.java:16)

这是我的发布者类:

public class Publisher {
    public static void main(String[] args) throws Exception
    {
        //  Prepare our context and Publisher
        try (ZContext context = new ZContext()) {
            ZMQ.Socket publisher = context.createSocket(SocketType.PUB);
            publisher.bind("tcp://140.93.0.95:5678");
            int id = 1;
            String msg = "";

            while (true){
            Thread.sleep(1000);
            msg = "topic1- msg"+id ;
            publisher.send(msg);
            id++;
            }
        }
    }
}

PS:我想在两台远程机器之间使用 ZMQ

4

1 回答 1

1

出于这个目的,让我首先将您的注意力引向这个概念:
- ZeroMQ Hierarchy in less than 5 seconds
as have been done in answer to your previous ZeroMQ-related question

如果您尝试将本地资源管理器(正确,Context()-instance ).bind()放到非本地资源上(如果tcp://140.93.0.95:5678-target不是任何 localhost 接口),则结果必须无法正常工作没有这样Context()的东西可以获取非本地(外部、远程 O/S 拥有和管理的)资源并使用它。海盗过去常常执行如此疯狂的策略来攫取外国拥有的资源(船、黄金,你说的都是),但这种做法绝对不被认为是公平的,也不礼貌的,越不合法。

如果您尝试相同的方法,而.bind()方法中的目标 IP 地址本地的,那么您的代码可以公平地要求使用本地资源(本地主机的接口之一,为其配备tpc://协议数据泵),但是您的代码遇到了与资源处理相关的另一种问题。在这里,O/S 似乎拒绝了这种公平的请求,因为请求的时间错误,因为 O/S 没有考虑请求的目标是“免费使用”的,很可能是由于冲突使用(如果某些其他应用程序已成功获得对该资源的使用但尚未将其释放回 O/S)或由于对该资源的事后锁定使用,这可能发生在以前的 ZeroMQ 应用程序运行没有优雅地.close()-ed 和.term()-ed 任何Context()-instances,由于其错误的资源处理/释放策略,它们仍可能使该资源(死)锁定。

这是一个很长的故事,但它经常被摆在桌面上,如果让未处理的异常让崩溃的实例仍然“持有” ip-address(es) 在使用中并且无法帮助自己,因为已经崩溃的应用程序代码不能和不会让他们释放他们.bind()获得的地址。无限(直到重新启动)半(死)锁案例很少会遇到,如果没有在防崩溃代码设计中给予应有的注意,并且锁定的资源是对此类设计师罪过的最温和的“惩罚”。

于 2019-07-30T08:00:25.953 回答