2017-10-18 56 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...

親切的問候,

西蒙

相關問題