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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:33:26