【发布时间】:2019-09-09 09:05:54
【问题描述】:
我的问题是,对于同一给定事件,我如何更改 @EventHandler 和 @EventSourcingHandler 之间的处理顺序。我在 Aggregate 类中有 @EventSourcinHandler 方法,在外部类中有 @EventHandler 。如果我触发导致所述事件事件的命令,我的代码将像这样运行:
@EventSourcingHandler@EventHandler
我想把这个顺序改成这样:
@EventHandler@EventSourcingHandler
我尝试了 @Order 和 @ProcessingGroup 注释,但在调整顺序方面这些都对我不起作用。
这是我的聚合实现:
@Aggregate
@Getter
@Setter
@NoArgsConstructor
@Order(2)
@ProcessingGroup("template")
@Component
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
@Order(1)
@ProcessingGroup("template")
@Component
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");
}
}
我想这样做,因为我想先将所有内容持久化在我的数据库中,所以在此期间如果我遇到异常,Axon 无法持久化domain_event_entry 表。
【问题讨论】:
标签: java spring-boot axon