2017-10-18 3 views
1

J'ai un agrégat de coureur de rapport qui gère la commande d'exécution de rapport. L'agrégat a un identificateur de cible et les deux commandes ont le même identificateur de cible.Axon Error: java.lang.IllegalArgumentException: L'unité de travail a déjà un agrégat avec le même identifiant

Obtenir l'erreur suivante

java.lang.IllegalArgumentException: L'unité de travail a déjà un agrégat avec le même identifiant à org.axonframework.common.Assert.isTrue (Assert.java:54) ~ [axon-core-3.0.6.jar: 3.0.6] à org.axonframework.commandhandling.model.AbstractRepository.newInstance (AbstractRepository.java:84) ~ [axon-core-3.0.6.jar: 3.0. 6] à org.axonframework.commandhandling.AggregateAnnotationCommandHandler $ AggregateConstructorCommandHandler.handle (AggregateAnnotationCommandHandler.java:181) ~ [axon-core-3.0.6.jar: 3.0.6] à org.axonframework.commandhand ling.AggregateAnnotationCommandHandler $ AggregateConstructorCommandHandler.handle (AggregateAnnotationCommandHandler.java:170) ~ [axon-core-3.0.6.jar: 3.0.6] à org.axonframework.commandhandling.AggregateAnnotationCommandHandler.handle (AggregateAnnotationCommandHandler.java:148) ~ [ axon-core-3.0.6.jar: 3.0.6] à org.axonframework.commandhandling.AggregateAnnotationCommandHandler.handle (AggregateAnnotationCommandHandler.java:40) ~ [axon-core-3.0.6.jar: 3.0.6]

Quelque chose comme

public class ExecuteReportsAggregate 
{ 
    @AggregateIdentifier 
    private String reportId; 

    // Command Handler and Even Source Handlers 
} 

Exécuter Command Signaler un

@Value 
public class ExecuteReportCommand 
{ 
    @TargetAggregateIdentifier 
    String reportId; 
} 

Rapport Exécuté Commande

@Value 
public class ReportExecutedCommand 
{ 
    // @TargetAggregateIdentifier 
    private String reportId; 
} 

botte de printemps ressemble à ce

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

Je pense que vous devez fournir le code pour le signifiantes @ CommandHandlers' et '@ EventSourcingHandlers' pour nous de dire quelque chose de sensé à ce sujet. – Allard

Répondre

0

Axon gère les instances des agrégats que vous implémentez. Pour ce faire, marquez les méthodes pertinentes de Aggregate en les marquant de l'annotation @CommandHandler.

(habituellement) un agrégat doit avoir une:

  • no-args constructeur
  • un constructeur ayant une commande en tant que premier paramètre, marqué par @CommandHandler annotation
  • au moins une méthode marquée avec @EventSourcingHandler annotation, acceptant comme premier paramètre un événement déclenché par l'exécution de ce constructeur qui est effectué par la méthode AggregateLifecycle#apply() et en mettant en place le champ marqué par le AggregateIdentifier.
  • un certain nombre de méthodes nouvelles d'accepter une commande en tant que premier paramètre marqué par @CommandHandler annotation
  • un certain nombre de méthodes plus accepter un événement comme un premier paramètre marqué par @EventSourcingHandler annotation

Si vous envoyez la première commande sur le CommandBus, Axon essaiera de trouver l'Aggegate avec l'identifiant correspondant et, puisqu'il n'existe pas encore, il le créera en appelant le constructeur et en lui passant la commande.Le constructeur appellera la méthode AggregateLifecycle#apply() et déclenchera l'événement (stocké par Axon), donc à partir de ce moment, Axon essaiera d'envoyer toutes les commandes avec le même TargetAggregateIdentifier à cette instance agrégée.

Si vous essayez de créer (et de stocker) une autre instance Agrégate du même type avec l'identificateur agrégé SAME, vous échouerez et verrez l'exception ci-dessus. Pour éviter cela, vous devez utiliser le modèle 'créer sur vérification-échec'. Voir mes thoughts on it here...

Meilleures salutations,

Simon