一次只拉取一条消息

Pulling just one message at a time

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

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

我不想那样,我只是想从队列中拉取一条作业消息,让slave来做,工作完成后,调用pulling方法拉取另一条作业消息,但一次只能拉一条时间。因为我在 ExecutorService 中执行作业,所以我想确保如果我的线程池已满,我不会提取任何消息。我如何实现提取一条消息,将该作业填充到我的 ExecutorService 中,并且只提取下一条作业消息,如果有一个作业已完成,并且一个线程没有工作?

一次拉取一条消息将被视为 Google 云 Pub/Sub 的反模式。您可以通过在 FlowControlSettings Builder 上指定 FlowControlSettings via the Subscriber Builder. In particular, you could call setMaxOutstandingElementCount 来控制传递给您的工作人员的消息数,以限制传递给您提供的 MessageReceiver 的最大消息数。如果您的每个工作人员都是单独的订阅者并且想一次执行一个操作,您甚至可以将此数字设置为 1。

如果您需要对订阅者的拉动语义进行更精确的控制,那么您可以使用 gRPC library's pull method directly. The Serivce APIs Overview 有关此方法的更多信息。