如何在Java中实现一个生产者,多个消费者和多个对象?

时间:2010-06-25 16:25:45

标签: java design-patterns producer-consumer

我对制作人/消费者设计模式有疑问,实际上我的情况是:我有一个类产生多种类型的消息(通知)和多个使用这些消息的消费者。

复杂的是我的制作人制作不同类型的消息,我的消费者会消费这些消息。

那么这种情况的最佳实施是什么?生产者/消费者设计模式是这种情况的最佳解决方案吗?

2 个答案:

答案 0 :(得分:0)

我认为这里有两个独立的问题。一个是获得一个“消息”对象。这是一个生产者/消费者问题,但如果你想要可靠性,你需要考虑各种问题,如线程,恢复等。如果你真的在多台机器之间做这件事,那就帮自己一个忙,并使用像JMS这样的现有框架。 / p>

与此分开处理不同类型的消息的问题。通常你会有一些消息的类型层次结构,它们都会对一个共同的“消息”祖先进行子类型化。我不确定你的消息的语义,但是命令模式的某些东西可能是合适的。

您真的需要更多地澄清您的问题,以便我们能够提供更好的建议。

答案 1 :(得分:0)

鉴于您觉得您正在编写制作人和消费者,我会说使用产品/消费者模式是个好主意。由于存在许多类型的消息,可能最好使用“拉”数据模型(让消费者询问消息,而不是让每个消费者获得每条消息)。以下是可能有所帮助的大纲:

public interface BrokerProducer
{
    public void addConsumer(BrokerConsumer consumer);        
    public void removeConsumer(BrokerConsumer consumer);

    public Price getPrices();
    public Report getReport();
}

public interface BrokerConsumer
{
    public void update(BrokerProducer brokerProducer);
}

public class Broker implements BrokerProducer
{
    private Collection<BrokerConsumer> consumer = new HashSet<BrokerConsumer>();

    // Implement the interface

    // Notify all consumers- there are messages ready.
    public void notifyConsumers()
    {
        for(BrokerConsumer consumer : consumers)
            consumer.update(this);
    }       
}

public class PricesConsumer implements BrokerConsumer
{
    @Override
    public void update(BorkerProducer producer)
    {
        Prices prices = producer.getPrices();
        // Do something with the prices.
    }
}