在Jboss上运行的Web应用程序中,我们使用TCP Socket连接来实现会话的心跳(rtsp)。直到现在它正在进行客户端套接字绑定: -
Socket client = new Socket(host,port);
PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
out.write(data);
out.flush();
现在我们需要在Load Balancer后面实现热备份/群集。
所以问题是 - 当发生故障转移时,是否可以通过任何方式保持心跳而不必重新连接?
[编辑 - 更多细节]
容器 - Jboss 7.1
RTSP - PayLoad采用RTSP格式。 [data = "GET_PARAMETER " + m.mediaURL + " RTSP/1.0" + "\r\n" + "CSeq: " + seqNumber + "\r\n" + "Session: " + m.sessionId + "\r\n" + "Content-Length: 0\r\nContent-Type: text/parameters\r\n" + "\r\n";
]
答案 0 :(得分:0)
如果您希望透明TCP连接进行故障转移
我不知道支持TCP连接的透明故障转移的Java库。由于TCP是有状态的,这并不容易。
来自Transparent TCP connection failover
的引用本文介绍了一种系统,该系统以对客户端和服务器应用程序透明的方式启用TCP服务器端点的故障转移。故障转移可以在连接的生命周期内的任何时间发生。通过修改服务器的TCP / IP堆栈来实现故障转移。客户端的TCP / IP堆栈,客户端应用程序或服务器应用程序不需要进行任何修改。系统支持服务器的主动或半主动复制
由于RTSP未绑定到TCP,我会考虑使用UDP。
如果心跳不是实际协议的一部分
但还有其他一些可能性
write
方法中进行重新连接。因此,您可能需要在协议中使用某种ping请求,以便能够检查连接。aspectj
将write
包装在现有实现中:因此,您可以添加一个仅检查连接的before块,并在真正进入write
之前重新连接。这可能很复杂,因为涉及java.*
或javax.*
。如果必须快,我会选择UDP。
如果您的听力频率不是那么高,您可以随时打开/关闭TCP连接。
如果你有足够/完全控制系统,但你需要保持“开放”连接的概念,你可以使用选项3来模仿“开放”连接。
如果涉及您无法控制的其他系统,请使用aspectj
。这是一个黑客,因为你不能轻易编织java.*
或javax.*