news 2026/6/6 7:13:39

【异常】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/5/31 3:28:35

吐血推荐10个AI论文软件,专科生毕业论文必备!

吐血推荐10个AI论文软件,专科生毕业论文必备! AI 工具如何助力专科生轻松应对论文挑战 在当今信息化时代,AI 技术已经渗透到各个领域,教育行业也不例外。对于专科生而言,撰写毕业论文是一项既重要又充满挑战的任务。面…

作者头像 李华
网站建设 2026/6/6 5:43:23

高通开源驱动ath12k已正式支持QCC2072

最新消息,高通于25年12月底更新开源驱动ath12k,已正式支持QCC2072 Wi-Fi7 芯片。 驱动对应链接: https://git.codelinaro.org/clo/ath-firmware/ath12k-firmware/-/tree/main 补丁说明链接: https://lore.kernel.org/ath12k/ O…

作者头像 李华
网站建设 2026/6/5 3:58:59

HIDL Hal 开发笔记3----Binderized HALs 实例分析

目录一、整体框架二、HAL 层服务端实现三、Framework 层客户端实现Binderized HALs 实例分析 一、整体框架 对于 Binderized HALs,HAL 层以进程的形式存在,内部有一个 HwBinder 服务端对象,对外提供 HwBinder 远程调用服务。Framework 通…

作者头像 李华
网站建设 2026/6/2 21:49:36

LINUX modprobe 智能加载和卸载内核模块

modprobe 是 Linux 系统中用于智能加载和卸载内核模块的核心命令。与 insmod 等低级工具不同,它的核心优势在于能自动处理模块之间的依赖关系,使内核模块管理变得高效且可靠。核心功能与工作原理modprobe 的主要功能包括:智能加载模块、自动解…

作者头像 李华
网站建设 2026/5/28 18:24:03

电力行业气体安全监测指南:气体检测仪的应用方案

在电力系统的日常运营与维护中,除了严防触电、火灾等显性风险,一类隐形杀手同样不容忽视——有害气体。无论是密闭变电站内的六氟化硫泄漏、电缆隧道中的缺氧与可燃气体积累,还是蓄电池室可能产生的氢气,都对设备稳定与人员安全构…

作者头像 李华