如何修复java.net.SocketException:坏了管道?

2022-08-31 06:40:30

我正在使用apache commons http客户端调用url,使用post方法发布参数,它很少抛出以下错误。

java.net.SocketException: Broken pipe
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
        at java.io.FilterOutputStream.write(FilterOutputStream.java:80)
        at org.apache.commons.httpclient.methods.ByteArrayRequestEntity.writeRequest(ByteArrayRequestEntity.java:90)
        at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)
        at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
        at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)

有人可以建议导致此异常的原因以及如何调试它吗?


答案 1

这是由以下原因引起的:

  • 最常见的是,当另一端已经关闭连接时写入连接;
  • 通常情况下,对等方关闭连接而不读取其末端已挂起的所有数据。

因此,在这两种情况下,您的应用程序协议定义或实现都不正确。

还有第三个原因,我不会在这里记录,但涉及对等方采取故意行动来重置而不是正确关闭连接。


答案 2

在我们的例子中,我们在应用服务器上执行负载测试时遇到了这种情况。事实证明,我们需要向JVM添加额外的内存,因为它已经用完了。这解决了问题。

尝试增加可用于 JVM 的内存,并在收到这些错误时监视内存使用情况。