You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

排查SocketException: Bad file descriptor异常问题

问题:Spring Boot连接Wiremock报"Bad file descriptor"异常

本地运行Spring Boot Java应用,通过RestTemplate结合Apache HTTP Components连接本地8081端口的Wiremock服务时,抛出java.net.SocketException: Bad file descriptor异常,且Wireshark抓包未发现HTTP请求内容,仅看到TCP连接建立后立即关闭。

堆栈跟踪

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:8081/search": Bad file descriptor; nested exception is java.net.SocketException: Bad file descriptor
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:791) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:738) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:647) ~[spring-web-5.3.31.jar:5.3.31]
    at com.core.Job.execute(IncrementalJob.java:25) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.31.jar:5.3.31]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.3.31.jar:5.3.31]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.31.jar:5.3.31]
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.3.31.jar:5.3.31]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
Caused by: java.net.SocketException: Bad file descriptor
    at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
    at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
    at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:554) ~[na:na]
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:602) ~[na:na]
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na]
    at java.base/java.net.Socket.connect(Socket.java:633) ~[na:na]
    at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75) ~[httpclient-4.5.14.jar:4.5.14]
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) ~[httpclient-4.5.14.jar:4.5.14]
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) ~[httpclient-4.5.14.jar:4.5.14]
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) ~[httpclient-4.5.14.jar:4.5.14]
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) ~[httpclient-4.5.14.jar:4.5.14]
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) ~[httpclient-4.5.14.jar:4.5.14]
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) ~[httpclient-4.5.14.jar:4.5.14]
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[httpclient-4.5.14.jar:4.5.14]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) ~[httpclient-4.5.14.jar:4.5.14]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[httpclient-4.5.14.jar:4.5.14]
    at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:87) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.BufferingClientHttpRequestWrapper.executeInternal(BufferingClientHttpRequestWrapper.java:63) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:109) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:93) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:77) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66) ~[spring-web-5.3.31.jar:5.3.31]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:782) ~[spring-web-5.3.31.jar:5.3.31]
    ... 21 common frames omitted

Wireshark抓包数据

23  2024-02-16 23:13:10.857186  0.003395    127.0.0.1   127.0.0.1   TCP 68  63930 → 8081 [SYN] Seq=0 Win=65535 Len=0 MSS=16344 WS=64 TSval=682307454 TSecr=0 SACK_PERM
24  2024-02-16 23:13:10.857436  0.000250    127.0.0.1   127.0.0.1   TCP 68  8081 → 63930 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=16344 WS=64 TSval=4179054767 TSecr=682307454 SACK_PERM
25  2024-02-16 23:13:10.857467  0.000031    127.0.0.1   127.0.0.1   TCP 56  63930 → 8081 [ACK] Seq=1 Ack=1 Win=408256 Len=0 TSval=682307455 TSecr=4179054767
26  2024-02-16 23:13:10.857488  0.000021    127.0.0.1   127.0.0.1   TCP 56  [TCP Window Update] 8081 → 63930 [ACK] Seq=1 Ack=1 Win=408256 Len=0 TSval=4179054767 TSecr=682307455
27  2024-02-16 23:13:10.857785  0.000297    127.0.0.1   127.0.0.1   TCP 56  63930 → 8081 [FIN, ACK] Seq=1 Ack=1 Win=408256 Len=0 TSval=682307455 TSecr=4179054767
28  2024-02-16 23:13:10.857823  0.000038    127.0.0.1   127.0.0.1   TCP 56  8081 → 63930 [ACK] Seq=1 Ack=2 Win=408256 Len=0 TSval=4179054767 TSecr=682307455
29  2024-02-16 23:13:10.858462  0.000639    127.0.0.1   127.0.0.1   TCP 56  8081 → 63930 [FIN, ACK] Seq=1 Ack=2 Win=408256 Len=0 TSval=4179054769 TSecr=682307455
30  2024-02-16 23:13:10.858508  0.000046    127.0.0.1   127.0.0.1   TCP 56  63930 → 8081 [ACK] Seq=2 Ack=2 Win=408256 Len=0 TSval=682307457 TSecr=4179054769
原因分析与解决方案

从抓包数据看,TCP三次握手完成后,客户端(63930端口)立即发送FIN包关闭连接,说明客户端在尝试发送HTTP请求前就主动终止了连接,结合Bad file descriptor异常,可能的原因及解决方法如下:

  • 连接池复用失效:Apache HTTP Components的PoolingHttpClientConnectionManager可能复用了已被关闭的连接。检查是否存在提前关闭CloseableHttpClient或连接池的代码,确保连接池在应用生命周期内保持有效,不要在每次请求后关闭客户端实例。
  • Socket资源被意外释放:代码中可能存在错误的Socket资源管理,比如在请求发送前,Socket已被其他线程关闭或释放。排查RestTemplate的配置,确保HttpComponentsClientHttpRequestFactory关联的客户端实例未被提前销毁。
  • 异步执行环境的资源冲突:请求在异步线程池中执行(堆栈中可见AsyncExecutionInterceptor),可能存在线程安全问题。检查异步任务的资源共享情况,确保每个异步请求使用独立的客户端实例,或连接池配置为线程安全。
  • JDK或HTTP客户端版本兼容性问题:当前使用的JDK版本与Apache HttpClient 4.5.14可能存在兼容性问题。尝试升级HttpClient到最新稳定版,或检查JDK的网络配置参数(如jdk.net.usePlainSocketImpl)。
  • Wiremock服务异常:虽然抓包显示Wiremock响应了SYN-ACK,但可能服务内部存在初始化问题,导致无法处理请求。重启Wiremock服务,检查Wiremock的日志是否有错误信息,确认服务正常监听8081端口并能处理请求。
  • 防火墙或本地网络拦截:本地防火墙或安全软件可能拦截了HTTP请求内容,仅允许TCP握手。临时关闭本地防火墙或安全软件,重新测试连接是否正常。

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:45:53