A.说明
我使用的是ZeroMQ监视器,我发现它在逻辑断开时工作,但当网络断开时不工作(拔掉我的电缆)。
例如:
显示器是这样设计的吗?
如果是,除了心跳之外,是否有任何解决方案来检测网络故障(电缆断开事件)?
如果不是,如何使用ZeroMQ的原始监视机制来解决这个问题?setTCPKeepAlive()
接口有用吗?
B.系统环境
我的情况如下。
客户端
OS: Android,运行在pad上,IDE: Android 2.3,lib:jeromq-0.4.3
// Java Code
String monitorAddr = "inproc://client.req";
ZContext ctx = new ZContext();
ZMQ.Socket clientSocket = ctx.createSocket(ZMQ.REQ);
clientSocket.monitor(monitorAddr,ZMQ.EVENT_ALL);
// Then start a montitor thread which is implemented by my own.
服务器
操作系统: Windows 7( 64位),运行在我的笔记本电脑上,IDE: VS2013,lib: Clrzmq4
// C# Code
const string MonitorEndpoint = "inproc://server.rep";
var ctx = new ZContext();
var serverSocket = new ZSocket(ctx,ZSocketType.REP);
ZError error;
// Create serverSocket pair socket
if (!serverSocket.Monitor(MonitorEndpoint, ZMonitorEvents.AllEvents, out error))
{
if (error == ZError.ETERM)
return ; // Interrupted
throw new ZException(error);
}
// Create a monitor
ZMonitor _monitor = ZMonitor.Create(ctx, MonitorEndpoint);
_monitor.AllEvents += _monitor_AllEvents;
_monitor.Start();
发布于 2017-11-14 07:59:00
在ZeroMQ中没有内置的心跳。我知道几年前在ZMQ社区中有一些关于这个主题的讨论,而且这种讨论可能还在继续。
将自己的心跳消息结合到应用程序对ZeroMQ的使用中是相对简单的,特别是当您使用类似Google缓冲区的东西来编码不同的消息类型时,心跳只是另一条消息。
在应用程序中执行心跳(而不是依赖某种内置的机制)最终是更灵活的;您可以选择心跳速率,如果心跳失败,您可以选择做什么,您可以决定心跳是重要的还是不重要的,等等。
考虑发布/子模式中的心跳;对于ZMQ作者来说,要代表您决定连接/断开/连接中断事件对您来说是有点困难的。如果他们确实构建了一种机制,但应用程序开发人员并不想要它,那么这就浪费了带宽。
对于ZMQ作者来说,将这种应用程序架构问题留给应用程序作者(就是您!)要容易得多!去处理。
通过您的具体示例,拔出的网络电缆看起来(就任何软件所能确定的范围而言)就好像没有流量;它与应用程序没有发送任何内容相同。如果应用程序没有发送任何内容,ZMQ不会发送任何内容。
如果您查看套接字监视器可以报告的事件,它们都是通过网络连接流的结果,或者是应用程序对套接字所做的事情。
https://stackoverflow.com/questions/47278561
复制相似问题