使用Axon Framework触发/级联命令的最佳方式



使用Axon Sramework,在另一个命令成功后触发一个命令的最佳方式是什么。例如,一个命令将创建一个Aggregate(然后创建实体,在创建实体之后,我们需要在另一个域上创建另一个聚合/实体(例如,作为第一个实体的子实体)。

第二个实体必须使用聚合上的命令创建,但在哪里启动第二个命令?在第一个集合的CCD_ 2中?在保存第一个实体时在@EventHandler中?使用CCD_ 4?

另一点/问题:从查询中触发命令的最佳方式是什么。例如,我有一个查询来获取一些记录,如果记录不存在,我想自动创建它,然后从查询方法发回结果。我是否必须使用命令网关从查询处理程序类发送创建命令,然后等待结果?或者还有别的办法吗?

感谢您的支持和帮助。

Alexandre

在另一个命令之后触发一个命令的最佳方式是什么成功了吗?

忽略"最佳方式";在这个问题中,您很可能正在寻找一位流程经理。在Axon框架中,这些被称为传奇。

从查询中触发命令的最佳方式是什么。例如,我有一个查询来获取一些记录,如果一个记录不存在,我想自动创建

我会非常非常小心地做这样的事情。

首先,如果您在短时间内多次收到相同的查询,该怎么办?你如何知道命令是否已经发送?

其次,你不想在响应查询时等待更新,因为你不知道这需要多长时间,也不知道它是否会发生。

一种选择是使用订阅查询。在初始响应中指示数据不完整,并让客户端通过适当的命令流触发更新。由于客户端订阅了查询,因此一旦查询完成,它就会收到更新。

使用Axon框架,在另一个命令成功后触发一个命令的最佳方式是什么。例如,一个命令将创建一个聚合(然后是实体,9在创建实体后,我们需要在另一个域上创建另一个聚合/实体(例如,作为第一个实体的子实体)。

首先,命令从不创建聚合。命令定义了创建聚合的意图。命令构造函数应验证是否满足创建聚合的所有条件,然后发送聚合创建的事件。此事件实际上创建聚合并初始化其状态。请查看Axon文档中的命令和事件,了解有关此方面的更多详细信息。还要注意,只有事件存储在事件存储中,命令是fire和forget。

例如,聚合发送的聚合创建事件可以使用投影上的事件处理程序创建实体(我假设实体存在于读取模型中投影的范围内)。

既然你提到实体的创建之后是另一个正在创建的聚合,sagas(正如Milen所提到的)就发挥了作用。传奇由第一聚合的事件创建事件开始,并发送第二聚合的创建命令。然后重复与第一个聚合相同的流程(验证创建聚合的所有条件并发送创建事件)。

如果你需要在创建第二个聚合之前保证第一个实体存在,你可以尝试在投影中发送一种第一个实体创建的事件,在你的传奇中捕捉这个事件,并让这个传奇处理程序触发创建第二次聚合的命令。我不确定是否允许投影发送命令,尽管我无法想象为什么不。。。域事件可以用于跨越微服务的边界。

这听起来比实际情况更复杂,但一定要查看Axon文档中关于sagas的章节。

第二个实体必须使用聚合上的命令创建,但在哪里启动第二个命令?在第一个聚合的@EventSourcingHandler中?保存第一个实体时在@EventHandler中?使用佐贺?

我认为在聚合上使用命令创建实体有点奇怪。聚合从业务角度处理与它们允许的状态更改相关的命令。你这样做的意图是什么?实体(假设你指的是JPA实体),如前所述,用于";summary";导致聚合的当前状态并且通常存在于读取模型中(在CQRS体系结构中)的所有事件@EventHandlers通常在投影中侦听事件并相应地更新实体@EventSourcingHandler位于聚合上,以响应事件来更新聚合的当前状态,该状态必须是已知的,以验证未来命令的有效性。命令与业务流程在聚合上执行的相关操作密切相关。

我希望这能澄清你的问题,尽管我担心它们只会产生更多的问题;-)

最新更新