public static void Main() { Console.CancelKeyPress += (sender, eventArgs) => { eventArgs.Cancel = true; _cancelKeySignal.Set(); }; XmlConfigurator.ConfigureAndWatch(new FileInfo(InBaseDirectory("log4net.config"))); _log.Info("Starting persistence"); var appSettingsConfiguration = new AppSettingsConfiguration(); var useCassandraStorage = ConfigurationManager.AppSettings["PersistenceStorage"] == "Cassandra"; var busFactory = new BusFactory().WithConfiguration(appSettingsConfiguration, ConfigurationManager.AppSettings["Environment"]) .WithScan() .WithEndpoint(ConfigurationManager.AppSettings["Endpoint"]) .WithPeerId(ConfigurationManager.AppSettings["PeerId"]); InjectPersistenceServiceSpecificConfiguration(busFactory, appSettingsConfiguration, useCassandraStorage); using (busFactory.CreateAndStartBus()) { _log.Info("Starting initialisers"); var inMemoryMessageMatcherInitializer = busFactory.Container.GetInstance <InMemoryMessageMatcherInitializer>(); inMemoryMessageMatcherInitializer.BeforeStart(); OldestNonAckedMessageUpdaterPeriodicAction oldestNonAckedMessageUpdaterPeriodicAction = null; if (useCassandraStorage) { oldestNonAckedMessageUpdaterPeriodicAction = busFactory.Container.GetInstance <OldestNonAckedMessageUpdaterPeriodicAction>(); oldestNonAckedMessageUpdaterPeriodicAction.AfterStart(); } _log.Info("Persistence started"); _cancelKeySignal.WaitOne(); _log.Info("Stopping initialisers"); oldestNonAckedMessageUpdaterPeriodicAction?.BeforeStop(); var messageReplayerInitializer = busFactory.Container.GetInstance <MessageReplayerInitializer>(); messageReplayerInitializer.BeforeStop(); inMemoryMessageMatcherInitializer.AfterStop(); _log.Info("Persistence stopped"); } }
private static void InjectPersistenceServiceSpecificConfiguration(BusFactory busFactory, AppSettingsConfiguration configuration, bool useCassandraStorage) { busFactory.ConfigureContainer(c => { c.ForSingletonOf <IPersistenceConfiguration>().Use(configuration); if (useCassandraStorage) { _log.Info("Using Cassandra storage implementation"); c.ForSingletonOf <IStorage>().Use <CqlStorage>(); } else { _log.Info("Using RocksDB storage implementation"); c.ForSingletonOf <IStorage>().Use <RocksDbStorage>(); } c.ForSingletonOf <IMessageReplayerRepository>().Use <MessageReplayerRepository>(); c.ForSingletonOf <IMessageReplayer>().Use <MessageReplayer>(); c.ForSingletonOf <IMessageDispatcher>().Use(typeof(Func <IContext, MessageDispatcher>).Name, ctx => { var dispatcher = ctx.GetInstance <MessageDispatcher>(); dispatcher.ConfigureHandlerFilter(x => x != typeof(PeerDirectoryClient)); return(dispatcher); }); c.ForSingletonOf <ITransport>().Use <QueueingTransport>().Ctor <ITransport>().Is <ZmqTransport>(); c.ForSingletonOf <IInMemoryMessageMatcher>().Use <InMemoryMessageMatcher>(); c.Forward <IInMemoryMessageMatcher, IProvideQueueLength>(); c.ForSingletonOf <IStoppingStrategy>().Use <PersistenceStoppingStrategy>(); c.ForSingletonOf <IReporter>().Use <NoopReporter>(); // Cassandra specific if (useCassandraStorage) { c.ForSingletonOf <ICqlStorage>().Use <CqlStorage>(); c.ForSingletonOf <CassandraCqlSessionManager>().Use(() => CassandraCqlSessionManager.Create()); c.ForSingletonOf <ICqlPersistenceConfiguration>().Use <CassandraAppSettingsConfiguration>(); } }); }