繁体   English   中英

ZMQ Java-退出时进行清理的最佳实践

[英]ZMQ Java - Best practice to clean when exiting

他们建议在ZMQ zguide中始终在任务结束时进行清理。 我对最佳做法有些困惑。

第一

  • ...即使关闭所有套接字,默认情况下zmq_ctx_destroy()也会永远等待
  • ...最后,破坏上下文
  • ...这将导致任何阻塞的接收或轮询或发送连接的线程以错误返回。 捕获该错误,然后继续运行并关闭该线程中的套接字,

Q1:那么在销毁上下文之前,我需要关闭所有套接字吗?

Q2:那么我需要销毁上下文吗?

查看context.destroy()我看到它调用linger并在每个套接字上关闭。

Q3:我应该如何终止我的ZMQ资源?

如果我查看jeromq代码,请进行编辑 -我在ZContext.destroy看到对
destroySocket (到每个套接字)

s.setLinger( linger );
s.close();
sockets.remove( s );

然后它甚至调用sockets.clear(); context.term();

Q4:够了吗?

A1:是的,但是...

A2:是的,但是...

A3:遵循ZeroMQ最佳实践,不仅仅依赖于语言绑定

A4:参考号 A3

“最佳实践”的动机是什么?

首先,应该意识到,ZeroMQ具有一组内部架构原则,任何人都不得故意或无意违反。

也就是说,可能还意识到,不同的语言绑定(不是ZeroMQ,而是与内部体系结构规则外部关联的其他一些代码包装器)在编排宽限终止时可能会遇到问题(有些包装器将其隐藏在幕后)因此用户不知道在那里会发生什么)。

无休止地将.bind() s .bind()到localhost端口,而陷入.bind()线程只是资源释放和终止实践不佳可能遇到的一些麻烦。

ZeroMQ的经验法则是什么?

  1. 在所有ZMQ-socket实例上强制执行非阻塞 .close()
  2. 最后执行.term() ZMQ上下文实例

广告1) 非阻塞方式, 必须ZMQ_LINGER那样适当注意 .setsockopt()参数,以避免ZMQ_LINGER ,使ZMQ-socket原型在期望对方无休止地等待中可能仍有一些消息要接收,因此在此步骤上要格外谨慎和有条理。 调用.close() 之前设置所有安全退出参数。 否则,您将失去进入阻止模式的控制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM