2011-02-08 2 views
3

실시간으로 데이터 을 수집하는 작성한 API가 있다고 가정하면독립적 인 스레드입니다. 데이터 액세스는 스레드로부터 안전하며 인터페이스를 통해 이루어집니다. 예 : getData()은 차단하지 않고 최신 정보를 제공합니다. 이 API는 여러 응용 프로그램에서 사용됩니다. 일부 GUI 구동, 다른 콘솔 프로그램.Java : 내 API에서 이벤트 알림에 대한 내 옵션은 무엇입니까?

응용 프로그램에 데이터 업데이트가 있음을 알리는 옵션에는 어떤 것이 있습니까? 우리는 API가 애플리케이션에 의존하는 것을 원하지 않기 때문에 fireTableDataChanged() 또는 그와 유사한 API를 사용하고 싶지는 않습니다. (GUI 애플리케이션에서 API가 알려 주거나 API를 살펴본 후에 fireTableDataChanged() 등으로 전화 할 것입니다.)

감사합니다.

답변

3

하나의 옵션은 자신 만의 이벤트 제작자 클래스를 작성하는 것입니다.

  • IEventListener < EVENT>
  • IEventProducer < 리스너 IEventListener < 이벤트> 연장 EVENT>
  • EventProducer < 리스너 IEventListener < 이벤트> 연장 EVENT>는 IEventProducer < 리스너 EVENT>
구현

IEventListener는 옵저버에 의해 구현됩니다. 이벤트 수신 방법이 있습니다.

IEventProducer는 EventProducer를 통해 관찰 가능하게 구현됩니다. 리스너를 추가하고 제거하는 메소드를 가지고 있습니다.

EventProducer는 스레드로부터 안전합니다. 리스너의 CopyOnWriteArrayList에 이벤트를 보내는 메소드가 있습니다. 청취자가 던진 예외를 캐치하고 기록합니다. 또한 리스너를 추가하고 제거하는 메소드를 제공합니다.

그런 다음 관찰 가능한 모든 클래스는 내부 EventProducer를 통해 IEventProducer를 구현할 수 있습니다.

동일한 클래스에서 두 개의 리스너 유형을 지원하려는 경우, erasure를 사용하려면 다른 리스너에 대해 추가/제거 리스너 메소드의 이름을 다르게해야합니다.

+1

+1 - 나는 들리는만큼 끔찍한 생각으로 "직접 구현하십시오"는 좋은 선택입니다. 관찰자를 정기적으로 추가 및 제거하는 경우 EventProducer는 java.awt.AWTEventMulticaster에서 사용되는 스레드 안전 이벤트 멀티 캐스팅 논리를 따라 모델링하여 최적화 할 수 있습니다. –

+1

구문 분석을 수정하여 <을 수정했습니다. @ 팀, 나는 그런 공통적 인 패턴에 대해 "자신 만의 구현"이 끔찍하다고 들었습니다. 표준이 없으면 하나의 사내 구현이 여러 가지 다른 클래스 구현 (불행한 경험에서 말하기)보다 낫습니다. 나는 청취자를 추가/제거하는 것이 최적화되어야하는 상황을 한번도 경험하지 못했다. AWTEventMulticaster는 Java 동시성 패키지 및 CopyOnWriteArrayListener를 선행하므로 읽기 쉽고 읽기 쉬운 스레드 안전 구현이 가능합니다. –

+0

답변 해 주셔서 감사합니다. 어떻게 개요를 구현할지 API를 폴링할지/getData()를 블로킹할지 결정하는 방법은 무엇입니까? 어떤 이슈입니까? – Pete

2

ObservableObserver을 살펴볼 수 있습니다. 나는 개인적으로 사용하지 않았으며, API를 보면서 나는 그것이 내가 그것을 걱정한다고 완전히 확신하지는 않는다. 기본적으로 관찰 가능한 데이터 객체는 Observable 클래스에서 확장되어야합니다. 데이터에 관심이있는 클래스는 Observer 인터페이스를 구현하고 데이터 객체에 등록해야합니다. 이 API는 1.0 이후에 존재했기 때문에 일반적인 것이 아니며 나는 clunky하다고 생각합니다. 그러나 이것은 내가 아는 Java 라이브러리의 Observer/Observable 패턴 중 유일합니다.

2

기본적으로 두 가지 옵션이 있습니다.

1) API에 폴링하여 새 데이터가 있는지 확인하십시오.
2) 새 데이터가있을 때 알려주는 API를 가져옵니다.

Observer 패턴을 사용하면 API에서 알림을 받도록 할 수 있습니다. ObservableObserver을 사용할 필요가 없으므로 사용자 고유의 인터페이스를 작성할 수 있습니다.기본적으로 다음과 같이 작동합니다.

  • 관측 대상 (API)에는 일종의 관찰자/수신기 인터페이스를 구현하는 관찰자 목록이 있습니다. 옵서버가이 목록에 자신을 추가하도록 요청해야합니다.
  • 관측/청취를하는 것은이 인터페이스를 구현하고 API를 호출하여 옵저버 목록에 자신을 추가합니다.
  • 관찰되는 것이 상태 (즉, 새로운 데이터가 있음)를 업데이트하면 관찰자 목록을 거쳐 통지됩니다.
+0

(1)과 (2) 사이의 결정에 문제가 있습니까? 그것은 (2)가 (1)보다 훨씬 더 복잡해 보입니다. 따라서, 나는'getData()'를 블로킹 (blocking) 시키거나, API를 폴링 (poll)하는 것으로 생각하고있다. – Pete

관련 문제