java.nio.channels.ClosedChannelException: null at io.netty.handler.ssl.SslHandle...
错误信息
2026-04-07 16:01:15 [reactor-http-nio-6] WARN r.n.http.client.HttpClientConnect - [5beaaba4, L:/198.18.0.1:37258 ! R:www.dmxapi.com/198.18.0.144:443] The connection observed an error
java.nio.channels.ClosedChannelException: null
at io.netty.handler.ssl.SslHandler.channelInactive(SslHandler.java:1173)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:303)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1352)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:301)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281)
at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:850)
at io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:811)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:166)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:566)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1447)
Suppressed: io.netty.handler.ssl.StacklessSSLHandshakeException: Connection closed while SSL/TLS handshake was in progress
at io.netty.handler.ssl.SslHandler.channelInactive(Unknown Source)
AI 解决方案
报错分析报告
1.错误翻译
原文:java.nio.channels.ClosedChannelException: null
译文:java.nio.channels.ClosedChannelException:空(连接已关闭)
2. 原因分析
SslHandler.channelInactive()方法(堆栈第1行),触发于连接关闭时的通道 inactive 事件。3.解决方案
// 修复示例:使用Reactor Netty HttpClient添加重试+超时配置
import reactor.netty.http.client.HttpClient;
import io.netty.handler.timeout.ReadTimeoutHandler;
import java.util.concurrent.TimeUnit;
public class FixedHttpClient {
public static void main(String[] args) {
HttpClient.create()
.secure(spec -> spec.sslContext()) // 保持原SSL配置
.responseTimeout(Duration.ofSeconds(10)) // 总响应超时
.doOnConnected(conn ->
conn.addHandlerLast(new ReadTimeoutHandler(5, TimeUnit.SECONDS)) // 读超时
.addHandlerLast(new WriteTimeoutHandler(5, TimeUnit.SECONDS)) // 写超时
)
.observe((connection, state) -> {
if (state == HttpClient.State.DISCONNECTED) {
// 连接断开时清理资源
connection.dispose();
}
})
.get()
.uri("https://www.dmxapi.com/api/endpoint")
.responseSingle((res, body) -> { /* 处理响应 */ });
}
}
4. 预防措施
IdleStateHandler监控连接空闲状态,主动关闭无效连接(Netty示例:pipeline.addLast(new IdleStateHandler(0, 0, 30, TimeUnit.SECONDS)))。 ---
分析完成,如需进一步调试请提供完整调用上下文。