Axon错误:java.lang.IllegalArgumentException:工作单元已经有一个具有相同标识符的聚合体
我有一个处理Report Run Command的报告运行器聚合。聚合具有目标标识符,并且这两个命令具有相同的目标标识符。Axon错误:java.lang.IllegalArgumentException:工作单元已经有一个具有相同标识符的聚合体
得到以下错误
java.lang.IllegalArgumentException异常:工作单元已经具有在org.axonframework.common.Assert.isTrue(Assert.java:54)具有相同标识符 一个聚合〜[axon-core-3.0.6.jar:3.0.6] at org.axonframework.commandhandling.model.AbstractRepository.newInstance(AbstractRepository.java:84)〜[axon-core-3.0.6.jar:3.0。 6] at org.axonframework.commandhandling.AggregateAnnotationCommandHandler $ AggregateConstructorCommandHandler.handle(AggregateAnnotationCommandHandler.java:181)〜[axon-core-3.0.6.jar:3.0.6] at org.axonframework.commandhand ling.AggregateAnnotationCommandHandler $ AggregateConstructorCommandHandler.handle(AggregateAnnotationCommandHandler.java:170)〜[axon-core-3.0.6.jar:3.0.6] at org.axonframework.commandhandling.AggregateAnnotationCommandHandler.handle(AggregateAnnotationCommandHandler.java:148)〜[ axon-core-3.0.6.jar:3.0.6] at org.axonframework.commandhandling.AggregateAnnotationCommandHandler.handle(AggregateAnnotationCommandHandler.java:40)〜[axon-core-3.0.6.jar:3.0.6]
喜欢的东西
public class ExecuteReportsAggregate
{
@AggregateIdentifier
private String reportId;
// Command Handler and Even Source Handlers
}
执行报告命令
@Value
public class ExecuteReportCommand
{
@TargetAggregateIdentifier
String reportId;
}
报告执行的命令
@Value
public class ReportExecutedCommand
{
// @TargetAggregateIdentifier
private String reportId;
}
春天开机看起来像这样
public static void main(String[] args)
{
ConfigurableApplicationContext config = SpringApplication.run(SsmpPreopenCommand.class, args);
CommandBus commandBus = config.getBean(CommandBus.class);
commandBus.dispatch(GenericCommandMessage.asCommandMessage(new ExecuteReportCommand("12345",
"asdfasdf Errors", "/home/teo", new ServiceCredentials())));
// commandBus.dispatch(GenericCommandMessage.asCommandMessage(new
// ReportExecutedCommand("12345")));
}
轴突正在处理您实现骨料的实例。因此,您可以用@CommandHandler
注释标记Aggregate的相关方法。
(平时)的聚集体应具有:
- 无参数构造
- 具有命令作为第一个参数,由
@CommandHandler
注释标记标明@EventSourcingHandler
- 的至少一种方法构造注释,接受作为第一个参数的事件,该事件由执行此构造函数触发,并由
AggregateLifecycle#apply()
方法执行,并设置AggregateIdentifier
标记的字段。 - 任何接受命令作为标有
@CommandHandler
注释的第一参数数目的进一步方法 - 任何接受事件作为标有
@EventSourcingHandler
注释
如果发送的第一命令的第一参数数目的另外的方法在CommandBus
上,Axon将试图找到具有匹配标识符的Aggegate,并且由于它不存在,所以它通过调用构造函数并将命令传递给它来创建它。构造函数将调用AggregateLifecycle#apply()
方法并触发事件(由Axon存储),因此从此时刻开始,Axon将尝试将所有命令与TargetAggregateIdentifier
命令一起发送到此聚合实例。
如果您尝试使用SAME集合标识创建(并存储)SAME类型的另一个Aggregate实例,则会失败并查看上述异常。
为了避免,您希望使用'create-on-check-fail'模式。见我thoughts on it here...
亲切的问候,
西蒙
我认为你必须提供相关的'@ CommandHandlers'和'@ EventSourcingHandlers'对我们说些什么明智的这个代码。 – Allard