如何使用依赖项通过 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()
请注意:
- 我在本地通过最终用户凭据使用身份验证,但即使在我部署的使用服务帐户的应用程序(SBT、Play)中,代码也会超时。
- 我将在这些操作之后单独关闭发布者(如文档中所述)(无论如何这不应该成为问题,因为它正在与 Runner class 一起工作)。
JAVA 使用的客户端版本:1.108.1
我主要遵循 JAVA 客户端文档本身。 Link: https://cloud.google.com/pubsub/docs/samples/pubsub-quickstart-publisher
升级到最新版本的 Java 云客户端库 Pub/Sub 成功了。
我在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()
请注意:
- 我在本地通过最终用户凭据使用身份验证,但即使在我部署的使用服务帐户的应用程序(SBT、Play)中,代码也会超时。
- 我将在这些操作之后单独关闭发布者(如文档中所述)(无论如何这不应该成为问题,因为它正在与 Runner class 一起工作)。
JAVA 使用的客户端版本:1.108.1
我主要遵循 JAVA 客户端文档本身。 Link: https://cloud.google.com/pubsub/docs/samples/pubsub-quickstart-publisher
升级到最新版本的 Java 云客户端库 Pub/Sub 成功了。