2017-10-18 45 views
1

我有一个处理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"))); 
} 
+1

我认为你必须提供相关的'@ CommandHandlers'和'@ EventSourcingHandlers'对我们说些什么明智的这个代码。 – Allard

回答

0

轴突正在处理您实现骨料的实例。因此,您可以用@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...

亲切的问候,

西蒙

相关问题