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

How to publish messages to Cloud Pub/Sub via the JAVA Client using a dependency?

我在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 main class 调用此方法时,我能够毫无问题地将消息发布到 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 class 发布,SBT 应用程序执行会无限期地卡在 publisher.shutdown();,它在 messagesWaiter.waitComplete();

内部使用 wait()

请注意:

JAVA 使用的客户端版本:1.108.1

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

升级到最新版本的 Java 云客户端库 Pub/Sub 成功了。