我正在创建一个接收大量HTTP请求的小实用程序。它写在java
中,并使用embedded-jetty
通过https
处理请求。
我有一个负载测试工具,但是当它运行一段时间后它开始抛出异常:
java.net.BindException: Address already in use: connect
(请注意,这是在发件人方面,而不是在我的项目中)
据我所知,这意味着当另一个connect
被调用时,系统中找不到更多的免费套接字。吞吐量大约为每秒1000
个请求,并且在20000
到50000
个请求之后的某个位置开始显示失败。
然而,当我使用相同的负载测试工具与另一个程序(一种简单的使用者,由scala
使用netty
由某个同事编写)时,它只接收所有请求并返回空{{1响应) - 套接字没有问题(虽然典型速度慢ok
倍)。
我想知道是否可以通过告诉Jetty以某种方式在响应发送后立即关闭连接来解决这个问题。无论如何,每个新请求都是通过新连接发送的。我尝试使用Connector#setIdleTimeout - 默认情况下似乎是30000,但没有成功。
我该怎么做才能解决这个问题 - 或者至少要更深入地研究这个问题以找到原因(如果我的建议有误)?
UPD 感谢您的建议,我想我不允许发布消息来源,但我知道我应该研究客户端的代码(这会让我忙一段时间因为它是用scala写的。)
答案 0 :(得分:0)
我发现客户端确实存在问题 - 它会在标头中发送带Connection: Keep-Alive
的请求,但会为每个请求创建新的HttpURLConnection
并在其后调用disconnect()
方法。
要在服务器端解决这个问题,在响应头中发送Connection: close
就足够了,因为我没有允许更改测试实用程序。