我没有看到我的ZeroMQ PUSH / PULL套接字对表现为文档(here和here):
当ZMQ_PUSH套接字由于已达到所有下游节点的高水位标记而进入静音状态,或者根本没有下游节点时,套接字上的任何zmq_send(3)操作都将阻塞,直到静音状态结束或至少一个下游节点可用于发送;消息不会被丢弃。
下面的Java示例显示了我希望第二次调用send
来阻止的情况,因为我已将发送HWM设置为1,我已经发送了一条消息而没有消息已经在PULL插座上收到了。我所看到的是发送完成,返回true(表示the send was successful)。
这个想法是对流过这个PUSH / PULL对的数据施加背压。推送端的发送调用应该阻塞线程,如果它超过了PULL端。 有人可以建议我如何实现这一目标吗?
我从主分支的HEAD构建了jzmq,并且正在运行从Mac上的brew安装的zmq版本3.2.4(我看到与zmq版本4.0.5_2相同的行为也安装了brew,其中jzmq是从相同的来源)。
import org.zeromq.ZMQ;
public class Main {
public static void main(String[] args) {
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket pullSocket = context.socket(ZMQ.PULL);
pullSocket.setRcvHWM(1);
pullSocket.bind("tcp://*:9944");
ZMQ.Socket pushSocket = context.socket(ZMQ.PUSH);
pushSocket.setSndHWM(1);
pushSocket.connect("tcp://localhost:9944");
boolean pushResult = pushSocket.send("a");
// Expecting this call to block, but it delivers the message:
pushResult = pushSocket.send("b");
String message = new String(pullSocket.recv());
message = new String(pullSocket.recv());
// This third call does block, since only two message were pushed:
message = new String(pullSocket.recv());
}
}