gpt4 book ai didi

java - 轴突框架 : How to rollback in the domain_event_entry table

转载 作者:行者123 更新时间:2023-11-29 04:07:16 24 4
gpt4 key购买 nike

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

基本上,我想使用 Axon 的 domain_event_entry 表来存储事件,并使用我自己的实体表来存储实体。我知道如果我触发一个在聚合中处理的 CreateTemplateCommand 将发布一个事件,然后它将转到 @EventSourcingHandler,Axon 将在其中保留他的 domain_event_entry 表中的事件。

在这部分之后,它将转到我的外部 @EventHandler,我想在其中保留事件中的实体。如您所见,我抛出一个 RunTimeException,因为我想模拟回滚。它会在我自己的表中回滚,但在 Axon 的 domain_event_entry 表中会有事件。所以我会让我的实体表为空,我的 Axon 表中有 TemplateCreatedEvent,但我也想回滚 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();
}



}

最佳答案

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

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

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

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

The SubscribingEventProcessor will have the exception bubble up to the publishing component of the Event, allowing it to deal with it, accordingly.

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

关于java - 轴突框架 : How to rollback in the domain_event_entry table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57854063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com