Использование нескольких агрегатов в одном обработчике команд

При условии, что у меня есть 2 агрегата, заказ и клиент, а также OrderPayCommand в обработчике, он проверяет статус заказа и баланс клиента. Если все прошло успешно, он отправит событие OrderPaidEvent, которое будет обработано агрегатом Customer для обновления баланса.

Итак, как я могу проверить состояние двух агрегатов в одном обработчике команд? Итак, я использую это неправильно?


person Mavlarn    schedule 28.05.2018    source источник


Ответы (1)


В Axon Framework команда может быть обработана только одной @CommandHandler аннотированной функцией. Таким образом, только один агрегат будет отвечать за выполнение этого действия.

Если вы организуете действия между несколькими агрегатами, это обычно означает, что вы можете использовать Saga. Сага в Axon будет иметь ассоциации с несколькими агрегатами, что позволяет вам прослушивать события от всех этих агрегатов и отдавать им команды. Таким образом, это позволяет вам обрабатывать определенные события, такие как, например, OrderPaidEvent, и после обработки этого в вашей саге вы можете выдать AdjustCustomerBalanceCommand агрегату Customer, с которым вы связаны.

Вкратце: команда всегда обрабатывается только одним объектом Aggregate / Entity. Для организации действий между агрегатами я бы посоветовал взглянуть на Saga.

person Steven    schedule 28.05.2018
comment
Поэтому мне нужно проверить состояние порядка в обработчике команд заказа и применить OrderPaidEvent , а в OrderPaidEvent отправить команду типа AdjustCustomerBalanceCommand . Я прав? И вот что я сделал сейчас. Я просто подумал, что это не очень хорошо для проверки одного условия. - person Mavlarn; 28.05.2018
comment
Да, в аннотированной @EventHandler функции для OrderPaidEvent вы могли бы опубликовать AdjustCustomerBalanceCommand. Обратите внимание, что вы не должны делать это из агрегата, а в отдельном компоненте. Этот компонент может быть сагой, если вам требуется более детализированное состояние и ассоциации, но с тем же успехом может быть и обычный (Spring) Bean, который обрабатывает события и в результате публикует команду. - person Steven; 29.05.2018