Пример #1
0
        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");
            }
        }
Пример #2
0
        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>();
                }
            });
        }