- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 Axon Framework,没有带有 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() 对我不起作用。
最佳答案
我想从注意到 Saga 为复杂业务事务的单个实例建模开始。Axon 提供了很多关于该主题的文档,您可以阅读 here .
然后转到您的 Saga 片段,您似乎在帐户聚合的开头开始了 Saga 片段。我认为从账户/钱包的角度来看,这根本不是 Saga 的正确起点,我假设你在其中。相反,您的 Saga 应该模拟一个单个(复杂的业务)交易,因此只是取款或存款。
AxonIQ 和 Pivotal 去年合作提供了这样一个使用 Saga 的示例项目,Axon Trader .我建议您查看此项目,以进一步了解如何处理一般的 Saga。
顺便说一下,回答标题问题:您永远不会亲自回滚 Saga。如果有异常状态,Axon 的 Unit of Work概念将启动回滚阶段以恢复一些操作。
如果应该在异常状态的概念之外回滚,那么您应该自己处理。这是必要的,因为您的 Saga 对整个交易进行建模,因此也是错误状态。您通常会调度补偿操作(例如命令)作为对故障状态的 react 。
希望这能为您澄清一些事情。
关于java - Axon Framework - 我如何回滚 Saga 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57757820/
我很想知道在使用 Axon 框架来验证电子邮件字段对于联系人聚合的一组电子邮件是唯一的时,最佳实践方法是什么。 示例设置 ContactCreateCommand { identifier =
我刚开始使用 Axon 框架,但遇到了一些障碍。 虽然我可以使用它们的 ID 加载单个聚合,但我不知道如何获取所有聚合的列表或所有聚合 ID 的列表。 EventSourcingRepository
我是 Axon 的新手,并编写了一个示例代码,其中我们有一个库存服务,用于添加新库存、更新库存,并且我们希望将事件发送到产品服务以进行任何更新。产品服务应充当库存服务的只读副本。 库存服务代码: 所以
是否有必要向 Axon 聚合和消息添加(覆盖)hashCode 和 equals 方法? SonarQube 中的分析表明,在对这些实体执行标准 Axon 操作时(在端到端测试中),它们没有被使用。此
新的一天,新的 Axon 问题。今天我想问一下Axon Saga的流程。在微服务之间使用 Axon Saga 的最佳实践是什么? 异步传奇:“主”服务同时向每个“从”服务发送命令。如果出现问题,也会通
是否可以在没有 Axon Server 的情况下扩展 Axon Framework 企业 ?我有兴趣使用 Axon 创建原型(prototype) CQRS 应用程序,但最终的可部署系统必须免收许可费
问题: 研究:在 https://gitlab.com/ZonZonZon/simple-axon.git我编了一个简单的 Axon-app 表明 JAR-artifact 建于 Gradle插件 c
我们正在使用 Axon 4 的 CQRS 和事件溯源。 我们有以下场景。 域书 操作 - 使用 Axon CRQS 和事件源流(命令 - 聚合 - 事件)在数据库中创建新书籍 操作 - 使用 Axon
在 AxonFramework 中,可以使用消息代理(例如 RabbitMQ)分发事件和命令。 我想知道是否可以对查询执行相同的操作,我在文档上找不到任何内容... 最佳答案 您在文档中找不到它是完全
我们目前正在对CQRS和事件源进行一些研究,并发现了两个主要框架来解决这两个问题:Axon Framework和Eventuate。两者都在继续开发,而Eventuate现在在RBMH reposit
我通常每个聚合有 5-6 个事件,并且不希望将预测存储在数据库中。在查询时进行 View 投影的最简单方法是什么? 最佳答案 对此的简短回答是,没有简单/快速的方法可以做到这一点。 但是,实现“在请求
是否可以使用 usingSubscribingEventProcessors 并且在投影事件时,始终从头开始重新投影所有事件。意思是——我从不将投影保存到数据库,而是在聚合发出新事件时重新投影所有事件
我正在尝试定义我的“事件处理程序拦截器”,我按照官方文档 here 上的说明进行操作,但我收到以下错误: org.springframework.beans.factory.BeanCreationE
我有以下设置: HTTP 请求到达 REST 端点,我在应用程序服务中收到它。 应用程序服务将请求映射到命令 C1 并使用 commandGateway.sendAndWait(new C1(rest
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 3 年前。 Improve
我正在尝试测试聚合并想断言夹具之外的事件,甚至可能使用 Hamcrest 进行评估? 使用时间戳的例子 fixture.given() .when(new Use
我有一个用例,我想发布一个非状态更改事件作为触发器。 In the vast majority of cases, the Aggregates will publish events by ap
我正在尝试测试聚合并想断言夹具之外的事件,甚至可能使用 Hamcrest 进行评估? 使用时间戳的例子 fixture.given() .when(new Use
我目前正在为 Spring Boot/Axon 应用程序进行集成测试。 在其中一个测试中,它(一个节点)通过 SpringApplicationBuilder 创建另一个节点(在不同的配置文件下),连
到目前为止,我一直在 CommandHandlers 中处理授权。 一个例子是我有一个聚合“团队”,其中包含一个经理列表(来自用户的聚合标识符)。团队聚合中的所有命令处理程序然后验证执行命令的用户是团
我是一名优秀的程序员,十分优秀!