在ZeroMQ中设置超时的困境

时间:2017-09-21 02:21:37

标签: java zeromq

我目前使用ZeroMQ和Java绑定。我的程序处于PUB/SUB模式。 设置超时似乎是合理的,而客户端无法从PUB方收到消息。

但对于没有固定频率发送邮件的发布服务器,很难确定合理的超时。

另一方面,如果没有设置超时,那么程序可能会停留在功能:

recv()

永远甚至发布服务器已经死了。

如果有解决此问题的良好解决方案?

2 个答案:

答案 0 :(得分:1)

您可以使用Pollers:

poller = zmq.Poller()
poller.register(client_receiver, zmq.POLLIN);

进一步阅读: http://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/multisocket/zmqpoller.html

希望它有所帮助。

答案 1 :(得分:1)

是的,有一个很好的解决方案或两个:

一个主要的最佳解决方案是使用 Poller 实例,.poll()方法告诉您的代码,再次借助明确可配置的{{1}在[ms]中,是否有任何传入消息要么尝试非阻塞aTimeOut方法,要么甚至不尝试这样做,一旦有任何此类消息的NACK从调用{{{ 1}}方法(详情请查看API)。

另一种方法是使用非阻塞模式调用.recv()方法。这里,API +包装器/绑定,指定它如何处理状态,其中没有这样的消息在本地准备好获得.poll() - ed,因此可以依赖于公共语言的可用语法 - 脚手架 - 如{{ 1}}或.recv( aSockINST, ZMQ_DONTWAIT ).recv() - 处理{ try: except: finally: }调用中的任一返回状态。类似的规则适用于(几乎)阻塞调用,有一些中等小{ try: catch: }超时。