2012-01-20 61 views
1

我有一个Tomcat 7 servlet接受来自远程客户端的连接,并在可能的情况下将这些连接保持打开数小时或数天。所以,我们正在使用NIO连接器。 物理连接上的带宽可能很昂贵,因此流量将保持在绝对最小值,因此我们已经编程了远程客户端以非常不常见的ping测试连接。Tomcat 7 servlet需要强制关闭持久的NIO连接

有时,servlet被告知连接已关闭,但似乎没有告知远程客户端。客户在ping完成之后才会发现,这时他们可以建立新的连接。我们需要缩短客户端未连接的时间长度,而不使用更多的ping。

工作方式之一是关闭Tomcat服务器。客户知道他们立即断开连接。显然,我们不想关闭Tomcat - 我的观点是必须有某种信号通过通常安静的连接。

如何强制Tomcat发送此信号?除非你能告诉我为什么,具体情况,部分是因为我无法相信,主要是因为我不想相信,所以请不要回复我不能相信。这似乎很奇怪 - 就像不能把电话挂在某人身上一样。

替代问题#1 - servlet能否恢复它被告知的连接已关闭?

备选问题#2 - 任何人都可以想到其他任何可能的帮助吗?

回答

0

一对夫妇的想法:

  • 我很惊讶的客户是不知道该连接已断开。你确定某个异常没有被客户端吞噬吗?
  • 通过长达数天的连接,我开始着眼于TCP层上发生了什么。您尚未提及任何诊断或信息...
    • 您是否试图确定是否存在针对这些问题客户端/服务器连接的基础TCP/IP连接?
    • 客户端和服务器之间的网络有多稳定?
    • 他们的潜在行为不良网络设备,如涉及代理或路由器?
  • 我不明白在长寿命连接的上下文中使用NIO连接器的好处。每秒有很多请求?是。但只是为了长期居住的连接?
    • 在过去,我对NIO连接器和servlet协议网关(OpenAMF)产生了一个奇怪的问题,它通过使用默认的HTTP连接器奇迹般地消失了。
    • 测试其他两个连接器(HTTP,本地ARP),对它们进行基准测试。
  • 我还会考虑放弃任何基于TCP的协议(如HTTP),以支持某些基于UDP的方法。这样,你的连接就可以无状态,并且通过定制的有效载荷,数据包非常小。
+0

Stu - 谢谢你的帮助。我很惊讶客户也不知道。看起来Tomcat没有传递servlet知道的信息。我不确定客户端发生了什么。 Tomcat和客户之间有一个信誉良好的手机服务提供商,我无法知道它在做什么。 – DaveWalley

+0

(我再次)如果我知道怎么做,我会在TCP/IP上做更多的诊断 - 网络不是我的强项。我们使用了WireShark,但我并不真正知道我在看什么。我以为我不得不使用NIO进行服务器推送 - 您能否指点我的任何示例代码或教程,以便让我加快速度? – DaveWalley

+0

@Dave:这是全部通过移动网络?我真的会建议一种不同的方法,例如UDP或某种有限持续时间的长轮询。请记住,在一天结束时,Tomcat是一台HTTP服务器。 HTTP是无状态的请求/响应协议。这听起来不像你想要做套件HTTP非常好。 *“适合正确工作的正确工具”。*对于网络诊断工具,首先使用像netstat这样简单的工具。 Wireshare的确是很重要的东西。 –

0

我穿过防火墙回答这个老问题,因为我们已经看到HTTP连接(或任何TCP连接)相同的问题保持打开数十分钟没有交通。如果真的没有防火墙,那么我的答案不适用。

您可以在客户端和服务器上同时使用tcpdump/wireshark和一些耐心来确认此理论。

如果有防火墙,那么您需要确保“ping”数据包比防火墙的空闲TCP连接超时更频繁,以保持连接的活跃。正如我将解释的那样,在增加防火墙时间之前考虑两次,防火墙可能不会达到它。

客户端和服务器之间的防火墙可能正在执行NAT或某些数据包检查。这些功能需要防火墙上的资源,并且防火墙将跟踪的连接数有限制。因此,默认情况下,它会在空闲时间后“静默关闭”这些连接,以节省资源。

我默默地说,因为防火墙aften不会发送任何数据包到任何一方,直到客户端或服务器发送流量。此时防火墙通常会以RST数据包进行响应。我们使用来自客户端和服务器的tcpdump来追踪这一点。它显示防火墙发送这个RST数据包就好像从连接侧发出一样。但另一方面的tcpdump证实这个数据包没有被发送。它必须是防火墙。

增加防火墙上空闲超时的大小可能会导致更多问题,因为防火墙可能无法处理连接数。这可能会导致整个防火墙重置,您可能会看到防火墙中的所有tcp套接字。由于您必须使用TCP,因此请避免需要在防火墙上进行连接跟踪(NAT,记帐,数据包检查)的任何防火墙功能。或者确保你有足够的资源来跟踪所有连接的防火墙。