- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您可以在下面看到我的示例类。
基本上,我想使用 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.
关于java - 轴突框架 : How to rollback in the domain_event_entry table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57854063/
我是一名优秀的程序员,十分优秀!