【发布时间】:2019-12-06 01:36:25
【问题描述】:
我正在尝试使用 GCP Java SDK 使用以下代码向 Pub/Sub 主题发送消息(在此 sn-p 中用占位符替换了实际项目 ID 和主题名称):
Publisher publisher = null;
ProjectTopicName topic = ProjectTopicName.newBuilder()
.setProject("MY_PROJECT_ID")
.setTopic("MY_TOPIC")
.build();
try {
publisher = Publisher.newBuilder(topic).build();
for (final String message : data) {
ByteString messageBytes = ByteString.copyFromUtf8(message);
PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(messageBytes).build();
ApiFuture<String> future = publisher.publish(pubsubMessage);
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (publisher != null) {
publisher.shutdown();
}
}
这会导致以下异常:
Exception in thread "main" java.lang.AbstractMethodError: com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.needsCredentials()Z
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:157)
at com.google.cloud.pubsub.v1.stub.GrpcPublisherStub.create(GrpcPublisherStub.java:164)
at com.google.cloud.pubsub.v1.Publisher.<init>(Publisher.java:171)
at com.google.cloud.pubsub.v1.Publisher.<init>(Publisher.java:85)
at com.google.cloud.pubsub.v1.Publisher$Builder.build(Publisher.java:718)
at com.westonsankey.pubsub.MessageWriter.sendMessagesToPubSub(MessageWriter.java:35)
at com.westonsankey.pubsub.MessageWriter.main(MessageWriter.java:24)
我已将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为指向 JSON 私钥文件,并确认我可以使用该私钥访问此应用程序中的其他 GCP 资源。该服务帐号拥有项目所有者,并且我已通过 Pub/Sub 控制台验证该服务帐号具有相应的权限。
使用 Pub/Sub 进行身份验证是否需要任何额外的步骤?
【问题讨论】:
-
作为测试,我将从我的 Java 代码中检索 GOOGLE_APPLICATION_CREDENTIALS 环境变量的值,以验证它确实被正确传递。我还将验证我是否已从运行 JVM 的用户那里读取文件的权限。
-
我认为应用程序访问环境变量指向的私钥文件不是问题,因为我已经确认我可以使用相同的身份验证访问应用程序中的其他 GCP 服务方法(使用 Cloud Storage 测试)。
-
在您的代码中,您使用了一个名为 publisher 的变量。该实例是如何构造的?
标签: java google-cloud-platform google-cloud-pubsub