使用.poll()& ZeroMQ中的.recv()方法?

时间:2017-10-02 07:41:41

标签: java zeromq

在ZeroMQ PUB/SUB模式教程中,有一个 .poll() 方法:

ZMQ.Poller items = new ZMQ.Poller (1);
while (!Thread.currentThread ().isInterrupted ()) {
        byte[] message;
        items.poll();

        if (items.pollin(0)) {
            message = subscriber.recv(0);
            System.out.println("received message:" + message);
        }
 }

此方法可让您检查连接的状态。但似乎.poll()方法是“另一个”.recv()没有超时!?

在收到数据之前,他们都会坚持线程/程序。

使用.poll()只是让程序停留在.poll()而不是.recv()

我在这里想念什么?

2 个答案:

答案 0 :(得分:2)

ZeroMQ在这里引入了两种截然不同的机制:

.recv() 方法:

.recv( <aSocketAccessPointINSTANCE>, <ZMQ_DONTWAIT_FLAG> ) 是一种方法,可能,但无需阻止尝试接收{{1} - 将信息传递给善良用户,以便进一步处理。

当语法强制执行时,编码器必须指定,ZeroMQ可伸缩形式通信原型的接入点应该尝试选择下一个FIFO消息或多部分消息的一部分。

ZeroMQ确保消息的原子传递:对等体应接收消息的所有消息部分或根本不接收消息。除可用内存外,消息部分的总数不受限制。

处理多部分邮件的应用程序必须在调用{{1}后使用并进一步调查 aSocketAccessPoint 选项中的 ZMQ_RCVMORE 确定是否还有其他部分要接收。

zmq_getsockopt(3) 方法不同(虽然它可能会“快捷”某些逻辑):

在可以使用zmq_recvmsg()方法之前,首先要设置.poll()实例行为的详细信息。

ZeroMQ提供了一种机制,用于在一组接入点上复用更多和更多的输入/输出事件(包含ZeroMQ智能套接字和(在最近的API版本中)标准的普通O / S套接字。机制镜像标准套接字'.poll()系统调用。

.Poller()实例可以指示poll()一个或多个“本地”接入点询问他们的内部状态,并且可以接收 {0一个|更多} -answers,取决于呼叫设置,查询资源的实际状态以及是否超时,在任何指定的事件到达所列接入点的“本地”端之前。

ZeroMQ原始API为此定义:

Poller()

而相应的语言绑定可能会将此API重新包装到某种更高级别的辅助方法中(并不是手动声明一旦调整大小,会尝试传递.poll()的{​​{1}}个记录数int zmq_poll ( zmq_pollitem_t *items, int nitems, long timeout ); 在调用低级API之前,MUX-events对象在运行时是已知的 - 因此请重新检查ZeroMQ绑定文档以获取暴露给用户代码的确切语法。

如O / P中所述,如果nitems被调用的值为*items.poll()中只有一个接入点,timeout == -1应该无限期地阻止,直到在*items的指定.poll()集合上发生请求的事件,所以在这里,阻止用户代码有效地反映了zmq_pollitem_t在那个地方所做的事情。然而,各自的机制是不同的。

答案 1 :(得分:1)

recv()等待来自1个ZeroMQ套接字的消息,而poll()则允许您等待来自许多ZeroMQ套接字的消息。

Poller还可让您在等待消息时轻松指定超时。

注意,您的代码似乎错过了所需的通话 items.register( subscriber, ZMQ.Poller.POLLIN );