【发布时间】: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。在这里回答您自己的问题可能会有所帮助,以便其他人在遇到相同问题时可以按照您的推论。 ;-)