带有消费者过滤的生产者-消费者阻塞队列

Posted

技术标签:

【中文标题】带有消费者过滤的生产者-消费者阻塞队列【英文标题】:Producer-consumer blocking queue with consumer filtering 【发布时间】:2012-07-10 22:40:40 【问题描述】:

我正在尝试在 java 中编写生产者-消费者模式。我是一个网络客户端,通过一系列不同的连接连接到许多服务器。服务器产生不同的“工作”数据包,这些数据包都被放入一个阻塞队列。我正在尝试以一种只有特定类型的工作包交付给特定消费者的方式阻止我的消费者。

例子:

阻塞队列中填充了三种不同类型的工作包对象:A、B、C 两个消费者正在等待工作包对象。消费者 1 只想要 A 型,消费者 2 只想要 B 型或 C 型

java.util 中是否有一些标准类...或者我必须推出自己的类?另外,如果需要的话,最好的方式是什么?

提前致谢!

安德鲁·克洛法斯

【问题讨论】:

你需要在你的阻塞队列和你的消费者之间有一些东西将数据包“路由”到正确的消费者。或者,您可以为每个消费者提供自己的阻塞队列,并根据数据包类型填充队列。 为什么要使用一个阻塞队列?还是存在无法确定的“工作类型”? 类型的数量不确定。我想做的是有一些专门的消费者来响应特定的工作类型,然后是一个包罗万象的消费者。 这听起来更像是发布-订阅 使用这种设计,如果您有一个没有人愿意使用的消息类型 X,您将冒着填满队列的风险。 【参考方案1】:

在 java.util 中没有执行此操作的标准方法,但这里有一个简单的设计:

我假设 A、B、C 都实现了接口 D,并且如果 A 与 Bs 和 Cs 乱序处理也没关系。

拥有一个带有一组排序消费者的“输入”BlockingQueue。这些消费者确定队列中对象的类型,并将它们提供给真正的工作人员从中获取的单独的特定于类型的“输出”队列。是否有一些限制要求您只有一个队列?

【讨论】:

【参考方案2】:

您可以使用标准 JMS 获得此行为。您的生产者创建放置在 JMS 主题上的消息。消费者使用过滤订阅订阅主题:这样,订阅者 X 只能获取类型 X 的消息。 (更多关于订阅API)

持久订阅者将满足您对每个订阅者排队消息的要求。

这是一个发布/订阅模型。

【讨论】:

以上是关于带有消费者过滤的生产者-消费者阻塞队列的主要内容,如果未能解决你的问题,请参考以下文章

什么是阻塞队列?阻塞队列的实现原理是什么?如何使用 阻塞队列来实现生产者-消费者模型?

什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?

什么是阻塞队列?阻塞队列的实现原理是什么?如何使用 阻塞队列来实现生产者-消费者模型?

什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?

阻塞队列

多线程案例-阻塞式队列