如何使用依赖项通过 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 依赖项(标准库?)
如何将本地 aar 依赖项添加到 bintray 发布的库中?