2016-10-17 95 views
2

我正在开发一个小的cqrs实现,我对它很陌生。 我想分离每个处理程序(命令和事件)从聚合和 确保所有工作正常。命令处理程序从控制器被触发 ,但从那里触发事件处理程序。 任何人请帮助。轴突事件处理程序不工作

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; 
} 

}

@Component 公共类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; 
} 

}

@Component 公共类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; 
} 

}

+0

请修改您的代码。 – surajsn

回答

1

据我所知道的,唯一缺少的就是你AREN不会将User聚集添加到存储库。通过将其添加到存储库,持久化用户(通过存储生成的事件(如果是事件源或其状态),并将由命令处理程序(包括聚合)生成的所有事件发布到事件总线。 请注意,Aggregate的@EventSourcingHandler被立即调用,但任何外部@EventHandler只在命令处理程序执行后才会被调用。

+0

非常感谢Allard – Prasanth