【问题标题】:How can I ensure non concurrent execution for all derived commands/events spanned by an Axon Saga handler?如何确保 Axon Saga 处理程序跨越的所有派生命令/事件的非并发执行?
【发布时间】:2020-06-19 15:11:20
【问题描述】:

我有一个 Saga,它创建了一个创建 Item 聚合的命令。

我需要在创建聚合后执行一些其他逻辑,所以我有一个处理程序来处理 ItemCreatedEvent。

在 Saga 实例锁定下似乎没有执行 ItemEventsHandler 逻辑。所以我得到了另一个与 Saga 相关的事件,它与处理程序同时执行。

有没有办法强制处理程序成为同一个 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
    }
}

【问题讨论】:

  • 我不完全理解为什么ItemCreatedEvent 需要在与OrderSaga 相同的锁中处理。您能否详细说明@matpiera 的用例是什么?
  • ItemEventsHandler 需要以与 Saga 相同的顺序处理事件。它与遗留系统对话。我现在正在做的是将Item 作为订单的AggregateMember。 @Steven 这有意义吗?
  • 拥有Order 聚合包含Item 实体对我@matpiera 来说听起来很合乎逻辑,尽管它总是“取决于”域是否有意义。此外,尽管您声明事件需要以相同的顺序处理,但这仍然不能解释为什么这在您的系统中是必需的。在任何时候,事件处理都应该被视为(概念上)异步的。因此,对哪个组件何时处理我不建议的事情强加一个命令,除非对此事有非常明确和具体的领域要求。
  • 谢谢@Steven。我已经修改了域,这里的顺序似乎不相关,因为消息的顺序自然是正确的。
  • 这是个好新的@matpiera。在这里回答您自己的问题可能会有所帮助,以便其他人在遇到相同问题时可以按照您的推论。 ;-)

标签: java axon saga


【解决方案1】:

事实证明,在ItemEventsHandler 处理该事件时,订单并不相关。 潜在的并发性被证明是不可能的,因为第二条消息是在第一条消息已经完全处理后才产生的。

我还发现,如果需要这种非并发执行,我可以将事件循环回 Saga 处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多