0

我使用 log4j (2.11) 在多台机器上运行多个进程。我需要整合要在前端显示的日志消息,并希望每个进程使用 ZeroMQ Appender 将日志消息发布到单个连接。然后,我将让一位订阅者接收消息,执行合并,然后显示日志消息。

我有一个与一个发布者合作的玩具应用程序(进程日志记录);但是,当多个进程尝试连接到同一个端点时,我会收到“地址已在使用”错误消息。这(很可能)意味着 log4j ZeroMQ (JeroMQ) appender 正在执行“绑定”,因为只有一个进程可以绑定 zmq 套接字。

是否有让 log4j ZeroMQ Appender 执行“连接”而不是“绑定”的配置选项,或者是否有另一个选项可用于实现相同的目标。

4

1 回答 1

0

“硬件”被拒绝有两个可能的原因.bind()-s

一个已经在你的帖子中了——假设 JeroMQ 服务确实.bind()在你想要的地方严格地尝试.connect()。检查代码库以确认(可能的 fork/mod 以重构的服务方式规避任何此类不适)或拒绝此替代方案,如果代码不是罪魁祸首。

但是让我提一下另一个可能的原因,这在 PoC / 原型设计期间经常出现问题。

早期的模型工具很容易崩溃(是的,有时会安静地崩溃,但有时确实会崩溃的次数或比 PoC 团队愿意忍受的更难)。

如果在此阶段代码库(尚未)设计得很好,以清楚地处理资源管理(正确使用显式aSocket.setsockopt( LINGER, 0 ) (4.x 之前的原生 API 版本中的致命必须) {aSocket|aMessage}.close()Context.term()方法),甚至可以干净退出崩溃后,在某些情况下,您的代码仍然处于活动状态(未拆除)一个或多个实例,这些实例Context()(仍然)阻塞硬件资源,因为它还不允许释放它们。

这有时会导致需要重新启动平台,因为死锁的Context()实例没有其他方法可以“清理”(对于那些没有融合/保护代码以在三合会的最后阶段生存的人try: except: finally:感到羞耻,强制正常终止和干净释放所有分配的资源)。

于 2018-06-29T04:34:03.590 回答