Java jzmq似乎忽略了XREP上的HWM

Java jzmq似乎忽略了XREP上的HWM,java,zeromq,jzmq,Java,Zeromq,Jzmq,我希望这个程序中的线程在锁步中工作。然而,发送方在等待接收方赶上之前发送了约60000条消息。我对HWM有什么误解 如果我没有启动接收方线程,那么发送方在尝试发送第二条消息时会阻塞 public static void main(String[] args) throws Exception { new Thread() { @Override public void run() { ZMQ.Context context = ZM

我希望这个程序中的线程在锁步中工作。然而,发送方在等待接收方赶上之前发送了约60000条消息。我对HWM有什么误解

如果我没有启动接收方线程,那么发送方在尝试发送第二条消息时会阻塞

public static void main(String[] args) throws Exception {
    new Thread() {
        @Override
        public void run() {
            ZMQ.Context context = ZMQ.context(1);
            ZMQ.Socket socket = context.socket(ZMQ.XREP);
            socket.setHWM(1);
            socket.bind("tcp://127.0.0.1:8080");
            while (true) {
                try {
                    socket.recv(0);
                    byte[] msg = socket.recv(0);
                    System.out.println("Received: " + new String(msg, "UTF-8"));
                    Thread.sleep(1000);
                } catch (Exception ex) {
                    Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }.start();

    new Thread() {
        @Override
        public void run() {
            ZMQ.Context context = ZMQ.context(1);
            ZMQ.Socket socket = context.socket(ZMQ.XREQ);
            socket.setHWM(1);
            socket.connect("tcp://127.0.0.1:8080");
            Integer i = 1;
            while (true) {
                System.out.println("Sending: " + i);
                socket.send(i.toString().getBytes(), 0);
                i++;
            }
        }
    }.start();
}

乍一看,我的想法和你一样,对你的行为感到惊讶。但是我做了一些研究,我想我找到了答案

系统中还有其他缓冲区在起作用。设置高水位线仅影响其中一个

调用send只需将其推送到管道中,而不用等待它通过线路。关联的I/O线程将消息从管道读取到网络上。因为您在发送小消息时处于一个如此紧密的循环中,所以在发送第一条消息之前,您似乎正在填充管道