1

我对轴突框架仍然很陌生。

我正在尝试在我的应用程序中使用 mongodb 实现快照,但我不断收到错误消息

AbstractSnapshotter :尝试创建和存储快照导致异常。异常摘要:此快照程序中的聚合类型未知:com.myworklife.contacts.domain.contact.Contact

这是我的 java 配置文件的一部分。

@Bean
public AggregateSnapshotter snapShotter(EventStore eventStore, AggregateFactory<Contact> contactAggregateFactory) {
    return new AggregateSnapshotter(eventStore);
}


@Bean
public SnapshotTriggerDefinition snapshotTriggerDefinition(Snapshotter snapShotter) throws Exception {
    return new EventCountSnapshotTriggerDefinition(snapShotter, 1);
}

@Bean
public EventStore eventStore(EventStorageEngine eventStorageEngine)  {
    return new EmbeddedEventStore(eventStorageEngine);
}

@Bean
public Repository<Contact> contactAggregateRepository(EventStore eventStore, SnapshotTriggerDefinition snapshotTriggerDefinition) {
    return new ContactRepository(eventStore, snapshotTriggerDefinition);
}

还有我的存储库。

    @Repository("ContactRepository")
public class ContactRepository extends EventSourcingRepository<Contact> {

    @Autowired
    public ContactRepository(EventStore eventStore, SnapshotTriggerDefinition snapshotTriggerDefinition) {
        super(Contact.class, eventStore, snapshotTriggerDefinition);
    }

    public Contact findContact(ContactId contactId) {
        return load(contactId.toString()).getWrappedAggregate().getAggregateRoot();
    }
}

我的聚合。

@Aggregate(repository="contactAggregateRepository")
public class Contact {

    @AggregateIdentifier
    private ContactId id;
    private String name;
    private String mobileNumber;

    public Contact() {
        // do nothing, Axon requires default constructor
    }

    @CommandHandler
    public Contact(CreateContactCommand createContactCommand) {
        apply(new ContactHasBeenCreatedEvent(createContactCommand.getContactId(), createContactCommand.getName(),
                createContactCommand.getMobileNumber()));
    }
}

有什么我做错了吗?

因为我收到一条错误消息“尝试创建和存储快照导致异常。异常摘要:此快照程序中的聚合类型未知:com.myworklife.contacts.domain.contact.Contact

任何帮助将不胜感激。

谢谢,帕特

4

3 回答 3

0

如果您使用的是 Axon 3.3 和 SpringBoot 2,我们在这个项目中就是这样做的:

@Configuration
public class SnapshotConfiguration {

    @Bean
    public SpringAggregateSnapshotter snapshotter(ParameterResolverFactory parameterResolverFactory,
                                                  EventStore eventStore,
                                                  TransactionManager transactionManager) {
        // https://docs.axoniq.io/reference-guide/v/3.3/part-iii-infrastructure-components/repository-and-event-store#snapshotting
        // (...) By default, snapshots are created in the thread that calls the scheduleSnapshot() method, which is generally not recommended for production (...)
        Executor executor = Executors.newSingleThreadExecutor();
        return new SpringAggregateSnapshotter(eventStore, parameterResolverFactory, executor, transactionManager);
    }

    @Bean
    public EventCountSnapshotTriggerDefinition snapshotTrigger(SpringAggregateSnapshotter snapshotter) {
        int snapshotThreshold = 42;
        return new EventCountSnapshotTriggerDefinition(snapshotter, snapshotThreshold);
    }
}

如果您需要 EventStore 配置:

@Configuration
public class AxonMongoEventStoreConfiguration {

    @Bean
    public MongoClient axonMongoClient(MongoClientURI axonMongoClientUri) {
        return new MongoClient(axonMongoClientUri);
    }

    @Bean
    public MongoClientURI axonMongoClientUri() {
        return new MongoClientURI("mongodb://host:port/database");
    }

    @Bean
    @Primary
    public EventStorageEngine eventStore(MongoClient axonMongoClient, MongoClientURI axonMongoClientUri) {
        DefaultMongoTemplate mongoTemplate = new DefaultMongoTemplate(axonMongoClient, axonMongoClientUri.getDatabase());
        return new MongoEventStorageEngine(mongoTemplate);
    }
}
于 2018-12-13T15:40:13.187 回答
0

您需要将 contactAggregateFactory 添加到 snapShotter bean 中的 AggregateSnapshotter 的构造函数中:

@Bean
public AggregateSnapshotter snapShotter(EventStore eventStore,    AggregateFactory<Contact> contactAggregateFactory) {
    return new AggregateSnapshotter(eventStore, contactAggregateFactory);
}
于 2017-07-20T08:21:23.273 回答
0

1.依赖罐

 <dependency>
    <groupId>org.axonframework</groupId>
    <artifactId>axon-spring-boot-autoconfigure</artifactId>
    <version>${axon.version}</version>
</dependency>

2.首先,你应该配置你的application.ymp或bootstrap.yml,像这样:spring: data: mongodb: host: localhost port: 27017 database: axonframework events: domainevents snapshots: snapshotevents

3.配置你的mongoDB:

    @Bean(name = "axonMongoTemplate")
public MongoTemplate axonMongoTemplate() {
    MongoTemplate template = new DefaultMongoTemplate(mongoClient(), mongoDbName, eventsCollectionName, snapshotCollectionName);
    return template;
}

@Bean
public MongoClient mongoClient(){
    MongoFactory mongoFactory = new MongoFactory();
    mongoFactory.setMongoAddresses(Arrays.asList(new ServerAddress(mongoHost)));
    return mongoFactory.createMongo();
}

@Bean
public EventStorageEngine eventStorageEngine(Serializer serializer){
    return new MongoEventStorageEngine(
            serializer,null, axonMongoTemplate(), new DocumentPerEventStorageStrategy());

4. 为您的聚合配置存储库,例如,我配置一个 Element Aggreaget 的存储库

@Configuration
public class ElementConfiguration {

    @Autowired
    private EventStore eventStore;
    @Bean
    @Scope("prototype")
    public Element elementAggregate() {
        return new Element();
    }

    @Bean
    public AggregateFactory<Element> elementAggregateAggregateFactory() {

        SpringPrototypeAggregateFactory<Element> aggregateFactory = new SpringPrototypeAggregateFactory<>();
        aggregateFactory.setPrototypeBeanName("elementAggregate");
        return aggregateFactory;
    }
    @Bean
    public SpringAggregateSnapshotterFactoryBean springAggregateSnapshotterFactoryBean(){

        SpringAggregateSnapshotterFactoryBean factory = new SpringAggregateSnapshotterFactoryBean();
        return factory;
    }
     @Bean
    public Repository<Element> elementAggregateRepository(Snapshotter snapshotter) {

        EventCountSnapshotTriggerDefinition eventCountSnapshotTriggerDefinition = new EventCountSnapshotTriggerDefinition(snapshotter, 3);


        EventSourcingRepository<Element> repository = new EventSourcingRepository<Element>(
            elementAggregateAggregateFactory(),
            eventStore,
            eventCountSnapshotTriggerDefinition
        );
        return repository;
    }

5.享受

于 2017-11-17T06:03:29.707 回答