我正在尝试使用GCP Java SDK通过以下代码将消息发送到发布/订阅主题(在此代码段中使用占位符替换了实际的项目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资源。该服务帐户具有项目所有者,并且我已经通过发布/订阅控制台验证了该服务帐户具有适当的权限。
使用发布/订阅进行身份验证是否需要任何其他步骤?
答案 0 :(得分:0)
问题不是访问凭据。看来这是gax-java库上的版本冲突。 needsCredentials
方法于2019年6月在v1.46中添加。也许您明确地依赖于旧版本,或者另一个依赖项正在引入旧版本并泄漏了他们引入的版本。如果是前者,请更新插入1.46版或更高版本。如果是后者,则可能需要shade the dependency。