如何解决io.grpc.StatusRuntimeException: 从 Google Cloud PubSub 获取主题发布者名称时 DEADLINE_EXCEEDED
我们的应用程序使用 Google PubSub(发布者-订阅者)进行跨服务的异步通信。在应用程序中的一项服务中,它会检查主题(发布者)名称是否存在于 PubSub 中。如果它在 PubSub 中不存在,则该服务具有在重新启动时创建主题(发布者)名称的逻辑,否则它会记录该主题(发布者)名称已存在于 Google PubSub 中的消息。
问题描述:
- 在其中一项服务中构建了一项新功能,其中 JSON 存储在文件中并上传到 AWS S3。
- 作为该功能的一部分,需要将 AWS S3 依赖项添加到 Gradle 文件中。
- 在 Gradle 启用 AWS S3 依赖项后,PubSub 无法获取主题名称(已存在于 PubSub)并引发异常"io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED"。此外,服务无法将消息发布到引发异常 "java.util.concurrent.TimeoutException" 的主题。
- 在 Gradle 中禁用 AWS S3 依赖项后,PubSub 能够获取主题(发布者)名称,并且能够将消息发布到同样按预期工作的主题。
总结:
- 在 Gradle 中禁用 AWS s3,PubSub 按预期工作。
- 在 Gradle 启用 AWS s3,PubSub 抛出异常。
// Reading the PubSub Configurations from file
File file = new File(ServiceConfigJson.PUBSUB_CONfig_FILE_PATH);
InputStream stream = new FileInputStream(file);
// Authenticating and Checking whether topic name exists or not
AuthCredentials.ServiceAccountAuthCredentials auth = AuthCredentials.createForjson(stream);
pubsub = PubSubOptions.builder().projectId("anna-us").authCredentials(auth).build().service();
Topic pubSubTopic = pubsub.getTopic(topicName);
if (pubSubTopic == null)
{
// Creates the new topic
Topic topic = pubsub.create(TopicInfo.of(topicName));
logger.debug("PubSubTopic with topic name {} created",topic.name());
}
else
{
logger.info("PubSubTopic with topic name {} already exists",topicName);
}
如果有人能对此提供见解,那将是非常有帮助的。
使用的版本:
compile group: 'com.google.cloud',name: 'google-cloud-pubsub',version: '0.4.0'
compile group: 'com.amazonaws',name: 'aws-java-sdk',version: '1.11.931'
解决方法
通过添加一个仅用于 AWS S3 而不是整个 AWS 开发工具包的库,我改变了我对 Gradle 的依赖。
compile group: 'com.amazonaws',name: 'aws-java-sdk',version: '1.11.931'
到
compile group: 'com.amazonaws',name: 'aws-java-sdk-s3',version: '1.11.934'
更改此设置后,PubSub 开始为我正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。