news 2026/6/15 14:13:57

【异常】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/6/15 11:14:17

走出“实验室”走向“天空” 杭州如何托举低空经济加速起飞?

具身智能加速起跑、低空经济蓬勃发展、人工智能深入公共治理与民生服务……在新一轮科技与产业变革中,杭州正以制度创新、场景开放和生态协同为抓手,加快打通科技成果从实验室走向市场的“最后一公里”,全力建设具有全国影响力的人工智能创新…

作者头像 李华
网站建设 2026/6/15 11:11:43

基于点云和建模命令反推CADQuery代码的批量推理系统

基于点云和建模命令反推CADQuery代码的批量推理系统 1. 项目概述与设计思路 1.1 项目背景 在CAD/CAM领域,从点云数据重建CAD模型是一个具有挑战性的任务。传统方法需要复杂的几何算法和人工干预,而现代大语言模型(LLM)在理解几何关系和生成代码方面展现出强大能力。本项…

作者头像 李华
网站建设 2026/6/15 11:13:04

Zookeeper在大数据领域的元数据管理实践

Zookeeper在大数据领域的元数据管理实践 关键词:Zookeeper、大数据、元数据管理、分布式系统、实践应用 摘要:本文主要探讨了Zookeeper在大数据领域元数据管理方面的实践。首先介绍了相关背景知识,包括目的、预期读者、文档结构和术语表。接着…

作者头像 李华
网站建设 2026/6/15 11:20:46

Spring Boot测试类的使用参考

Spring Boot测试类的使用参考 1. 集成测试概述 集成测试是在完整的Spring应用上下文中测试应用组件之间的交互。与单元测试不同&#xff0c;集成测试会启动Spring容器并加载所有配置的Bean。 2. 依赖配置 2.1 Maven依赖 <!-- Spring Boot测试核心依赖 --> <dependency…

作者头像 李华
网站建设 2026/6/15 12:14:36

全链路高可用架构 —— 从基建到应用的立体防护

腾讯云依托二十余年技术积累&#xff0c;构建全链路高可用体系&#xff0c;以 99.999% 服务可用性、99.9999999% 数据可靠性&#xff0c;成为企业数字化转型的坚实地基。基础设施层面&#xff0c;全球 40T3 级可用区采用 2N1 电力冗余、N2 制冷设计与多链路网络架构&#xff0…

作者头像 李华