当保持活动状态时,连接意外关闭

时间:2019-05-10 12:33:13

标签: java apache tomcat keep-alive

经过长时间运行的事务后,我在服务器上的HTTP连接遇到了一些麻烦。下一个请求将导致异常 java.net.SocketException:服务器中的文件意外结束

如果我从客户端关闭Apache HTTP服务器或JVM上的保持活动,效果很好。

设置:

  • Apache HTTP服务器,默认配置(也尝试通过将keepalivetimeout增加到60secs),并通过AJP连接到tomcat。
  • Apache tomcat服务器,默认配置
  • Java服务器应用程序(Spring堆栈)在tomcat内部回答HTTP请求
  • Java客户端(Spring,RestTemplate)->针对此服务器拍摄HTTP调用
  • Java客户端可以在同一服务器上运行(->本地主机为http),也可以在另一台计算机上运行,​​问题仍然相同
  • 服务器上禁用了iptables
  • 仅使用一个客户端进行测试->此时没有其他客户端连接到服务器

会发生什么?

...other stuff...
13:39:32.018 Do Rest call
13:39:32.111 Rest call return headers: Keep-Alive=[timeout=60, max=97], Connection=[Keep-Alive]
13:39:32.609 Do Rest call
13:39:33.849 Rest call return headers: Keep-Alive=[timeout=60, max=96], Connection=[Keep-Alive]
13:39:33.869 Do Rest call
...LONG RUNNING TRANSACTION...
13:40:05.828 Rest call return headers: Keep-Alive=[timeout=60, max=95], Connection=[Keep-Alive]
13:40:05.833 Do Rest call -> _java.net.SocketException: Unexpected end of file from server_; no trace in any log file on the server for this request

我不知道是什么原因导致了连接断开。我无法在任何服务器日志中找到最后一个失败的rest调用。知道是什么还是我可以做些什么来进一步隔离问题?

在这里您可以看到tshark在服务器上记录的事务 Wireshark log

1 个答案:

答案 0 :(得分:-1)

服务器端设置了连接超时,因此我们的保持连接将在分配的时间后超时,从而导致间歇性错误。

去掉keep-alive再试试