news 2026/3/1 19:36:01

【异常】Spring Ai Alibaba 流式输出卡住无响应的问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【异常】Spring Ai Alibaba 流式输出卡住无响应的问题

Spring Ai Alibaba 流式输出卡住无响应的问题

关键点

RestClientCustomizer

WebClientCustomizer 重点 流式输出使用这个

// 定义全局WebClient @Bean public WebClientCustomizer webClientCustomizer() { ConnectionProvider providerWeb = ConnectionProvider.builder("webClient-pool") // 1️⃣ 最大连接数:≈ 并发 + 冗余 .maxConnections(500) // 2️⃣ 等待连接的请求上限(防止雪崩) .pendingAcquireMaxCount(200) // 3️⃣ 等待连接的最长时间 .pendingAcquireTimeout(Duration.ofSeconds(30)) // 4️⃣ 空闲连接回收(SSE 结束后) .maxIdleTime(Duration.ofSeconds(30)) // 5️⃣ 单连接最大存活时间(防“僵尸连接”) .maxLifeTime(Duration.ofMinutes(7)) // 6️⃣ 后台定期回收 .evictInBackground(Duration.ofSeconds(30)) // 7️⃣ 开启 metrics(强烈建议) .metrics(true) .build(); HttpClient httpClientWeb = HttpClient.create(providerWeb) .protocol(HttpProtocol.HTTP11) // HTTP/1.1 // 连接超时:5秒 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000) // 响应超时:60秒 这里不用控制 通过ReadTimeout来控制 // .responseTimeout(Duration.ofSeconds(60*10)) .doOnConnected(conn -> //读超时(比如每 60 秒没收到数据就断开 conn.addHandlerLast(new ReadTimeoutHandler(60)) // 可选:更细粒度读超时(需导入 netty-handler) ) // .wiretap(true); // 开启日志(需配置 logging.level.reactor.netty=DEBUG) ; return builder -> builder.clientConnector( new ReactorClientHttpConnector(httpClientWeb) ); }

com.alibaba.cloud.ai.dashscope.api.DashScopeAgentApi

//初始化 webClient

private final RestClient restClient;

private final WebClient webClient;

public DashScopeAgentApi(String baseUrl, String apiKey, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, ResponseErrorHandler responseErrorHandler) { ConnectionProvider providerRest = ConnectionProvider.builder("dashscope-restClient-pool") // 1️⃣ 最大连接数:≈ 并发 + 冗余 .maxConnections(500) // 2️⃣ 等待连接的请求上限(防止雪崩) .pendingAcquireMaxCount(200) // 3️⃣ 等待连接的最长时间 .pendingAcquireTimeout(Duration.ofSeconds(30)) // 4️⃣ 空闲连接回收(SSE 结束后) .maxIdleTime(Duration.ofSeconds(30)) // 5️⃣ 单连接最大存活时间(防“僵尸连接”) .maxLifeTime(Duration.ofMinutes(7)) // 6️⃣ 后台定期回收 .evictInBackground(Duration.ofSeconds(30)) // 7️⃣ 开启 metrics(强烈建议) .metrics(true) .build(); HttpClient httpClientRest = HttpClient.create(providerRest) .protocol(HttpProtocol.HTTP11) // HTTP/1.1 // 连接超时:5秒 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000) // 响应超时:60秒 这里不用控制 通过ReadTimeout来控制 // .responseTimeout(Duration.ofSeconds(60*10)) .doOnConnected(conn -> //读超时(比如每 60 秒没收到数据就断开 conn.addHandlerLast(new ReadTimeoutHandler(60)) // 可选:更细粒度读超时(需导入 netty-handler) ); // .wiretap(true); // 开启日志(需配置 logging.level.reactor.netty=DEBUG) this.restClient = restClientBuilder.baseUrl(baseUrl) .defaultHeaders(ApiUtils.getJsonContentHeaders(apiKey)) .defaultStatusHandler(responseErrorHandler) .requestFactory(new ReactorClientHttpRequestFactory(httpClientRest)) .build(); ConnectionProvider providerWeb = ConnectionProvider.builder("dashscope-webClient-pool") // 1️⃣ 最大连接数:≈ 并发 + 冗余 .maxConnections(500) // 2️⃣ 等待连接的请求上限(防止雪崩) .pendingAcquireMaxCount(200) // 3️⃣ 等待连接的最长时间 .pendingAcquireTimeout(Duration.ofSeconds(30)) // 4️⃣ 空闲连接回收(SSE 结束后) .maxIdleTime(Duration.ofSeconds(30)) // 5️⃣ 单连接最大存活时间(防“僵尸连接”) .maxLifeTime(Duration.ofMinutes(7)) // 6️⃣ 后台定期回收 .evictInBackground(Duration.ofSeconds(30)) // 7️⃣ 开启 metrics(强烈建议) .metrics(true) .build(); HttpClient httpClientWeb = HttpClient.create(providerWeb) .protocol(HttpProtocol.HTTP11) // HTTP/1.1 // 连接超时:5秒 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000) // 响应超时:60秒 这里不用控制 通过ReadTimeout来控制 // .responseTimeout(Duration.ofSeconds(60*10)) .doOnConnected(conn -> //读超时(比如每 60 秒没收到数据就断开 conn.addHandlerLast(new ReadTimeoutHandler(60)) // 可选:更细粒度读超时(需导入 netty-handler) ); // .wiretap(true); // 开启日志(需配置 logging.level.reactor.netty=DEBUG) this.webClient = webClientBuilder.baseUrl(baseUrl) .defaultHeaders(ApiUtils.getJsonContentHeaders(apiKey, null, true)) .clientConnector(new ReactorClientHttpConnector(httpClientWeb)) .build(); }

单独定义

@Bean public RestClientCustomizer restClientCustomizer() { ClientHttpRequestFactory factory = clientHttpRequestFactory(); return builder -> builder.requestFactory(factory); } /** * 配置ClientHttpRequestFactory * * @return ClientHttpRequestFactory实例 */ private ClientHttpRequestFactory clientHttpRequestFactory() { // 1. 配置连接层(TCP 连接、SSL 握手等) ConnectionConfig connectionConfig = ConnectionConfig.custom() .setConnectTimeout(Timeout.ofSeconds(60)) // TCP + SSL 握手超时 .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(1024); // Set max total connections connectionManager.setDefaultMaxPerRoute(1024); // Set max connections per route connectionManager.setDefaultConnectionConfig(connectionConfig); // 显式定义超时 RequestConfig requestConfig = RequestConfig.custom() //大模型调用 需要预留充足时间 .setResponseTimeout(Timeout.ofSeconds(300)) // 注意:HttpClient 5 中是 responseTimeout(不是 socketTimeout) .build(); CloseableHttpClient httpClient = HttpClients.custom() .setConnectionManager(connectionManager) .setDefaultRequestConfig(requestConfig) .disableAutomaticRetries() .evictExpiredConnections() .evictIdleConnections(TimeValue.ofSeconds(60)) // 每60秒清理空闲连接 .build(); HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); clientHttpRequestFactory.setConnectTimeout(60_000); clientHttpRequestFactory.setConnectionRequestTimeout(60_000); clientHttpRequestFactory.setReadTimeout(Duration.ofSeconds(60)); return clientHttpRequestFactory; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 7:55:33

Linux who指令查询和显示当前登录系统的用户信息

who 是 Linux 系统中一个基础且重要的系统管理命令,用于查询和显示当前登录系统的用户信息。它通过读取系统日志文件(默认为 /var/run/utmp)来获取数据,并将结果以清晰格式输出。一、命令基本语法与功能命令的基本语法为&#xff…

作者头像 李华
网站建设 2026/2/28 23:03:05

学霸同款2026 AI论文工具TOP9:本科生毕业论文写作全解析

学霸同款2026 AI论文工具TOP9:本科生毕业论文写作全解析 2026年学术写作工具测评:为什么你需要这份榜单? 随着AI技术在学术领域的深度应用,越来越多的本科生开始依赖智能工具提升论文写作效率。然而,面对市场上琳琅满目…

作者头像 李华
网站建设 2026/2/27 8:29:29

有监督学习神经网络改造为无监督学习的PyTorch可微分优化实现

有监督学习神经网络改造为无监督学习的PyTorch可微分优化实现 1. 引言:问题背景与需求分析 1.1 原始问题描述 我们面临一个关键任务:将一个原本使用有监督学习的神经网络改造为无监督学习架构。原始模型中,标签数据是通过一个MATLAB实现的交错网格差分法函数计算得到的。…

作者头像 李华
网站建设 2026/3/1 21:15:14

展望未来:云服务器的下一个十年

展望未来:云服务器的下一个十年站在技术发展的十字路口,云服务器正经历着从“资源上云”到“云原生智能”的质变。展望未来十年,云服务器将不再仅仅是算力的堆砌,而将演变为高度智能化、无服务器化和边缘化的新型计算形态。首先是…

作者头像 李华
网站建设 2026/3/1 19:44:58

vue基于spring boot的乡村民宿预订周边旅游管理系统应用和研究

文章目录摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着乡村旅游业的快速发展,民宿预订及周边旅游管理系统的需求日益增长。传统的管…

作者头像 李华