使用事件计划程序不会触发聚合中的事件处理程序



当我通过命令触发计划事件时,我看不到预期的事件处理程序触发器。我正在尝试隔离 Saga 中的一次性业务事务,同时仍然允许聚合来自事件以便能够重播状态更改。


我已经配置了以下SimpleEventScheduler

@Bean
public SimpleEventScheduler simpleEventScheduler(EventBus eventBus) {
return SimpleEventScheduler.builder()
.eventBus(eventBus)
.scheduledExecutorService(scheduledExecutorService())
.build();
}
private ScheduledExecutorService scheduledExecutorService() {
return Executors.unconfigurableScheduledExecutorService(Executors.newSingleThreadScheduledExecutor());
}

我有一个聚合建模,该聚合具有@CommandHandler

@CommandHandler
public Letter(ScheduleLetterCommand cmd, EventScheduler scheduler) {
String id = cmd.getLetterId();
log.info("Received schedule command for letter id {}", id);
ScheduleToken scheduleToken = scheduler.schedule(Duration.ofSeconds(5), new BeginSendLetterEvent(id, LetterEventType.BEGIN_SEND));
AggregateLifecycle.apply(new LetterScheduledEvent(id, LetterEventType.SCHEDULED, scheduleToken));
}

和两个@EventSourcingHandler

@EventSourcingHandler
public void on(BeginSendLetterEvent event) {
log.info("Letter sending process started {} {}", event.getLetterId(), event.getEventType());
scheduleToken = null;
}
@EventSourcingHandler
public void on(LetterSentEvent event) {
log.info("Letter sent {} {}", event.getLetterId(), event.getEventType());
this.sent = true;
}

我有一个传奇,当BeginSendLetterEvent被触发并发布LetterSentEvent时,它会做一些"业务逻辑"。


@Saga
@Slf4j
public class LetterSchedulingSaga {
private EventGateway eventGateway;
public LetterSchedulingSaga() {
//Axon requires empty constructor
}
@StartSaga
@EndSaga
@SagaEventHandler(associationProperty = "letterId")
public void handle(BeginSendLetterEvent event) {
log.info("Sending letter {}...", event.getLetterId());
eventGateway.publish(new LetterSentEvent(event.getLetterId(), LetterEventType.SENT));
}
@Autowired
public void setEventGateway(EventGateway eventGateway) {
this.eventGateway = eventGateway;
}
}

这是我的输出:

com.flsh.web.LetterScheduler            : Received request to schedule letter
com.flsh.web.LetterScheduler            : Finished request to schedule letter
com.flsh.axon.Letter                    : Received schedule command for letter id b7338082-e0e1-4ba0-b137-c7ff92afe3a1
com.flsh.axon.Letter                    : LetterScheduledEvent b7338082-e0e1-4ba0-b137-c7ff92afe3a1 SCHEDULED
com.flsh.axon.LetterSchedulingSaga      : Sending letter b7338082-e0e1-4ba0-b137-c7ff92afe3a1...

问题是我根本没有看到上述两个事件处理程序被触发。有人能看到我在这里做错了什么吗?:)任何帮助将不胜感激...

如果这是使用 Sagas 和事件处理程序的错误方式,请告诉我。我意识到我的基本示例并不能促进一个好的领域模型。

@GoldFish,对问题的简短回答是,您希望在命令模型中处理事件。

Axon 术语中的聚合是一个命令处理组件,因此在考虑 CQRS 时是命令模型的一部分。 因此,它处理命令消息并验证是否可以执行给定的操作(read:命令(。如果验证结果为"是",则您最终将在给定聚合实例的生命周期中发布事件。

可以引入聚合@EventSourcingHandler注释方法是"根据聚合实例自己的事件获取聚合实例"。

话虽如此,您可以预期聚合永远不会直接处理来自任何其他源的事件,而不是它自己的事件。

EventScheduler是事件的外部源,就像另一个聚合的事件在获取时一样。因此,它们将被忽略为总数。

EventScheduler将在后期阶段发布事件,以便事件处理组件(例如 Saga 实例(可以处理该事件。 如果要计划应为特定聚合或 saga 实例执行某些操作,则应改为查看DeadlineManager

无论如何,对于您要实现的目标(我相信(正在从 saga 触发聚合中的操作,您应该使用命令消息,因为聚合只能处理命令消息。

最新更新