使用google-cloud-secretmanager 2.13.0遇IllegalStateException求助
问题:使用google-cloud-secretmanager 2.13.0获取GCP Secret Manager值时抛出IllegalStateException
使用google-cloud-secretmanager 2.13.0版本依赖获取GCP Secret Manager值时,遇到java.lang.IllegalStateException: getTransportChannel() called when needsExecutor() is true错误。
工具类代码
public String get(String secretName) { try (SecretManagerServiceClient client = SecretManagerServiceClient.create()) { SecretVersionName secretVersionName = SecretVersionName.of(projectId, secretName, "latest"); AccessSecretVersionRequest accessRequest = AccessSecretVersionRequest.newBuilder().setName(secretVersionName.toString()).build(); ByteString secretValue = client.accessSecretVersion(accessRequest).getPayload().getData(); String secretString = secretValue.toStringUtf8(); if (StringUtils.isNotBlank(secretString)) { return secretString; } else { throw new RuntimeException(String.format("Secret of %s is blank", secretName)); } } catch (Exception e) { throw new RuntimeException("Caught an error when getting a secret value.", e); } }
完整异常栈
Exception in thread "main" java.lang.RuntimeException: Caught an error when getting a secret value. at com.rakuten.rcp.cdu.util.SecretManager.get(SecretManager.java:30) at com.rakuten.rcp.cdu.FeedToGsp.run(FeedToGsp.java:107) at com.rakuten.rcp.cdu.FeedToGsp.main(FeedToGsp.java:101) Caused by: java.lang.IllegalStateException: getTransportChannel() called when needsExecutor() is true at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.getTransportChannel(InstantiatingGrpcChannelProvider.java:180) at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:201) at com.google.cloud.secretmanager.v1.stub.GrpcSecretManagerServiceStub.create(GrpcSecretManagerServiceStub.java:248) at com.google.cloud.secretmanager.v1.stub.SecretManagerServiceStubSettings.createStub(SecretManagerServiceStubSettings.java:349) at com.google.cloud.secretmanager.v1.SecretManagerServiceClient.<init>(SecretManagerServiceClient.java:180) at com.google.cloud.secretmanager.v1.SecretManagerServiceClient.create(SecretManagerServiceClient.java:162) at com.google.cloud.secretmanager.v1.SecretManagerServiceClient.create(SecretManagerServiceClient.java:153) at com.rakuten.rcp.cdu.util.SecretManager.get(SecretManager.java:15) ... 2 more
解决方案
这个错误源于GCP客户端库创建时缺少显式Executor配置,或是依赖版本冲突,可通过以下方式解决:
1. 显式配置Executor创建客户端
修改客户端初始化逻辑,通过SecretManagerServiceSettings指定自定义Executor:
public String get(String secretName) { try { // 创建单线程Executor ExecutorService executor = Executors.newSingleThreadExecutor(); // 构建客户端配置并绑定Executor SecretManagerServiceSettings settings = SecretManagerServiceSettings.newBuilder() .setExecutorProvider(FixedExecutorProvider.create(executor)) .build(); try (SecretManagerServiceClient client = SecretManagerServiceClient.create(settings)) { SecretVersionName secretVersionName = SecretVersionName.of(projectId, secretName, "latest"); AccessSecretVersionRequest accessRequest = AccessSecretVersionRequest.newBuilder() .setName(secretVersionName.toString()) .build(); ByteString secretValue = client.accessSecretVersion(accessRequest).getPayload().getData(); String secretString = secretValue.toStringUtf8(); if (StringUtils.isNotBlank(secretString)) { return secretString; } else { throw new RuntimeException(String.format("Secret of %s is blank", secretName)); } } finally { // 关闭Executor释放资源 executor.shutdown(); } } catch (Exception e) { throw new RuntimeException("Caught an error when getting a secret value.", e); } }
2. 升级依赖版本
google-cloud-secretmanager 2.13.0存在已知的兼容性问题,建议升级到最新稳定版(如2.25.0或更高的2.x分支,或迁移至3.x版本),同时确保google-api-gax-grpc等关联依赖版本匹配,避免版本冲突。
3. 检查运行环境配置
若在容器或受限环境中运行,确认环境未限制线程池创建,或已提供客户端可使用的上下文Executor。
内容的提问来源于stack exchange,提问作者Chan Myae Aung
相关产品推荐
相关产品推荐

