1

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

例子:

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

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

提前致谢!

安德鲁·克洛法斯

4

2 回答 2

2

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

我假设 A、B、C 都实现了接口 D,并且如果 A 与 Bs 和 Cs 一起被乱序处理并不重要。

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

于 2012-07-10T22:53:36.293 回答
2

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

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

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

于 2012-07-11T20:05:13.007 回答