如何解决Axon Command 传递给 EventHandler
我正在尝试向 Command
发送 Aggregate
。当我将 Command
发送到 Aggregate
时,会在 EventHandler
方法之前调用 Aggregate 的 CommandHanlder
方法。
我不知道这怎么可能,因为我只想调用 CommandHandler
方法。
首先我发送 IssueCardCommand
来创建礼品卡 Aggregate
并发送 ReimburseCardCommand
来调用 AggregateMember 的 CommandHandler
方法。
@Autowired
CommandGateway cm;
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
String cardId = UUID.randomUUID().toString();
int transactionValue = (int) (Math.random() * 100);
cm.sendAndWait(new IssueCardCommand(cardId,transactionValue));
cm.sendAndWait(new ReimburseCardCommand(cardId,transactionValue));
};
}
这是我想要调用的 GiftCardTransaction
(Aggregates' child entity) CommandHandler
方法
@CommandHandler
public void handle(ReimburseCardCommand cmd) {
log.info("GiftCardTransaction Handler " + transactionId);
log.info(reimbursed);
// if (reimbursed) {
// throw new IllegalStateException("Transaction already reimbursed");
// }
apply(new CardReimbursedEvent(cmd.getTransactionId(),transactionId,transactionValue));
}
这是Aggregate
@Log4j2
@Aggregate
@NoArgsConstructor
public class GiftCard {
@AggregateIdentifier
private String id;
@AggregateMember(routingKey = "transactionId",eventForwardingMode = ForwardMatchingInstances.class)
private List<GiftCardTransaction> transactions = new ArrayList<>();
private int remainingValue;
@CommandHandler
public GiftCard(IssueCardCommand cmd) {
log.info("GiftCard is created");
apply(new CardIssuedEvent(cmd.getCardId(),cmd.getAmount()));
}
@EventSourcingHandler // 4.
public void on(CardIssuedEvent evt) {
id = evt.getCardId();
remainingValue=evt.getAmount();
log.info(id);
transactions.add(new GiftCardTransaction(id,remainingValue));
String cardId = UUID.randomUUID().toString();
apply(new CardReimbursedEvent(cardId,id,evt.getAmount()));
}
@CommandHandler
public void handle(ReimburseCardCommand cmd) {
String cardId = UUID.randomUUID().toString();
apply(new CardReimbursedEvent(cardId,cmd.getTransactionValue()));
}
}
解决方法
当你说
在 CommandHanlder 方法之前调用 Aggregate 的 EventHandler 方法
你这是什么意思? 我怀疑您正在体验聚合的事件溯源部分。
基本上,您的流程应该是这样的:
-
IssueCardCommand
-> 由Aggregate
处理,有效地为您创建一个并应用随后的CardIssuedEvent
,它将立即由您的EventSourcingHandler
处理。 -
ReimburseCardCommand
-> 你的Aggregate
是从过去重建的(事件溯源),这意味着所有的@EventSourcingHandler
将在命令处理程序之前被调用。当Aggregate
与事件保持同步时,它会根据@CommandHandler
方法处理您的命令。
obs:好像你有一个重复的命令处理程序方法,一个在 @Aggregate
上,另一个在 @AggregateMember
上。我会仔细检查这是否正确,以及您是否在两个地方都得到了您的命令,而我相信您不是。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。