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
相关产品推荐
相关产品推荐

