java - 一次仅拉取一条消息

标签 java google-cloud-pubsub

我目前面临的问题是我想实现一个简单的主从模式,其中主服务器通过将所有作业从头开始发布到主题来初始化作业队列。奴隶只要有空闲的工作能力就会拉这些工作,一次拉一个工作就可以实现拉。示例代码 on github 中的代码在特定时间拉取多条消息

subscriber.startAsync().awaitRunning();
Thread.sleep(params.y());

我不想这样,我只想从队列中拉取一条作业消息,让从属设备完成工作,工作完成后,调用拉取方法来拉取另一条作业消息,但一次只能拉取一条。由于我在 ExecutorService 中执行作业,因此我想确保如果我的线程池已满,我不会提取任何消息。如果有一项工作已完成且线程没有工作,我如何实现拉动一条消息,将该作业填充到我的 ExecutorService 中,并且仅拉动下一条作业消息?

最佳答案

一次提取一条消息将被视为 Google Cloud Pub/Sub 的反模式。您可以通过指定 FlowControlSettings 来控制传递给工作人员的消息数量。通过Subscriber Builder 。特别是,您可以调用 setMaxOutstandingElementCount在 FlowControlSettings Builder 上,限制已传递到您提供的 MessageReceiver 的最大消息数。如果您的每个工作人员都是单独的订阅者并且希望一次执行一个操作,您甚至可以将此数字设置为 1。

如果您需要更精确地控制订阅者的拉取语义,那么您可以使用gRPC library's pull method直接地。 Serivce APIs Overview有关此方法的更多信息。

关于java - 一次仅拉取一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43388359/

相关文章:

java - ThreadLocal 与线程局部变量

java - 当我设置背景图像时,我的按钮被隐藏

java - 在屏幕上放置 block 第 2 部分

java - Kafka 使用 Sink Connector 进行 google Pub/Sub

google-cloud-pubsub - google.cloud.pubsub_v1.PublisherClient 线程安全吗?

python - 使用 Python 客户端处理 Google Pub Sub 串行任务

java - 如何在Java中将格式化日期(yyyy-MM-dd)转换为Unix时间?

Java 32 位 JRE : can this JRE run a 64 bit program?

google-cloud-pubsub - 如何使用 Google Cloud Pub/Sub 进行 Junit 测试

node.js - 使用 jest 测试具有异步函数监听器的 eventEmitter