在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()
!
我在这里想念什么?
答案 0 :(得分:2)
.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 );