You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成AWS Cognito创建userPoolClient报connection pool shutdown错误

问题根因

该问题的核心是AWS Cognito客户端实例提前被销毁、或用户池创建的异步流程未完成就触发了客户端创建逻辑,调试模式下的断点等待时间刚好覆盖了用户池初始化/客户端连接初始化的窗口,所以可以正常执行。

可行解决方案

  • 首先检查Cognito客户端的生命周期管理
    不要使用try-with-resources语法声明Cognito客户端,该语法会在代码块执行结束后自动关闭客户端连接池,后续调用API就会触发连接池关闭错误。正确的做法是将CognitoIdentityProviderClient注册为Spring单例Bean,由Spring容器统一管理生命周期,不要手动调用close()方法:

    @Bean
    public CognitoIdentityProviderClient cognitoClient() {
        return CognitoIdentityProviderClient.builder()
                .region(Region.of("你的区域"))
                .build();
    }
    
  • 增加用户池状态校验逻辑
    AWS创建用户池是异步操作,调用createUserPool接口返回成功仅代表请求被AWS接收,不等于用户池已经初始化完成可使用。需要在创建用户池后增加轮询逻辑,等待用户池状态变为ACTIVE后再执行创建客户端的操作:

    // 创建用户池后执行轮询
    DescribeUserPoolRequest describeRequest = DescribeUserPoolRequest.builder()
            .userPoolId(新建的用户池ID)
            .build();
    int maxWaitTime = 30; // 最多等待30秒
    int waitInterval = 1; // 每秒查询一次
    for (int i = 0; i < maxWaitTime; i++) {
        UserPoolStatus status = cognitoClient.describeUserPool(describeRequest).userPool().status();
        if (UserPoolStatus.ACTIVE.equals(status)) {
            break;
        }
        Thread.sleep(waitInterval * 1000);
    }
    
  • 调整AWS SDK连接池配置
    若默认连接池参数的空闲超时时间过短,也会导致连接被提前回收,可以手动配置连接池参数延长超时时间:

    @Bean
    public CognitoIdentityProviderClient cognitoClient() {
        SdkHttpClient httpClient = ApacheHttpClient.builder()
                .maxConnections(10)
                .connectionMaxIdleTime(Duration.ofSeconds(60))
                .build();
        return CognitoIdentityProviderClient.builder()
                .region(Region.of("你的区域"))
                .httpClient(httpClient)
                .build();
    }
    

内容的提问来源于stack exchange,提问作者Manoj ahirwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:21:00