Как я могу с помощью Axon повторно инициализировать какое-то значение с той же первой InitAvailableQuantityCommand? - PullRequest
0 голосов
/ 24 октября 2018

предположим, у нас есть запас.этот запас должен сохранять идентификатор продукта и доступное количество.пользователь этого запаса может часто обновлять (InitAvailableQuantityCommand) доступное количество.если какой-либо продукт был продан, наша система получит soldEvent (DecreaseAvailableQuantityCommand), и доступное количество для проданного продукта должно быть уменьшено.

это работает хорошо с совокупным показателем ниже, до одной вещи, если я попытаюсь снова повторитьинициализировать запас с помощью InitAvailableQuantityCommand, событие будет проигнорировано, и будет выдано сообщение об ошибке

Событие для агрегата [3333] в последовательности [0] уже вставлено "

Чтоя пытаюсь добиться следующего:

  1. InitAvailableQuantityCommand (productId = 1, количество = 10)
  2. DecreaseAvailableQuantityCommand (productId = 1, количество = 1)
  3. DecreaseAvailableQuantComantproductId = 1, количество = 1)
  4. теперь у нас есть еще 8 доступных продуктов.
  5. , и в этот момент пользователь повторно инициализирует запас с 20 доступными продуктами для productId 1. пользователь будетотправьте новый InitAvailableQuantityCommand (productId = 1, количество = 20), и в этот момент он не работает и не работает.

Что я не так делаю?

thx.

@NoArgsConstructor
@Aggregate
@Data
public class AvailableQuantityAggregate {

private String partnerId;
private String productId;

@AggregateIdentifier
private String productVariationId;
private int quantity;

@CommandHandler
public AvailableQuantityAggregate(InitAvailableQuantityCommand cmd) {
    final ApplyMore apply = AggregateLifecycle.apply(AvailableQuantityInitializedEvent.builder()
                                                             .partnerId(cmd.getPartnerId())
                                                             .productId(cmd.getProductId())
                                                             .productVariationId(cmd.getProductVariationId())
                                                             .quantity(cmd.getQuantity())
                                                             .build());
}

@CommandHandler
public void handle(DecreaseAvailableQuantityCommand cmd) {
    AggregateLifecycle.apply(AvailableQuantityDecreasedEvent.builder()
                                     .productVariationId(cmd.getProductVariationId())
                                     .quantity(cmd.getQuantity())
                                     .build());
}

@EventSourcingHandler
protected void on(AvailableQuantityInitializedEvent event) {
    this.productVariationId = event.getProductVariationId();
    this.partnerId = event.getPartnerId();
    this.productId = event.getProductId();
    this.quantity = event.getQuantity();
}

@EventSourcingHandler
protected void on(AvailableQuantityDecreasedEvent event) {
    this.quantity = this.quantity-event.getQuantity();
}
}

Ответы [ 2 ]

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

Судя по вашему фрагменту кода, InitAvailableQuantityCommand обрабатывается конструктором.Это означает, что Axon ожидает создания нового экземпляра агрегата.Но так как вы ожидаете загрузки экземпляра, возникает коллизия идентификаторов (к счастью).Что вам нужно сделать, это создать другую команду, которая содержит ту же информацию, но обрабатывается методом экземпляра.В любом случае это может быть то, что вы хотите сделать, потому что между первоначальной инициализацией и «сбросом» существует концептуальное / функциональное отличие.

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

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

InitAvailableQuantityCommand создает агрегат.Агрегаты по своей природе имеют идентичность.Таким образом, имеется Совокупный идентификатор для обозначения того, кем / чем он является.Когда вы используете источник событий, который по умолчанию используется в Axon, хранилище событий гарантирует, что вы не не добавите события с одинаковым совокупным идентификатором и порядковым номером.Однако, когда вы публикуете InitAvailableQuantityCommand во второй раз, вы указываете платформе опубликовать событие с тем же агрегированным идентификатором и порядковым номером.

Следовательно, ваше решение для моделирования должно немного отличаться.Действие (иначе, команда) создания агрегата отличается от его сброса.Поэтому я бы предложил добавить другую команду для сброса вашего агрегата до его начальных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...