All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.elder.soucerer.eventstore.EventStoreConfiguration Maven / Gradle / Ivy

Go to download

An opinionated framework for implementing an CQRS architecture using event sourcing

The newest version!
package org.elder.soucerer.eventstore;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.msemys.esjc.EventStore;
import com.github.msemys.esjc.EventStoreBuilder;
import org.elder.sourcerer.EventRepositoryFactory;
import org.elder.sourcerer.esjc.EventStoreEsjcEventRepositoryFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import java.time.Duration;

@Configuration
public class EventStoreConfiguration {
    @Bean
    @Scope(BeanDefinition.SCOPE_SINGLETON)
    public EventStore getEventStoreConnection(
            @Value("${sourcerer.eventstore.hostname:127.0.0.1}") final String hostname,
            @Value("${sourcerer.eventstore.port:1113}") final int port,
            @Value("${sourcerer.eventstore.gossipPort:2113}") final int gossipPort,
            @Value("${sourcerer.eventstore.requireMaster:false}") final boolean requireMaster,
            @Value("${sourcerer.eventstore.useClusterDiscovery:false}")
            final boolean useClusterDiscovery) {
        EventStoreBuilder builder = EventStoreBuilder
                .newBuilder()
                .userCredentials("admin", "changeit")
                .requireMaster(requireMaster)
                .failOnNoServerResponse(true);

        if (useClusterDiscovery) {
            builder
                    .clusterNodeUsingDns(dnsConfig -> dnsConfig
                            .dns(hostname)
                            .externalGossipPort(gossipPort)
                            .maxDiscoverAttempts(10)
                            .discoverAttemptInterval(Duration.ofMillis(500)));
        } else {
            builder.singleNodeAddress(hostname, port);
        }

        return builder.build();
    }

    @Bean
    @Scope(BeanDefinition.SCOPE_SINGLETON)
    public EventRepositoryFactory getEventRepositoryFactory(
            final EventStore eventStore,
            final ObjectMapper objectMapper,
            @Value("${sourcerer.eventstore.namespace}") final String namespace) {
        return new EventStoreEsjcEventRepositoryFactory(eventStore, objectMapper, namespace.trim());
    }

    @Bean(name = "eventStoreStatus")
    @Scope(BeanDefinition.SCOPE_SINGLETON)
    public HealthIndicator getEventStoreHealthIndicator(final EventStore eventStore) {
        return new EventStoreHealthIndicator(eventStore);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy