我希望这个程序中的线程能够锁定步骤。但是,发送方在等待接收方赶上之前发送~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();
}
答案 0 :(得分:2)
此处系统中还有其他缓冲区。设置高水印只影响其中一个。
http://www.aosabook.org/en/zeromq.html#fig.zeromq.arch
调用send只是推送到管道而不是等待它通过线路。关联的I / O线程从管道读取消息并将其读取到网络上。因为你在发送小消息这么紧的循环中,看来你在发送第一条消息之前填满了管道。