2013-06-18 2 views
0

Java EE에서 관찰자 모델을 사용하고 있습니다. 하나의 서비스가 많은 관찰자에게 이벤트를 시작하도록하는 것이 아이디어입니다. 그러나 모든 관찰자가 동일한 이벤트를 듣고 있지만 각 이벤트는 이벤트 내에서 지정된 특정 이벤트 유형에만 관심이 있습니다. 내 현재 코드는 다음과 같이이다 :특정 이벤트 유형을 관찰하십시오.

public class Service { 
    public void fireEvent(EventType type) { 
     MyEvent event = new MyEvent(type); 
     fire(event); 
    } 
} 

public class TypeAObserver { 
    public void observeEvent(@Observes MyEvent event) { 
     if (EventType.TYPE_A.equals(event.getType()) { 
      // do something 
     } 
    } 
} 

public class TypeBObserver { 
    public void observeEvent(@Observes MyEvent event) { 
     if (EventType.TYPE_B.equals(event.getType()) { 
      // do something 
     } 
    } 
} 

당신이 볼 수 있듯이, 모든 관찰자 소스 코드 내에서 반복을 증가 추가 작업을 수행하기 전에 유형을 확인해야합니다. 게다가 모든 옵저버가 동일한 이벤트를 수신하지만 실제로는 소수의 프로세스 만 처리하므로 불필요한 성능 오버 헤드가 발생할 수 있습니다.

Java EE 옆에 새 라이브러리를 사용하지 않고 다른 관측자를 찾고 있으므로 각 관찰자가 특정 유형의 이벤트 만 수신하도록 할 수 있습니다.

답변

1
  • 는 각 이벤트 유형에 대해 별도의 큐/이벤트를 사용할 수 있습니다

공공 무효 observeEvent (@Observes MyEventOfType1 이벤트)
공공 무효 observeEvent (@Observes MyEventOfType2 이벤트)

  • 일반 대기열에 필터링 대기열을 만듭니다. 이벤트 유형에 대한 필터링 대기열 필터링. 그런 다음 소비자가 필터링 된 대기열을 관찰하게하십시오.

의사 코드 :

public class TypeAFilter { 
    List listeners ll = ArrayList<Listener>(); 

    public void add(Listener l) { 
     l.add(ll); 
    } 

    public void observeEvent(@Observes MyEvent event) { 
     if (EventType.TYPE_A.equals(event.getType()) { 
      for (Listener l : ll) { 
       l.observeEvent(event); 
      } 
     } 
    } 
} 

}

이것은 기본적으로 필터는 필터 관찰자와 관찰 양을 의미한다. 필터가 서비스를 관찰하고 특정 이벤트의 사용자가 필터에 연결합니다.

  • 서로 다른 이벤트 클래스와 함께 instanceof 사용을 고려하지만 정말보다 빠른 equals

  • 사용 규정입니다 있는지 확실하지 않습니다 :

공공 무효 observeEvent (@ @ EventType1 MyEvent 이벤트를 관찰하십시오.
public void observeEvent (@Observes @ EventType2 MyEvent 이벤트)

참조 오라클의 example 및 한정자 defined

+0

감사합니다,하지만 당신은 처음 2 옵션에 대해 자세히 설명 할 수 있습니까? 세 번째 코드는 소스 코드에 더 많은 반복과 복잡성을 도입 할 수 있으므로 모든 이벤트가 거의 유사하게 처리됩니다. –

+0

답변을 업데이트했습니다. 그리고 나는이 경우에 가장 멍청한 것으로 보이는 다른 옵션 (qualifiers)을 추가했다. (그러나 나는 그것을 사용한 적이 없다). – Beryllium

관련 문제