news 2026/3/11 11:59:27

【异常】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/3/11 7:04:35

从HTML注入到CSRF:一次漏洞组合拳实战

前言 免责声明:本文仅供安全学习研究,所有测试均在授权环境或自建靶场中进行。严禁用于非法用途,否则后果自负。 HTML注入 CSRF登出漏洞实战复现 漏洞概述 在某社区平台的评论功能中发现存储型HTML注入漏洞。虽然前端做了输入过滤&#…

作者头像 李华
网站建设 2026/3/9 9:45:36

1024编程——让我们的孩子对话未来

编程到底学什么? 其实,编程思维是“理解问题——找出路径”的高效思维过程,它由分解、模式识别、抽象、算法四个步骤组成。编程能够培养孩子的自律性,需要制定规则并培养孩子形成遵守规则的意识。每一门编程语言都有自己的规则&am…

作者头像 李华
网站建设 2026/3/8 14:14:00

五大主流CRM品牌核心能力横向对比:从闭环到协同的全维度拆解

在企业数字化转型中,CRM已从“销售工具”升级为“全链路协同平台”。本文选取超兔一体云、Oracle CX、Capsule CRM、智赢云CRM、橙子CRM五大主流品牌,围绕线索到回款闭环、后端供应链管理、协同工具对接三大核心场景,结合流程、数据、易用性多…

作者头像 李华
网站建设 2026/3/9 18:22:58

华为ensp:VRF

目录 一、核心概念与作用 二、工作原理 三、拓扑及配置 总结 VRF(Virtual Routing and Forwarding,虚拟路由转发)是网络虚拟化核心技术,能在一台物理路由器 / 三层交换机上创建多个逻辑隔离的路由实例,每个实例拥有…

作者头像 李华
网站建设 2026/3/8 14:13:46

易语言开发者的职业跃迁与生态共建

易语言开发者的职业跃迁与生态共建 🚀 1.20.1 学习目标 🎯 作为《易语言开发从入门到精通》的收官核心章,本章将整合前19章的所有技术栈与商业逻辑,为易语言开发者打造一套可落地、可复制、可长期成长的职业发展体系,你…

作者头像 李华
网站建设 2026/3/11 8:39:59

架构师视角:网络安全体系深度解析——核心模型、数据标准与落地实践

网络安全体系概述 4.1.1 网络安全体系概述 一般面言,网络安全体系是网络安全保障系统的最高层概念抽象,是由各种网络安全单元按照一定的规则组成的,共同实现网络安全的目标。网络安全体系包括法律法规政策文件、安全策略、组织管理、技术措…

作者头像 李华