首页 > 解决方案 > Axon:单个聚合的多命令

问题描述

对于精细的 API 命令处理,我有一个非常好的想法。

我们的 Web API 应该提供一个简单的update端点,但您可以向它提供多个命令。像这样的东西:

POST /myAggregate/12345/update
[
  { command1Name: "command1Data" },
  { command2Name: "command2Data" },
  { command3Name: "command3Data" }
]

在 Axon 内部,这似乎很难处理。尤其是与@AggregateVersion.


我的第一个想法是拥有一个新的UpdateWrapperCommand. 内部有一个List commands. 然后在聚合中,您使用反射来调用正确的@CommandHandler方法:

class UpdateWrapperCommand {
  List commands;
}

@Aggregate
class MyAggregate {
  // id, version, constructor, etc. pp.

  @CommandHandler
  public void handle(SomeCommand cmd) { ... }

  @CommandHandler
  public void handle(UpdateWrapperCommand cmd) {
    // iterate over cmd.commands
    // iterate over this.getClass().getMethods()
    // find correct method(s), and invoke it
  }
}

但是当@CommandHandlers 也使用@MetaData和/或 Spring Bean 注入时,它变得非常困难。


我的第二个想法是简单commandGateway.send地循环调用。但这会爆炸,因为@TargetAggragateVersion必须为每个命令设置,并且您必须等待每个命令完成,然后才能发送下一个命令。这不好。


你对此有什么想法吗?

它应该加载一次聚合,然后运行所有命令。

甚至可能有一些类似事务的行为:应用所有结果事件,或者不应用。

标签: cqrsevent-sourcingaxon

解决方案


我认为您最好立即解决此问题,而无需等待您添加到 Axon Framework 问题跟踪器的问题,即添加一个External Command Handler

外部命令处理程序只是一个带有@CommandHandler注释功能的常规组件。该方法将处理您UpdateWrapperCommand并知道为包含它的每个命令有效负载发出单独命令的工作。

然而,正如您所建议的那样,聚合的加载优化实际上与实施批处理命令解决方案有关。虽然这在框架中绝对是可行的,但这个功能还没有到位。我建议您继续跟踪您创建的问题以跟踪它的进展。

希望这可以帮助你本杰明!


推荐阅读