Quarkus REST Reactive端点读取超时问题及疑问
Quarkus REST端点读取超时与异常信息问题
问题背景
我们有一个基于Quarkus框架的应用,对外暴露REST端点。该端点每5分钟接收一次约1MB大小的JSON payload,偶尔会出现读取超时报错,客户端重试后即可正常运行。
报错栈信息
javax.ws.rs.WebApplicationException: HTTP 400 Bad Request at io.quarkus.resteasy.reactive.jackson.runtime.serialisers.ServerJacksonMessageBodyReader.readFrom(ServerJacksonMessageBodyReader.java:60) ... Caused by: [CIRCULAR REFERENCE: java.io.IOException: Read timed out]
日志显示错误源自VertxInputStream.java的第239行。起初怀疑是客户端在服务器处理前关闭连接,但用curl模拟该场景时,报错信息与上述不同,无法复现。客户端主动关闭连接时的报错为:
Caused by: [CIRCULAR REFERENCE: java.io.IOException: io.vertx.core.http.HttpClosedException: Connection was closed]
问题与解答
1. 导致读取超时问题的原因是什么?
从你提供的代码片段可以明确原因:VertxInputStream的超时时间被硬编码为10000毫秒(即10秒)。当客户端发送1MB的JSON payload时,如果遇到网络波动、客户端发送速率较慢,或者服务器侧IO处理出现短暂阻塞,导致读取整个payload的时间超过10秒,就会触发这个读取超时异常。
相关代码片段:
public InputStream createInputStream() { if (context.getBody() != null) { byte[] data = new byte[context.getBody().length()]; context.getBody().getBytes(data); return new ByteArrayInputStream(data); } return new VertxInputStream(context, 10000, this); }
2. 客户端关闭连接时,报错为何显示“CIRCULAR REFERENCE”,该提示存在误导性?
这个提示是Quarkus处理异常链时的格式化副作用。当异常对象内部存在循环引用(比如异常的cause指向自身,或异常链出现闭环),日志框架在序列化异常信息时会标记[CIRCULAR REFERENCE]来避免无限递归输出,但在这个场景下,实际触发的是HttpClosedException,该标记和业务问题无关,确实会对排查造成误导。
内容的提问来源于stack exchange,提问作者Vignesh Sn
相关产品推荐
相关产品推荐

