Como o JEE6 faz o vínculo entre observador e observação (padrão de observador)
Pergunta
Eu li alguns artigos de blog sobre a implementação de padrões de observador no JEE6 e algo me incomoda ... Não consigo encontrar nenhuma informação caixa eletrônico, então pergunto lá ...
Eu encontrei os seguintes exemplos:
@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);
}
}
E
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
}
}
Não consigo entender como o link entre o consumidor de eventos e o produtor de eventos é feito ...
É nomeando a Convenção dos Métodos? (Onde as palavras "on", "depois", "antes" ... terá sentido)
É por comparação de argumentos determinados (aqui string e myevent)?
Eu não posso saber e não vejo o que mais poderia ser ...
Solução
O link entre o disparo do evento e o ouvinte é baseado no tipo de evento.
No seu exemplo:
public class EventConsumer {
public void afterMyEvent(@Observes MyEvent event) {
// .. Insert event logic here
}
}
Esta aula receberá todos os eventos demitidos do tipo myevent, de onde eles vêm.
Fonte: http://download-llnw.oracle.com/javaee/6/api/javax/enterprise/event/observas.html
Outras dicas
O recipiente mantém os metadados sobre todos os grãos dentro dele. Na startup, ele registra todos os métodos de observador juntamente com o tipo de evento (a Class
do argumento) eles observam. Sempre que um evento é demitido, a lista de observadores é verificada quanto a métodos que aceitam o tipo de evento apropriado.