Axon — самый простой способ сделать проекцию во время запроса

Обычно у меня будет 5-6 событий на совокупность, и я бы не хотел хранить прогнозы в БД. Что было бы самым простым способом всегда делать проекцию представления во время запроса?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
530
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Короткий ответ на это заключается в том, что нет простого/быстрого способа сделать это.

Тем не менее, безусловно, можно реализовать настройку «воспроизведение заданных событий во время запроса».

То, что я предлагаю вам сделать, состоит из нескольких шагов:

  1. Создайте модель запроса, которую вы хотите вернуть, которая может обрабатывать события (используйте @EventHandler аннотированные методы в модели)
  2. Создайте компонент, который может обрабатывать запрос, который вернет модель запроса на первом этапе (используйте для этого аннотированный метод @QueryHandler.
  3. Компонент обработки запросов должен иметь возможность извлекать поток событий из EventStore. Если это основано на aggregateIdentifier, используйте метод EventStore#readEvents(String). Если вам нужен весь поток событий, вам нужно использовать метод StreamableMessageSource#openStream(TrackingToken) (примечание: интерфейс EventStore реализует StreamableMessageSource)
  4. После обработки запроса создайте AnnotationEventHandlerAdapter, предоставив ему новый экземпляр вашей модели запроса.
  5. Для каждого события в потоке событий, который вы создали в пункте 3, вызовите метод AnnotationEventHandlerAdapter#handle(EventMessage). Этот метод будет вызывать аннотированные методы @EventHandler для вашего объекта модели запроса.
  6. Если поток исчерпан, вы гарантированно обработаете все необходимые события для вашей модели запроса. Таким образом, теперь вы можете вернуть модель запроса

Итак, опять же, я не думаю, что это слишком тривиально, легко или быстро настроить. Кроме того, в шаге 3 есть небольшая оговорка. Получение потока данного Агрегата на основе Идентификатора Агрегата выполняется довольно быстро/кратко, поскольку Агрегат обычно не имеет большого количества событий.

Однако извлечение потока событий на основе TrackingToken, которое вам понадобится, если ваша модель запроса охватывает несколько агрегатов, может гарантировать, что вы извлечете хранилище событий весь для создания экземпляров ваших моделей на лету. Конечно, вы можете точно настроить момент времени, когда вы хотите, чтобы поток событий возвращал события, поскольку вы имеете дело с TrackingToken, но изменения довольно велики, вы будете неполными и относительно медленными.

Однако вы заявили, что хотите получить события для данного совокупного идентификатора. Таким образом, я думаю, что это должно быть работоспособным решением в вашем сценарии.

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

спасибо за описание способа сделать это. Похоже, что-то, что вообще не поддерживается в Axon. Проблема с этой реализацией заключается в характере событий - проекции должны содержать все события (в основном проекция имеет только List<Event> eventHistory), что делает непрактичным хранение проекций (поскольку на самом деле это будут дублирующиеся события).

Bojan Vukasovic 29.05.2019 15:54

Исходя из определения хранилища событий, обычно следует ожидать два способа получения событий из него: один для каждого совокупного идентификатора, а два — для потока событий в данный момент времени. Следовательно, мой аргумент о том, что это будет хорошо работать для View per Aggregate Id, но не так хорошо для других перестановок. Не совсем уверен, является ли это отсутствующей функцией или просто соответствует определению магазина событий. В любом случае, вы всегда можете отправить запрос на добавление функций для Axon: github.com/AxonFramework/AxonFramework/вопросы.

Steven 31.05.2019 11:24

Другие вопросы по теме