【问题标题】:Axon Framework: Change processing order between @EventHandler and @EventSourcingHandlerAxon 框架:更改 @EventHandler 和 @EventSourcingHandler 之间的处理顺序
【发布时间】:2019-09-09 09:05:54
【问题描述】:

我的问题是,对于同一给定事件,我如何更改 @EventHandler@EventSourcingHandler 之间的处理顺序。我在 Aggregate 类中有 @EventSourcinHandler 方法,在外部类中有 @EventHandler 。如果我触发导致所述事件事件的命令,我的代码将像这样运行:

  1. @EventSourcingHandler
  2. @EventHandler

我想把这个顺序改成这样:

  1. @EventHandler
  2. @EventSourcingHandler

我尝试了 @Order@ProcessingGroup 注释,但在调整顺序方面这些都对我不起作用。

这是我的聚合实现:

@Aggregate
@Getter
@Setter
@NoArgsConstructor
@Order(2)
@ProcessingGroup("template")
@Component
public class TemplateAggregate {

  private static final transient Logger logger = LoggerFactory.getLogger(TemplateAggregate.class);
  @AggregateIdentifier
  private String templateId;

  private LocalDate createdAt;

  private String createdBy;

  private String description;

  private LocalDate modifiedAt;

  private String modifiedBy;

  private String name;

  private LocalDate validFrom;

  private LocalDate validTo;

  private File file;

  private String fileName;

  private long fileSize;

  private LocalDate fileDate;

  private String fileUploader;

  @CommandHandler
  public TemplateAggregate(CreateTemplateCommand cmd) {
    AggregateLifecycle.apply(new TemplateCreatedEvent(cmd));
  }

  @CommandHandler
  public void handle(ModifyTemplateCommand cmd) {
    AggregateLifecycle.apply(new TemplateModifiedEvent(cmd));
  }

  @EventSourcingHandler
  public void on(TemplateCreatedEvent event) {
    this.templateId = event.getTemplateId();
    this.createdAt = event.getCreatedAt();
    this.createdBy = event.getCreatedBy();
    this.description = event.getDescription();
    this.name = event.getName();
    this.validFrom = event.getValidFrom();
    this.validTo = event.getValidTo();
    this.file = event.getFile();
    this.fileName = event.getFileName();
    this.fileSize = event.getFileSize();
    this.fileDate = event.getFileDate();
    this.fileUploader = event.getFileUploader();
    logger.info("TemplateAggregate - TemplateCreatedEvent");
  }

  @EventSourcingHandler
  public void on(TemplateModifiedEvent event) {
    this.templateId = event.getTemplateId();
    this.createdAt = event.getCreatedAt();
    this.createdBy = event.getCreatedBy();
    this.description = event.getDescription();
    this.name = event.getName();
    this.validFrom = event.getValidFrom();
    this.validTo = event.getValidTo();
    this.file = event.getFile();
    this.fileName = event.getFileName();
    this.fileSize = event.getFileSize();
    this.fileDate = event.getFileDate();
    this.fileUploader = event.getFileUploader();
    this.modifiedAt = event.getModifiedAt();
    this.modifiedBy = event.getModifiedBy();
    logger.info("TemplateAggregate - TemplateModifiedEvent");
  }

}

我的外部 EventHandler 类:

@Service
@Order(1)
@ProcessingGroup("template")
@Component
public class TemplateCreatedEventHandler {

  private static final transient Logger logger =
      LoggerFactory.getLogger(TemplateCreatedEventHandler.class);

  @Autowired
  private TemplateRepository templateRepository;

  @Transactional
  @EventHandler
  public void on(TemplateCreatedEvent event) {
    templateRepository.save(new TemplateQueryEntity(event));
    logger.info("EventHandler - TemplateCreatedEvent");
  }

}

我想这样做,因为我想先将所有内容持久化在我的数据库中,所以在此期间如果我遇到异常,Axon 无法持久化domain_event_entry 表。

【问题讨论】:

    标签: java spring-boot axon


    【解决方案1】:

    @EventSourcingHandler 用于事件溯源目的。它在两个不同的时刻更新聚合的状态:第一次应用事件时,在这种情况下,它会作为 apply() 方法的一部分立即调用,其次是当聚合状态根据其事件重建时。

    这意味着聚合中的@EventSourcingHandler总是在任何外部事件处理程序能够接收事件之前被调用。这不是你可以改变的,坦率地说,我敢肯定这也不是你想要的。

    您提到您希望确保“首先将所有内容持久保存在我的数据库中”。如果你想以事件驱动的方式工作,这是“放手”的第一原则。首要的事实是你的事件。您首先要坚持这些。然后,作为这些事件的结果,您更新其他表,这些表提供视图、生成其他副作用等。

    如果出于任何原因,您确实想要确保您的视图模型和事件的事务更新,您可以将包含您的外部事件处理程序的处理组分配给订阅处理器。这使您能够在处理命令(并发布事件)的同一事务中调用事件处理程序。

    另外,我注意到您的聚合包含很多字段。通常,聚合只需要包含实际用于对传入命令进行决策的字段。命令模型中聚合根的 Getter(和 Setter,就此而言)通常是一种设计气味,因为它们根本不需要专注于公开信息。 聚合上的 @Order@ProcessingGroup@Component 注释没有任何用途,可以删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多