2012-07-10 240 views
0

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

实施例:

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

java.util中是否存在一些标准类...还是必须滚动我自己的类?另外,如果需要,最好的方法是什么?

在此先感谢!

安德鲁Klofas

+2

您需要阻塞队列和消费者之间的某些东西将数据包“路由”到正确的消费者。或者,您可以为每个使用者分配自己的阻塞队列,并根据数据包类型填充队列。 – 2012-07-10 22:43:06

+0

为什么要使用一个阻塞队列?还是存在着不确定数量的“工作类型”? – 2012-07-10 22:44:15

+0

有不确定数量的类型。我想要做的是有一些专门的消费者对特定的工作类型做出反应,然后是一个全能的消费者。 – 2012-07-10 22:46:51

回答

1

没有java.util中做到这一点的标准方式,但这里有一个简单的设计:

我假设A,B,C都实现接口d和使用Bs和Cs无序处理A并不重要。

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

2

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

持久的用户将得到你所要求的每个用户的排队消息。

这是一个pub/sub模型。