2010-06-25 4 views
0

생산자/소비자 디자인 패턴에 대한 질문이 있습니다. 사실 제 상황은 다음과 같습니다. 여러 가지 유형의 메시지 (알림)를 생성하는 하나의 클래스와 이러한 메시지를 사용하는 여러 소비자가 있습니다.Java에서 하나의 제작자, 다중 소비자 및 다중 객체를 구현하는 방법은 무엇입니까?

필자의 생산자가 다양한 유형의 메시지를 생성하고 소비자가 이러한 메시지를 사용합니다.

그럼이 상황을 가장 효과적으로 구현하는 방법은 무엇입니까? 생산자/소비자 디자인 패턴이이 상황의 가장 좋은 해결책입니까?

+1

당신이 무엇을 요구하는지 말할 수는 없습니다. –

+0

우리가 얻지 못하는이 결정을 내리는 데 필요한 많은 세부 사항이 있다고 생각합니다. 나의 초기 생각은 얼마나 많은 버퍼가있는 프로듀서와 각 버퍼에 대한 소비자가 될 것인가 ... 많은 'what ifs'가 발생하지만 ... – Shaded

+0

사실 내 첫 번째 시도는 : 여러 버퍼와 각 버퍼에 대한 소비자가 있지만 처리가 너무 복잡합니다. – Zakaria

답변

0

여기에는 두 가지 독립적 인 문제가 있다고 생각합니다. 하나는 "메시지"객체를 가로 채고 있습니다. 이것은 생산자/소비자 문제입니다. 안정성을 원한다면 스레딩, 복구 등과 같은 다양한 문제를 고려해야합니다. 실제로 여러 머신간에이 작업을 수행하는 경우 JMS와 같은 기존 프레임 워크를 사용하십시오.

다른 종류의 메시지를 처리하는 문제와는 별도로 일반적으로 메시지의 일부 유형 계층 구조는 공통된 "메시지"앵거스를 하위 유형으로 지정합니다. 나는 당신의 메시지의 의미론에 대해서는 확신하지 못한다. 그러나 명령 패턴의 라인을 따라 무엇인가가 잘 맞을 것이다.

더 나은 조언을 제공하기 위해 질문을 명확히해야합니다.

+0

더 명확히하기 위해 그 메시지는 완전히 다릅니다. 브로커에 연결하는 거래 응용 프로그램이 있습니다. 이 중개인은 나에게 많은 가격을주고 (이것은 첫 번째 유형의 메시지 임) 거래의 실행 보고서를 제공합니다 (다른 유형 임). – Zakaria

+0

이러한 소비자는 로컬로 (스레드) 실행되고 여러 시장을 병렬로 처리합니다. – Zakaria

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. 
    } 
} 
관련 문제