问题背景
在使用 Spring AI Alibaba 集成 DashScope(通义千问)构建 Agent 时,经常遇到以下问题:
- 简单问题正常回答
- 一旦用户提出较复杂、需要较长回答的问题(如投资组合配置、退休规划、详细分析等),就会出现超时
- 报错核心信息:
SocketTimeoutException: timeout I/O error on POST request for "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation": timeout
- Spring Retry 会尝试重试几次,但最终仍然失败
- 短问题不报错,长回答几乎必现 这个问题在生成内容较长时特别明显,是很多开发者在使用 Spring AI Alibaba 过程中都会踩到的坑。
根本原因
DashScope 生成复杂回答时,服务器响应时间往往需要 60180 秒甚至更长。
而 Spring AI Alibaba 默认的 read timeout(读取超时)通常只有 1030 秒。
客户端等不到完整响应,就主动断开连接,从而抛出 SocketTimeoutException。
这是典型的客户端超时配置过短导致的问题,而不是网络问题或模型本身故障。
曾经尝试过但失败的方案
- 在
DashScopeApi.builder()中寻找restClientBuilder、readTimeout等方法 → 编译报错,方法不存在 - 使用
RestTemplate手动设置超时再传入 → 部分版本不支持restTemplate参数 - 在
application.yml中尝试spring.ai.dashscope.rest.read-timeout→ 配置项不存在 - 调大 Spring Retry 次数 → 治标不治本,每次还是超时 这些方案要么依赖特定版本的内部 API,要么配置项根本不存在,容易因版本升级而失效。
最终稳定有效的解决方案
核心思路:使用 Spring Boot 官方提供的 RestClientCustomizer 全局配置超时。
这种方式是 Spring 官方推荐的标准化扩展点,兼容性强,几乎不会因版本升级而失效。
方案 1:新建配置类 RestClientConfig.java
package com.ckg.kgaiagent.config;
import org.springframework.boot.web.client.RestClientCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactories;
import org.springframework.http.client.ClientHttpRequestFactorySettings;
import java.time.Duration;
{
RestClientCustomizer {
restClientBuilder -> {
restClientBuilder.requestFactory(ClientHttpRequestFactories.get(ClientHttpRequestFactorySettings.DEFAULTS
.withConnectTimeout(Duration.ofSeconds())
.withReadTimeout(Duration.ofSeconds())
));
};
}
}


