首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Axon FrameWork:如何在Axon表中回滚

Axon FrameWork:如何在Axon表中回滚
EN

Stack Overflow用户
提问于 2019-09-09 20:25:50
回答 1查看 339关注 0票数 1

你可以在下面看到我的样例类。

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

在这一部分之后,它将转到我的外部@EventHandler,在那里我希望从事件中持久化我的实体。如您所见,我抛出了一个RunTimeException,因为我想要模拟回滚。它将在我自己的表中回滚,但在Axon的domain_event_entry表中会有事件。因此,我将使我的实体表为空,并使我的Axon表中包含TemplateCreatedEvent,但我还想回滚domain_event_entry

我如何回滚domain_event_entry表,或者我应该为此使用补偿事件?

代码语言:javascript
复制
@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类:

代码语言:javascript
复制
@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();
  }



}
EN

回答 1

Stack Overflow用户

发布于 2019-09-10 01:33:00

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

您的事件处理器无法处理事件,并抛出和异常。这意味着TemplateCreatedEventHandler中的事务被回滚。这并不意味着历史记录突然改变了;您的事件处理程序不会决定是否发生了TemplateCreatedEvent。

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

如果此行为不是您想要的,则可以选择使用订阅事件处理器。

SubscribingEventProcessor将异常冒泡到事件的发布组件,允许它相应地处理它。

https://docs.axoniq.io/reference-guide/configuring-infrastructure-components/event-processing/event-processors#exceptions-during-processing

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57854063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档