【发布时间】:2019-09-02 13:28:03
【问题描述】:
我正在使用 Axon 框架,而没有带有 spring-boot 自动配置的 Axon 服务器。我的问题是:如果我正在运行一个 saga 进程,如下所示,并且在处理过程中我的磁盘用完了,就会出现异常,我必须回滚。我怎样才能做到这一点?我要回滚多少?
我的 saga_entry 表是这样的:
SAGA_ID: 22ad255b-4378-4bb4-84c2-061ca666c6e7, REVISION: null, SAGA_TYPE: hu.saga.account.SagaAccount, SERIALIZED_SAGA: 3c68752e6d6f6c617269732e736167612e6163636f756e742e536167614163636f756e742f3e
我的 association_value_entry 表将是这样的:
ID:2,ASSOCIATION_KEY:accountId,ASSOCIATION_VALUE:11,SAGA_ID:22ad255b-4378-4bb4-84c2-061ca666c6e7,SAGA_TYPE:hu.saga.account.SagaAccount
在我的 domain_event_entry 表中将只有两个事件(而不是应有的 3 个)AccountCreatedEvent、MoneyWithdrawnEvent,聚合 id 为:11。
这只是一个例子,主要问题是在 Axon Saga 中处理和实现回滚的最佳方法是什么?
@StartSaga
@SagaEventHandler(associationProperty = "accountId")
public void handle(AccountCreatedEvent event){
logger.info("Saga Start");
commandGateway.send(new WithdrawMoneyCommand(event.getAccountId(), event.getAccountId(),event.getOverDraftLimit()));
}
我写 null 来模拟 DepositMoneyCommand 构造函数中的潜在回滚
@SagaEventHandler(associationProperty = "accountId")
public void handle(MoneyWithdrawnEvent event){
commandGateway.send(new DepositMoneyCommand(null,event.getTransactionId(),event.getAmount()));
}
@EndSaga
@SagaEventHandler(associationProperty = "accountId")
public void handle(MoneyDepositedEvent event){
logger.info("Saga End");
}
我的意思是,如果我不处理它,saga 表将不会是空的,并且我不能为该聚合 id:11 触发另一个 saga,因为它已经存在于 domain_event-entry 表中
如何从 domain_event_entry 表中删除? AggregateLifecycle.markdeleted() 不适合我。
【问题讨论】:
标签: java spring-boot saga axon