Как JEE6 устанавливает связь между Наблюдателем и Наблюдателем (Шаблон наблюдателя) - PullRequest
1 голос
/ 31 августа 2010

Я прочитал некоторые статьи в блоге о реализации шаблонов Observer на JEE6, и что-то беспокоит меня ... Я не могу найти никакой информации, поэтому я спрашиваю там ...

Я нашел следующие примеры:

@Stateless
[...]
public class ParisJugService {

   @Inject
   Event event;

   public void helloParis(){
        System.out.println("Hello Paris");
        event.fire("hello Paris invoked!");
   }
}

@Stateless
public class EventReceiver {

    public void onHelloParis(@Observes String message){
        System.out.println("----------- " + message);
    }
}

И

public class MyEvent {
    String data;
    Date eventTime;
    ....

}

public class EventProducer {

  @Inject @Any Event<MyEvent> event;


  public void doSomething() {
       MyEvent e=new MyEvent();
      e.data="This is a test event";
      e.eventTime=new Date();
      event.fire(e);

  }

}


public class EventConsumer {


    public void afterMyEvent(@Observes MyEvent event) {

        // .. Insert event logic here
    }

}

Я не могу понять, как делается связь между потребителем события и его производителем ...

Это соглашение об именах методов? (Где слова «вкл», «после», «до» ... будут иметь смысл)

Это путем сравнения заданных аргументов (здесь String и MyEvent)?

Я не могу знать и не вижу, что еще это может быть ...

Ответы [ 2 ]

6 голосов
/ 31 августа 2010

Контейнер хранит метаданные обо всех bean-компонентах внутри него. При запуске он регистрирует все методы-наблюдатели вместе с типом события (Class аргумента), который они наблюдают. Всякий раз, когда происходит событие, список наблюдателей проверяется на наличие методов, которые принимают соответствующий тип события.

2 голосов
/ 31 августа 2010

Связь между срабатыванием события и слушателем основана на типе события.

В вашем примере:

public class EventConsumer {

    public void afterMyEvent(@Observes MyEvent event) {
        // .. Insert event logic here
    }

}

Этот класс будет получать все инициированные события типа MyEvent, где бы они ни находилисьони пришли.

Источник: http://download -llnw.oracle.com / javaee / 6 / api / javax / enterprise / event / Observed.html

...