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

时间:2014-11-18 08:07:04

标签: java zeromq

在ZMQ zguide中,他们advice在任务结束时始终清理。 关于最佳实践,我有点困惑。

首先

  • ...即使你关闭所有套接字,zmq_ctx_destroy()默认会等待
  • ...最后,破坏上下文
  • ...这将导致任何阻塞接收或轮询或发送附加线程以返回错误。抓住该错误,然后设置逗留,并关闭该线程中的套接字,

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

Q2:所以我需要破坏上下文吗?

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

问题3:我该如何终止我的ZMQ资源?

修改 如果我查看jeromq代码 - 我在 ZContext.destroy 里面看到了 <{1}}(每个套接字)

destroySocket

然后它甚至会调用s.setLinger( linger ); s.close(); sockets.remove( s ); sockets.clear();

问题4:这还够吗?

1 个答案:

答案 0 :(得分:0)

A1:是的,但是......

A2:是的,但是......

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

A4:参考。 A3

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

首先,人们应该意识到,ZeroMQ有一套内部架构原则,任何人都不应该明知或不小心违反。

也就是说,人们也可以意识到,不同的语言绑定(它不是ZeroMQ,而是与内部体系结构规则外部关联的其他一些代码包装器)可能在编排gracefull终止时遇到问题(并且一些包装器隐藏了这个在引擎盖下,以便用户不知道那里会发生什么。)

无尽的挂起.bind() - s到localhost端口和陷入死锁的线程只是一些可能因资源释放不足而面临的麻烦。终止练习。

什么是ZeroMQ经验法则?

  1. 在所有ZMQ套接字实例上强制执行非阻止 .close()
  2. 最后强制执行.term() ZMQ上下文实例
  3. 广告1)非阻止表示一个必须采取适当的谨慎 .setsockopt()参数,类似于ZMQ_LINGER,以避免死亡-lock(s)让ZMQ-socket原型在预期中无休止地等待,相反的对手可能仍然有一些消息要接收,所以在这一步要小心和有条理。在调用.close()之前设置所有安全退出参数。否则你失去了控制进入阻止模式。