2017-10-18 4 views
1

レポート実行コマンドを処理しているレポートランナー集計があります。集約にはターゲット識別子があり、両方のコマンドには同じターゲット識別子があります。Axonエラー:java.lang.IllegalArgumentException:作業ユニット(Unit of Work)に既に同じ識別子を持つ集計があります

次のエラーに

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

を参照してください。 – Allard

答えて

0

のように見えるアクソンは、実装集合体のインスタンスを処理しています。そのため、Aggregateの関連するメソッドに@CommandHandlerアノテーションを付けてマークします。

  • 無引数コンストラクタ
  • @EventSourcingHandler付い@CommandHandler注釈
  • 少なくとも一つの方法でマーク最初の引数としてコマンドを有するコンストラクタ:

    (通常)集合体は有していなければなりませんAggregateLifecycle#apply()メソッドで実行され、AggregateIdentifierでマークされたフィールドを設定するこのコンストラクタの実行によって起動されたイベントを最初のパラメータとして受け取ります。

  • @CommandHandler注釈でマークされた最初のパラメータとしてコマンドを受け入れ、さらに任意の数の方法
  • あなたが最初のコマンドを送信する場合@EventSourcingHandler注釈

でマークされた最初のパラメータとしてイベントを受け入れ、さらに任意の数の方法CommandBusで、Axonは一致する識別子を持つAggegateを見つけようとします。存在しないため、コンストラクタを呼び出してコマンドを渡すことによってAxgeが作成されます。コンストラクタはAggregateLifecycle#apply()メソッドを呼び出してAxonに格納されたイベントを起動します。この時点から、Axonはこの集約インスタンスに同じTargetAggregateIdentifierを持つALLコマンドを送信しようとします。

SAME集計識別子を持つSAMEタイプの別の集計インスタンスを作成(および格納)しようとすると、上記の例外が失敗して表示されます。

回避するには、「確認時に作成」パターンを使用します。私たちはこのことについて賢明な何かを言うのあなたがEventSourcingHandlers` @ CommandHandlers`と `@`関連するためのコードを提供しなければならないと思う私のthoughts on it here...

種類のよろしく、

サイモン

関連する問題