Как я могу гарантировать непараллельное выполнение всех производных команд / событий, охватываемых обработчиком Axon Saga? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть сага, которая создает команду, которая создает агрегат Item.

Мне нужно выполнить некоторые другие logi c после создания агрегатов, поэтому у меня есть обработчик для работы с ItemCreatedEvent .

Кажется, что logi c ItemEventsHandler не выполняется при блокировке экземпляра Saga. Итак, я получаю другое событие, связанное с сагой, выполняющейся одновременно с обработчиком.

Есть ли способ заставить обработчик быть частью обработки / выполнения одного и того же экземпляра саги? Я что-то упустил?

Использование axon 4.3.3 с пружинным чехлом.

@Saga
public class OrderSaga {

    @Inject
    private transient CommandGateway commandGateway;

    @StartSaga
    @SagaEventHandler(associationProperty = "executionId")
    public void handle(OrderCreatedEvent event) {

        event.items.forEach(item -> {
            // Associate to Saga
            SagaLifecycle.associateWith("itemId", item.id);
            commandGateway.sendAndWait(new CreateItemCommand(event.groupId, event.schemaId, item));
        });
    }
}


@Aggregate
public class ItemAggregate {

    @AggregateIdentifier
    private String id;
    private String groupId;
        ...

    @CommandHandler
    public ItemAggregate on(CreateItemCommand command) {
        AggregateLifecycle.apply(new ItemCreatedEvent(
                command.id,
                command.groupId,
                ...));
    }

    @EventSourcingHandler
    protected void on(ItemCreatedEvent event) {
        this.id = event.id;
        this.groupId = event.groupId;
        ...
    }
}

@Service
public class ItemEventsHandler {

    @EventHandler
    protected void on(ItemCreatedEvent event) {
        // This needs to be executed under the Saga locking
    }
}

1 Ответ

0 голосов
/ 03 июля 2020

Оказалось, что порядок не актуален в то время, когда ItemEventsHandler обрабатывает событие. Потенциальный параллелизм оказался невозможным, поскольку второе сообщение создается только после того, как первое уже было полностью обработано.

Я также обнаружил, что в случае необходимости этого непараллельного выполнения я мог бы oop вернуть события в обработчик Saga.

...