В моей системе у меня есть 2 сценария:
Можно ли реализовать его с событиями CDI?
Возможности CDI только для широковещательных стилей/тематических событий. В CDI нет фильтрации событий.
Единственный способ, которым я могу думать, сделать эквивалент, - это придумать квалификатор. Возможно, F
может @Observes @A @B SomeObject
тогда как Y
может @Observes @C @B SomeObject
. Когда F
получает событие, он может @C @B
использования @C @B
в качестве квалификаторов.
Я попытался бы создать какой-то прокси-сервер между производителями событий и потребителями событий:
class EventProducer{
@Inject private Event<EventObject> event;
public void produce(){
event.fire(new EventObject());
}
}
Прокси-сервер:
class EventsProxy{
@Inject private Event<EventObjectForY> event_1;
@Inject private Event<EventObjectForF> event_2;
void observe(@Observes EventObject){
if(eventObjectEligibleForF()){
EventObjectForF f = copyEventObjectToEventObjectForF();
event_2.fire(f);
}
EventObjectForY y = copyEventObjectToEventObjectForY();
event_2.fire(y);
}
}
Потребитель:
class EventConsumer{
public consume(@Observes EventObjectForY obj){
}
}
Но, пожалуйста, помните, что это всего лишь псевдокод.