java - jzmq 似乎忽略了 XREP 上的 HWM

标签 java zeromq jzmq

我希望该程序中的线程以锁步方式工作。然而,发送方在等待接收方 catch 之前发送了约 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();
}

最佳答案

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

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

http://www.aosabook.org/en/zeromq.html#fig.zeromq.arch

调用 send 只是将其推送到管道,而不等待它通过网络。关联的 I/O 线程将消息从管道读取到网络上。因为您处于发送小消息的紧密循环中,所以看起来您在发送第一条消息之前就填满了管道。

关于java - jzmq 似乎忽略了 XREP 上的 HWM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14787152/

相关文章:

java - 计算数组内的类(class)

c# - 为什么在使用 java 和 protobuf-net 的 Protocol Buffer 进行序列化时 byte[] 不同?

c++ - ZMQ C++ 从特定工作人员发送和接收

java - jzmq 被弃用了吗?

Java:如何从 maven 故障安全插件访问元文件信息?

java - 尝试覆盖 Java 中 PriorityQueue 的现有比较器

iphone - 为 iPhone 编译 C lib

python - 订阅者可以在 ZeroMQ 中向发布者发送数据吗

java - Storm worker 没有开始

java - 扫描仪无类错误