2017-09-08 10 views
1

이벤트를 파견하는 것은 짧은 내가 여기 물어 오히려입니까?구아바 EventBus :</p> <p>다수의 가입자에게 이벤트를 전달하거나 이벤트가 항상 첫 번째 적절한 가입자 소비하는 방법이 있나요 : 여러 가입자 구아바의 <code>EventBus</code> 문서부터

후자의 경우 해당 기능을 추가하거나 전체 응용 프로그램에서 전체 이벤트 버스 로직을 구현하려면 EventBus 클래스를 확장하는 것이 더 낫지 않습니까?

답변

1

이벤트는 이벤트 유형과 일치하는 한 모든 등록 된 가입자에게 라우팅됩니다. 이벤트를 게시 단순히 포스트 (Object) 메소드에 이벤트 객체를 제공하기 위해

게시 이벤트

:

IT는 JavadocEventBus의에 있습니다. EventBus 인스턴스는 이벤트의 유형을 판별하고 등록 된 모든 리스너로 라우트합니다.

이벤트는 유형에 따라 라우팅됩니다. 이벤트는 이벤트가 할당 될 수있는 모든 유형의 구독자에게 전달됩니다. 여기에는 구현 된 인터페이스, 모든 수퍼 클래스 및 수퍼 클래스로 구현 된 모든 인터페이스가 포함됩니다.

+0

고마워 - 읽었지만 테스트했지만 내 테스트가 유효하지 않았습니다. 두 번째 청취자를 등록하지 않았습니다 .-) – Hannes

0

후자의 경우, 그것은 더 나은 같은 기능을 추가하거나 자신의 응용 프로그램에서 전체 이벤트 버스 로직을 구현하기 위해 EventBus 클래스를 확장하는 것? 내 생각

는 당신이 필요로하는 모든 이벤트에 handled 속성을 추가하고 모든 핸들러에 testAndSet를 추가하는 것입니다. 수동으로 수행하는 경우 오류가 발생하기 쉽습니다.

이벤트에 대한 래퍼를 만들면 호출하지 않고도 액세스 할 수 있습니다.

@RequiredArgsConstructor 
class WrappedEvent<E extends MyEvent> { 
    private final E event; 
    private boolean handled; 

    Optional<E> getAndMarkHandledUnlessHandled() { 
     if (handled) { 
      return Optional.empty(); 
     } else { 
      handled = true; 
      return Optional.of(event); 
     } 
    } 
} 

또는 callAndMarkHandledUnlessHandled(Consumer<E> consumer)과 같은 더 기능적인 방식으로 수행하십시오. 비동기 파견의 경우 AtomicBoolean을 사용합니다.

그러나 지우기 때문에 EventBus에는 일반적인 정보가 없으므로 WrappedEvent<A>WrappedEvent<B>에는 사용할 수 없습니다. 당신은 WrappedA extends WrappedEvent<A> {}과 같은 래퍼를 하위 클래스화할 수 있으며 함께 사용할 수 있습니다. 망할 놈이야.

의미심장하게는 EventBus을 확장하는 것은 거의 불가능합니다. 패키지에 몰래 들어 가지 않으려는 경우입니다. 가장 쉬운 방법은 아마도 전체 패키지를 포크하고 this line 이후에 휴식을 추가하는 것입니다.