如何使用依赖项通过 JAVA 客户端将消息发布到 Cloud Pub/Sub?

Posted

技术标签:

【中文标题】如何使用依赖项通过 JAVA 客户端将消息发布到 Cloud Pub/Sub?【英文标题】:How to publish messages to Cloud Pub/Sub via the JAVA Client using a dependency? 【发布时间】:2021-12-10 22:13:42 【问题描述】:

我在 maven 包中编写了以下方法:

public static void publishMessage(Publisher publisher, String message) throws ExecutionException, InterruptedException, TimeoutException 
    ByteString data = ByteString.copyFromUtf8(message);
    PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(data).build();
    ApiFuture<String> messageIdFuture = publisher.publish(pubsubMessage);
    String messageId = messageIdFuture.get(10L, TimeUnit.SECONDS);
    LOG.info("Message Published! ID:  Message: ", messageId, message);

当我从 Maven 包中的 Runner 主类调用此方法时,我可以毫无问题地将消息发布到 Pub/Sub。当我将此 maven 项目作为 SBT 项目中的依赖项加载并尝试调用此方法时,执行会在以下行超时:messageIdFuture.get(10L, TimeUnit.SECONDS); 或者如果我使用没有超时配置的语句,则会无限期卡住。

我正在以这种方式构建发布者:

public static Publisher getPublisher(String projectId, String topicId) throws IOException 
    TopicName topicName = TopicName.of(projectId, topicId);
    return Publisher.newBuilder(topicName).build();

我有一种预感,这个问题与执行程序和线程池有关,其中控制没有按照我想要的方式流动。

其他实验:我尝试通过运行publisher.publish(pubsubMessage); 后跟publisher.shutdown(); 来避免future.get(),因为关机会发布所有本地排队的消息。即便如此,消息还是通过 Runner 类发布,并且 SBT 应用程序执行无限期地卡在publisher.shutdown();,它在内部使用wait() messagesWaiter.waitComplete();

请注意:

我在本地通过最终用户凭据使用身份验证,但即使在使用服务帐户的部署应用程序(SBT、Play)中,代码也会超时。 在这些操作之后,我将分别关闭发布者(如文档中所述)(无论如何这不应该成为问题,因为它与 Runner 类一起使用)。

正在使用的 JAVA 客户端版本:1.108.1

我主要遵循 JAVA 客户端文档本身。链接:https://cloud.google.com/pubsub/docs/samples/pubsub-quickstart-publisher

【问题讨论】:

您能否尝试使用最新版本 (v1.114.7) 的 Java client 用于 Google Cloud Pub/Sub? 【参考方案1】:

升级到最新版本的适用于 Cloud Pub/Sub 的 Java 客户端库。

【讨论】:

以上是关于如何使用依赖项通过 JAVA 客户端将消息发布到 Cloud Pub/Sub?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ Java 客户端 - Java 依赖项(标准库?)

如何管理 OSGi 构建依赖项?

如何将本地 aar 依赖项添加到 bintray 发布的库中?

如何将通过 npm 安装的所有依赖项保存到我的 package.json 文件中?

如何通过Gradle将所有依赖项复制到Maven存储库?

如何将 JAR 依赖项包含到 AAR 库中