我一直在捕捉到属于亚种的SocketExceptions,例如破管或连接重置。问题是一旦他们被抓住,滑溜的混蛋应该怎么做。什么是一些常见的SocketExceptions以及导致它们的原因?
哪些人可能会愉快地忽略,哪些需要进一步关注?我正在查找不同的SocketExceptions及其原因的列表。
我一直在捕捉到属于亚种的SocketExceptions,例如破管或连接重置。问题是一旦他们被抓住,滑溜的混蛋应该怎么做。什么是一些常见的SocketExceptions以及导致它们的原因?
哪些人可能会愉快地忽略,哪些需要进一步关注?我正在查找不同的SocketExceptions及其原因的列表。
在Java Web开发方面,一个破碎管或连接重置基本上意味着对方已经关闭了连接。在请求仍在运行时,客户端按下Esc可能会导致这种情况,但请求仍在运行,或者在请求仍在运行时通过链接/书签/地址栏导航。您经常在长时间运行的请求中看到此特定错误,例如大文件下载和不必要的大/慢业务任务(这对于不耐烦的用户不好,大约3秒真是最大)。在极少数情况下,它也可能由硬件/网络问题引起,如服务器或客户端的网络中断。
当响应的输出流上的flush()
或close()
被调用时,可以抛出此异常。你作为服务器端无法对付它。由于HTTP中的安全限制,您无法(重新)连接客户端,因此无法从中恢复。在大多数情况下,你也不应该尝试,因为这往往是客户自己的决定。只需忽略它或将其记录为纯粹的统计数据。
其他原因之一通常是操作系统上的TCP/IP堆栈设置。还没有在Linux上尝试过它,但我曾经工作过的一个平台是Sun的Solaris 9/10操作系统。基本思想是Solaris具有可调谐的TCP/IP堆栈,您可以在运行Web应用程序时对其进行调整。
所以有两个参数,你应该知道
所有上述参数的影响有多大负荷可制取(从TCP/IP的角度),并在另一面影响某些类型的发生SocketExceptions - 例如BalusC指出的那些。
这显然是相当复杂的,但我试图做的一点是,您经常托管您的应用程序的操作系统,为您提供缓解策略。