agentscope-ai/agentscope-java
View on GitHub[Bug]:SSE流式请求首次/闲置后超时 + HttpTransportException#getStatusCode() NPE 异常
Open
#1302 opened on Apr 26, 2026
bughelp wanted
Description
问题描述
项目使用 io.agentscope.core 调用大模型流式(SSE/NDJSON)接口时,出现偶现必现规律异常:
- 首次建立连接 → 必现超时 + NPE
- 第二次及后续请求 → 完全正常,无任何异常
- 闲置一段时间(几分钟) → 再次复现首次超时+NPE
- Postman 直接调用相同接口 → 永不超时,无任何问题
异常堆栈(核心)
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "io.agentscope.core.model.transport.HttpTransportException.getStatusCode()" is null
at io.agentscope.core.model.OpenAIClient.lambda$stream$2(OpenAIClient.java:443)
Suppressed: io.agentscope.core.model.transport.HttpTransportException: SSE/NDJSON stream failed: Operation timed out
Caused by: java.io.IOException: Operation timed out
根因定位(已排查仓库代码)
1. NPE 空指针直接原因
OpenAIClient.java 第443行:
未对 HttpTransportException.getStatusCode() 做判空处理,直接调用 .intValue()。
网络超时/连接失败场景下 statusCode = null,触发 NPE。
2. 超时根本原因(首次/闲置后才出现)
JdkHttpTransport.java 中使用 HttpClient.newBuilder().timeout(...) 设置了全局总超时:
- 首次请求 = 冷连接(TCP+TLS握手)→ 耗时高于热连接 → 触发超时
- 后续请求 = 热连接(复用连接)→ 不触发超时
- 闲置后连接被回收 → 重新走冷连接 → 再次超时
- Postman 无全局超时配置 → 不会触发
3. 异常类设计问题
HttpTransportException 存在两个构造器:
- 网络异常(超时/IO)→
statusCode = null - HTTP状态码异常 → 赋值
statusCode调用方未做判空,直接导致 NPE。
必改代码位置
-
修复 NPE 文件路径:
io/agentscope/core/model/OpenAIClient.java报错行:第443行 修改:getStatusCode()增加判空,默认返回 504 -
修复超时 文件路径:
io/agentscope/core/model/transport/JdkHttpTransport.java修改:删除.timeout(Duration.ofSeconds(xx))全局超时配置 说明:SSE/流式请求严禁设置全局总超时
复现条件
- 调用流式(SSE/NDJSON)接口
- 应用启动后第一次请求 / 闲置一段时间后第一次请求
- 使用 JDK HttpClient 作为底层传输客户端
预期行为
- 首次请求/闲置后请求不超时
- 网络异常场景不抛出 NPE
- 流式请求与 Postman 行为保持一致
环境信息
- JDK 版本:11+
- 框架:Spring Boot
- 客户端:
io.agentscope.core - 请求类型:SSE / NDJSON 流式响应