当前位置: 首页 > 知识库问答 >
问题:

Axon框架:如何在domain_event_entry表中回滚

晁文斌
2023-03-14

您可以在下面看到我的示例类。

基本上,我希望使用Axon的domain_event_entry表来存储事件,并使用我自己的实体表来存储实体。我知道,如果我激发在聚合中处理的createTemplateCommand,将发布一个事件,之后它将转到@eventsourcinghandler,Axon将在其domain_event_entry表中持久化该事件。

如何回滚domain_event_entry表,还是应该为此使用补偿事件?

@Aggregate
@Getter
@Setter
@NoArgsConstructor
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
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");
    throw new RuntimeException();
  }



}

共有1个答案

施冠玉
2023-03-14

这是跟踪事件处理器的正确和预期行为。事件存储是真理的来源,一旦您的TemplateCreatedEvent在事件存储中持久化,这意味着“模板创建的事件已经发生”。

您的事件处理器无法处理该事件,并引发和异常。这意味着TemplateCreatedEventHandler中的事务将回滚。这并不意味着历史突然被改变;您的事件处理程序不能决定TemplateCreatedEvent没有发生。

当您稍后为TemplateCreatedEventHandler推出一个修复程序以便它能够处理该事件(移除RuntimeException)时,处理程序将处理该事件并持久化该实体。

https://docs.axoniq.io/reference-guide/configuring-infrastructure-components/event-processings/event-processors#处理期间的异常

 类似资料:
  • 任何关于如何做到这一点的文件都将不胜感激。 提前谢了。

  • 我使用的Axon框架没有Axon服务器和Spring Boot自动配置。我有一个H2数据库,使用Spring auto配置。 谢了。

  • 让我们举一个电子邮件传奇的例子:当一个用户注册时,我们创建一个发布UserRegisterEvent的用户聚合,一个传奇将被创建,这个传奇负责确保注册电子邮件被发送给用户(电子邮件可能包含验证密钥、欢迎消息等)。 我们是否应该使用: > 用try/catch->缩放吗? 使用deadline是因为我们只使用“send”,而不处理命令的最终错误,这可能是发送失败(其他服务关闭,等等) 其它的呢? 还

  • 我试图使用Axon 4.1+中的在一个2 JVM node K8集群上重播事件。虽然我将它设置为清理事件,但它只从一个节点中提取事件,而另一个节点继续运行,因为它的跟踪事件仍然是活动的。 我如何在所有JVM上同时禁用它,以便它能够正确地重播?然后启用所有这些命令,继续处理命令。 我尝试通过这段代码增加线程,这导致了另一个问题,即现有的令牌在InitialSemgmentsCount中永远不会增加,

  • exception$10(errorcode.java:88)在org.axonframework.axonserver.connector.errorcode.convert(errorcode.java:182)在org.axonframework.axonserver.connector.command.command.command.axonservercommandbus$1.onnex