Аксон - Как получить новый номер версии объекта в CommandHandler? - PullRequest
0 голосов
/ 04 октября 2018

В настоящее время я пишу распределенное приложение с микросервисной архитектурой.
Для этого я применяю шаблон CQRS и источник событий с помощью axon framework .Таким образом, данные в конечном итоге непротиворечивы.
И сторона записи, и сторона чтения доступны через HTTP;ОТДЫХАЕТ конкретно.

Первоначальная проблема:
После обновления / создания объекта пользователь [1] должен иметь возможность видеть результаты.Поскольку события обрабатываются асинхронно, клиент / пользовательский интерфейс не знает, когда сущность действительно обновлена ​​(или создана).Поэтому, когда клиент выбирает данные после отправки запроса на обновление, но до обработки события, неизмененные данные возвращаются.Поэтому пользователь может подумать, что приложение сломано и / или отправляет новый запрос.

Попытка решения:
При поиске решения проблемы чтения после записи я наткнулся на эту запись в блоге .
Предлагаетсявернуть новую версию объекта в ответе на запись.Затем клиент может запросить данные с ожидаемой версией объекта (как заголовок Expect ).Если фактическая версия равна или превышает ожидаемую версию, данные возвращаются.Или же возвращается пустой ответ с заголовком Retry-After .

Проблема:

Когда клиент отправляет запрос UpdateFooна стороне записи приложение отправляет соответствующую команду UpdateFooCommand через CommandGateway.Команда обрабатывается агрегатом сущностей, который публикует FooUpdatedEvent.Сторона чтения получает это событие и обновляет свое представление объекта, к которому можно получить доступ через интерфейс REST стороны чтения.
Это контролируется платформой аксона.Обработчики отмечены @CommandHandler и @EventSourcingHandler соответственно.
Теперь: как я могу получить доступ к новому номеру версии затронутого объекта в CommandHandler, чтобы этот номер можно было вернуть в ответе на обновление?

Заранее спасибо

[1] Не только пользователям.Могут быть и другие клиенты.

1 Ответ

0 голосов
/ 05 октября 2018

вы можете использовать AggregateLifecycle.getVersion() из вашей совокупности.Вы можете вернуть это значение как часть результатов вашей команды и передать эту информацию при выполнении запроса.Если в запросе еще нет этого номера версии информации агрегата, вы можете (подождать и) повторить попытку.

...