Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Axon框架-如何回滚传奇过程_Java_Spring Boot_Saga_Axon - Fatal编程技术网

Java Axon框架-如何回滚传奇过程

Java Axon框架-如何回滚传奇过程,java,spring-boot,saga,axon,Java,Spring Boot,Saga,Axon,我使用的Axon框架没有带spring boot auto config的Axon服务器。我的问题是:如果我正在运行一个SAGA进程,正如你在下面看到的,并且在处理过程中,我的磁盘用完了,就会有一个例外,我不得不回滚。我该怎么做?我要退多少 我的saga_条目表如下所示: SAGA_ID:22ad255b-4378-4bb4-84c2-061ca666c6e7,版本:null,SAGA_类型:hu.SAGA.account.SagaAccount,序列化的_SAGA:3C68752E6D6F6C

我使用的Axon框架没有带spring boot auto config的Axon服务器。我的问题是:如果我正在运行一个SAGA进程,正如你在下面看到的,并且在处理过程中,我的磁盘用完了,就会有一个例外,我不得不回滚。我该怎么做?我要退多少

我的saga_条目表如下所示:

SAGA_ID:22ad255b-4378-4bb4-84c2-061ca666c6e7,版本:null,SAGA_类型:hu.SAGA.account.SagaAccount,序列化的_SAGA:3C68752E6D6F6C61726973E736167612E61636F756E742E5361676141636F756E742F3E

我的关联\u值\u条目表如下所示:

ID:2,关联密钥:accountId,关联值:11,SAGA ID:22ad255b-4378-4bb4-84c2-061ca666c6e7,SAGA类型:hu.SAGA.account.SagaAccount

在我的域中,事件条目表将只有两个事件(不是应该的3个)AccountCreatedEvent,moneydrawnevent,聚合id为11

这只是一个例子,可能主要的问题是,在Axon传奇中,处理和实现回滚的最佳方式是什么

@StartSaga
@SagaEventHandler(associationProperty = "accountId")
public void handle(AccountCreatedEvent event){
    logger.info("Saga Start");
    commandGateway.send(new WithdrawMoneyCommand(event.getAccountId(), event.getAccountId(),event.getOverDraftLimit()));
}
我写null是为了模拟命令构造函数中的潜在回滚

@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表中


如何从域\事件\条目表中删除?AggregateLifecycle.markdeleted()对我不起作用。

我想首先指出,一个传奇故事对一个复杂业务事务的单个实例进行了建模。 Axon提供了一些关于这个主题的文档,您可以阅读

然后转到您的传奇片段,您似乎是在帐户聚合的开头开始一个传奇片段。 我认为,从账户/钱包的角度来看,这根本不是这场传奇的正确起点,我假设你在。 取而代之的是,你的故事应该是一个单一的(复杂的业务)交易,因此只是取款或存款

AxonIQ和Pivotal去年合作提供了这样一个样本项目,使用了一个传奇故事来达到这一目的。 我建议你看看这个项目,进一步了解如何处理一个传奇故事

顺便说一句,回答标题问题:你个人永远不会回顾一个传奇故事。如果出现异常状态,Axon的概念将在回滚阶段启动,以恢复某些操作

如果某些东西应该回滚到异常状态的概念之外,那么您应该自己处理这个问题。 这是必要的,因为您的传奇为整个事务建模,因此也为错误状态建模。 您通常会调度补偿动作(例如命令)作为对故障状态的反应

希望这能为你澄清一些事情。

请回答!非常感谢。