2 votes

Le gestionnaire d'événements d'Axon ne fonctionne pas

Je suis en train de développer une petite implémentation de cqrs et je suis très novice dans ce domaine. Je veux séparer chaque gestionnaire (commande et événement) de l'agrégat et faire de l'agrégat un outil de gestion de l'agrégat. de l'agrégat et s'assurer que tout fonctionne bien. Le gestionnaire de commande est déclenché à partir du contrôleur, mais les gestionnaires d'événements sont déclenchés à partir du contrôleur. Le contrôleur déclenche le gestionnaire de commande, mais les gestionnaires d'événements ne sont pas déclenchés à partir de là. Est-ce que quelqu'un peut m'aider ? quelqu'un pourrait-il m'aider à résoudre ce problème ?

public class User extends AbstractAnnotatedAggregateRoot<String> {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@AggregateIdentifier
private String userId;
private String userName;
private String age;

public User() {

}

public User(String userid) {
    this.userId=userid;
}

@Override
public String getIdentifier() {
    return this.userId;
}

public void createuserEvent(UserCommand command){
    apply(new UserEvent(command.getUserId()));
}

@EventSourcingHandler
public void applyAccountCreation(UserEvent event) {
    this.userId = event.getUserId();
}

}

public class UserCommand {

private final String userId;

public UserCommand(String userid) {
    this.userId = userid;
}

public String getUserId() {
    return userId;
}

}

@Composant public class UserCommandHandler {

@CommandHandler
public void userCreateCommand(UserCommand command) {
    User user = new User(command.getUserId());
    user.createuserEvent(command);
}

}

public class UserEvent {

private final String userId;

public UserEvent(String userid) {
    this.userId = userid;
}

public String getUserId() {
    return userId;
}

}

@Composant public class UserEventHandler {

@EventHandler
public void createUser(UserEvent userEvent) {
    System.out.println("Event triggered");
}

}

@Configuration
@AnnotationDriven
public class AppConfiguration {
@Bean
public SimpleCommandBus commandBus() {
    SimpleCommandBus simpleCommandBus = new SimpleCommandBus();
    return simpleCommandBus;
}

@Bean
public Cluster normalCluster() {
    SimpleCluster simpleCluster = new SimpleCluster("simpleCluster");
    return simpleCluster;
}

@Bean
public ClusterSelector clusterSelector() {
    Map<String, Cluster> clusterMap = new HashMap<>();
    clusterMap.put("com.user.event.handler", normalCluster());
    //clusterMap.put("exploringaxon.replay", replayCluster());
    return new ClassNamePrefixClusterSelector(clusterMap);
}

@Bean
public EventBus clusteringEventBus() {
    ClusteringEventBus clusteringEventBus = new ClusteringEventBus(clusterSelector(), terminal());
    return clusteringEventBus;
}

@Bean
public EventBusTerminal terminal() {
    return new EventBusTerminal() {
        @Override
        public void publish(EventMessage... events) {
            normalCluster().publish(events);
        }
        @Override
        public void onClusterCreated(Cluster cluster) {

        }
    };
}

@Bean
public DefaultCommandGateway commandGateway() {
    return new DefaultCommandGateway(commandBus());
}

@Bean
public Repository<User> eventSourcingRepository() {
     EventStore eventStore = new FileSystemEventStore(new SimpleEventFileResolver(new File("D://sevents.txt")));
    EventSourcingRepository eventSourcingRepository = new EventSourcingRepository(User.class, eventStore);
    eventSourcingRepository.setEventBus(clusteringEventBus());
    AnnotationEventListenerAdapter.subscribe(new UserEventHandler(), clusteringEventBus());
    return eventSourcingRepository;
}

}

1voto

Allard Points 1081

Pour autant que je puisse en juger, la seule chose qui manque est que vous n'ajoutez pas l'élément User Agréger à un référentiel. En l'ajoutant au référentiel, l'utilisateur est persisté (soit en stockant les événements générés, dans le cas de l'Event Sourcing, soit son état autrement) et tous les événements générés par le Command Handler (y compris l'agrégat) sont publiés dans le bus d'événements. Il convient de noter que l'élément @EventSourcingHandler sont invoquées immédiatement, mais les @EventHandler ne sont invoquées qu'après l'exécution du gestionnaire de commande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X