您可以在下面看到我的示例类。
基本上,我希望使用Axon的domain_event_entry
表来存储事件,并使用我自己的实体表来存储实体。我知道,如果我激发在聚合中处理的createTemplateCommand
,将发布一个事件,之后它将转到@eventsourcinghandler
,Axon将在其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)时,处理程序将处理该事件并持久化该实体。
https://docs.axoniq.io/reference-guide/configuring-infrastructure-components/event-processings/event-processors#处理期间的异常
任何关于如何做到这一点的文件都将不胜感激。 提前谢了。
我使用的Axon框架没有Axon服务器和Spring Boot自动配置。我有一个H2数据库,使用Spring auto配置。 谢了。
让我们举一个电子邮件传奇的例子:当一个用户注册时,我们创建一个发布UserRegisterEvent的用户聚合,一个传奇将被创建,这个传奇负责确保注册电子邮件被发送给用户(电子邮件可能包含验证密钥、欢迎消息等)。 我们是否应该使用: > 用try/catch->缩放吗? 使用deadline是因为我们只使用“send”,而不处理命令的最终错误,这可能是发送失败(其他服务关闭,等等) 其它的呢? 还
我试图使用Axon 4.1+中的在一个2 JVM node K8集群上重播事件。虽然我将它设置为清理事件,但它只从一个节点中提取事件,而另一个节点继续运行,因为它的跟踪事件仍然是活动的。 我如何在所有JVM上同时禁用它,以便它能够正确地重播?然后启用所有这些命令,继续处理命令。 我尝试通过这段代码增加线程,这导致了另一个问题,即现有的令牌在InitialSemgmentsCount中永远不会增加,
exception$10(errorcode.java:88)在org.axonframework.axonserver.connector.errorcode.convert(errorcode.java:182)在org.axonframework.axonserver.connector.command.command.command.axonservercommandbus$1.onnex