你可以在下面看到我的样例类。
基本上,我希望使用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();
}
}发布于 2019-09-10 01:33:00
这是跟踪事件处理器的正确和预期行为。事件存储是事实的来源,一旦您的TemplateCreatedEvent持久化在事件存储中,这意味着‘模板创建的事件已经发生’。
您的事件处理器无法处理事件,并抛出和异常。这意味着TemplateCreatedEventHandler中的事务被回滚。这并不意味着历史记录突然改变了;您的事件处理程序不会决定是否发生了TemplateCreatedEvent。
当您稍后推出TemplateCreatedEventHandler的修复程序以便它能够处理该事件(删除RuntimeException)时,处理程序将处理该事件并持久化该实体。
如果此行为不是您想要的,则可以选择使用订阅事件处理器。
SubscribingEventProcessor将异常冒泡到事件的发布组件,允许它相应地处理它。
https://stackoverflow.com/questions/57854063
复制相似问题