【发布时间】:2021-07-24 13:56:44
【问题描述】:
我正在尝试将Command 发送到Aggregate。当我将Command 发送到Aggregate 时,Aggregate 的EventHandler 方法在CommandHanlder 方法之前被调用。
我不知道这怎么可能,因为我只想调用CommandHandler 方法。
首先我发送IssueCardCommand 来创建GiftCard 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(聚合的子实体)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,id,cmd.getTransactionValue()));
}
}
【问题讨论】:
标签: spring-boot axon