Аксон Как я могу добавить прослушиватель / перехватчик событий для перехвата событий, прежде чем они достигнут своих обработчиков? - PullRequest
1 голос
/ 22 мая 2019

У меня есть класс проекции (для построения модели чтения), и я хочу добавить перехватчик для его событий таким образом, чтобы, если переданный в событии идентификатор приводил к нулевому объекту (не существующему в моей БД), тоЯ хочу заблокировать его, в противном случае пропустить его.

Таким образом, я избегу добавления нулевой проверки в КАЖДОМ обработчике событий.

@EventHandler
public void onEvent(Event event) {
    Entity entity = getEntity(event.getId());
    if(entity!=null){        // what I don't want to add on every event handler
        dostuff();
    }
}

Я обнаружил, что аксон предоставляет интерфейс с именем * 1006.* EventListener , но я не уверен, как с ним работать, и я не уверен, будет ли это перехватывать ВСЕ мои события или я смогу перехватить выбранные события.

Существуетнигде нет упоминания об этом интерфейсе, но в официальной документации (без реальных примеров или около того)

1 Ответ

1 голос
/ 23 мая 2019

Вы правы в том, что Справочное руководство все еще нуждается в некоторых улучшениях @ bleh10 - могу вас заверить, над ними работают, команда просто разбросана относительно слабо.

В отсутствиепример поиска, думаю, я могу дать вам некоторые рекомендации.

То, что вы ищете, - это реализация MessageHandlerInterceptor, специально для типа EventMessage.Как следует из названия, он перехватывает сообщения перед обработкой, что прекрасно соответствует поставленному вопросу.

Во-вторых, вам, очевидно, нужно место для их настройки.В приложении Axon техническим аспектом доставки событий для ваших @EventHandler аннотированных методов является обработчик событий.Таким образом, он отвечает за обеспечение того, чтобы сообщения событий, проходящие через него, перехватывались по желанию.

Следовательно, место для настройки вашего EventMessage MessageHandlerInterceptor находится на реализации EventProcessor, которую вы используете.выбран.Чтобы обеспечить заданный компонент обработки событий в определенном EventProcessor, вы можете указать его группу обработки, пометив класс аннотацией @ProcessingGroup.

С этого момента вы можете легко настроить конкретные свойства дляваш обработчик событий, используя EventProcessingConfigurer.Более конкретно, я бы предложил использовать для этого метод EventProcessingConfigurer#registerHandlerInterceptor(String, Function<Configuration, MessageHandlerInterceptor<? super EventMessage<?>>>).

Первый параметр String предназначен для описания имени вашей группы обработки.Второй - Function, который получает Аксон Configuration и должен выдать MessageHandlerInterceptor, который может иметь дело с классом EventMessage.

Надеюсь, это поможет вам!

...