使用高水位标记在zmq push上发送不阻塞

时间:2015-04-08 21:13:53

标签: zeromq

我没有看到我的ZeroMQ PUSH / PULL套接字对表现为文档(herehere):

  

当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());

    }
}

0 个答案:

没有答案