Как реализовать паттерн наблюдателя с CDI Events?

1

В моей системе у меня есть 2 сценария:

  1. Компонент X производит события, которые наблюдаются Y.
  2. Компонент X производит события, которые должны наблюдаться компонентом F. F решает, следует ли игнорировать или модифицировать событие и передавать его в Y.

Можно ли реализовать его с событиями CDI?

Теги:
events
cdi
observer-pattern

2 ответа

1

Возможности CDI только для широковещательных стилей/тематических событий. В CDI нет фильтрации событий.

Единственный способ, которым я могу думать, сделать эквивалент, - это придумать квалификатор. Возможно, F может @Observes @A @B SomeObject тогда как Y может @Observes @C @B SomeObject. Когда F получает событие, он может @C @B использования @C @B в качестве квалификаторов.

  • 0
    Это хорошее решение, но оно работает, когда мы реализуем только один сценарий. Я хотел бы реализовать оба и включить один с конфигурацией.
  • 0
    Конфигурация полностью зависит от вас.
0

Я попытался бы создать какой-то прокси-сервер между производителями событий и потребителями событий:

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){
    }
}

Но, пожалуйста, помните, что это всего лишь псевдокод.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню