private ProjectionManagerNode(IPublisher inputQueue, IPublisher[] queues, RunProjections runProjections) { _runProjections = runProjections; _output = new InMemoryBus("ProjectionManagerOutput"); _projectionManager = new ProjectionManager( inputQueue, _output, queues, new RealTimeProvider(), runProjections); }
public ProjectionsSubsystem(int projectionWorkerThreadCount, RunProjections runProjections) { if (runProjections <= RunProjections.System) _projectionWorkerThreadCount = 1; else _projectionWorkerThreadCount = projectionWorkerThreadCount; _runProjections = runProjections; }
public Projections( TFChunkDb db, QueuedHandler mainQueue, ISubscriber mainBus, TimerService timerService, ITimeProvider timeProvider, IHttpForwarder httpForwarder, HttpService[] httpServices, IPublisher networkSendQueue, int projectionWorkerThreadCount, RunProjections runProjections) { _projectionWorkerThreadCount = projectionWorkerThreadCount; SetupMessaging( db, mainQueue, mainBus, timerService, timeProvider, httpForwarder, httpServices, networkSendQueue, runProjections); }
public static ProjectionManagerNode Create( TFChunkDb db, QueuedHandler inputQueue, IHttpForwarder httpForwarder, HttpService[] httpServices, IPublisher networkSendQueue, IPublisher[] queues, RunProjections runProjections) { var projectionManagerNode = new ProjectionManagerNode(inputQueue, queues, runProjections); var projectionsController = new ProjectionsController(httpForwarder, inputQueue, networkSendQueue); foreach (var httpService in httpServices) { httpService.SetupController(projectionsController); } return projectionManagerNode; }
public ProjectionsSubsystem(int projectionWorkerThreadCount, RunProjections runProjections) { if (runProjections <= RunProjections.System) { _projectionWorkerThreadCount = 1; } else { _projectionWorkerThreadCount = projectionWorkerThreadCount; } _runProjections = runProjections; }
public static ProjectionManagerNode Create( TFChunkDb db, QueuedHandler inputQueue, IHttpForwarder httpForwarder, HttpService[] httpServices, IPublisher networkSendQueue, IPublisher[] queues, RunProjections runProjections) { var projectionManagerNode = new ProjectionManagerNode(inputQueue, queues, runProjections); var projectionsController = new ProjectionsController(httpForwarder, inputQueue, networkSendQueue); foreach (var httpService in httpServices) { httpService.SetupController(projectionsController); } return(projectionManagerNode); }
public ProjectionManager( IPublisher inputQueue, IPublisher publisher, IPublisher[] queues, ITimeProvider timeProvider, RunProjections runProjections, bool initializeSystemProjections = true) { if (inputQueue == null) { throw new ArgumentNullException("inputQueue"); } if (publisher == null) { throw new ArgumentNullException("publisher"); } if (queues == null) { throw new ArgumentNullException("queues"); } if (queues.Length == 0) { throw new ArgumentException("At least one queue is required", "queues"); } _inputQueue = inputQueue; _publisher = publisher; _queues = queues; _timeoutSchedulers = CreateTimeoutSchedulers(queues); _timeProvider = timeProvider; _runProjections = runProjections; _initializeSystemProjections = initializeSystemProjections; _writeDispatcher = new RequestResponseDispatcher <ClientMessage.WriteEvents, ClientMessage.WriteEventsCompleted>( publisher, v => v.CorrelationId, v => v.CorrelationId, new PublishEnvelope(_inputQueue)); _readDispatcher = new RequestResponseDispatcher <ClientMessage.ReadStreamEventsBackward, ClientMessage.ReadStreamEventsBackwardCompleted>( publisher, v => v.CorrelationId, v => v.CorrelationId, new PublishEnvelope(_inputQueue)); _projectionStateHandlerFactory = new ProjectionStateHandlerFactory(); _projections = new Dictionary <string, ManagedProjection>(); _projectionsMap = new Dictionary <Guid, string>(); _publishEnvelope = new PublishEnvelope(_inputQueue, crossThread: true); }
public ProjectionWorkerNode(TFChunkDb db, QueuedHandler inputQueue, ITimeProvider timeProvider, RunProjections runProjections) { _runProjections = runProjections; Ensure.NotNull(db, "db"); _coreOutput = new InMemoryBus("Core Output"); IPublisher publisher = CoreOutput; _subscriptionDispatcher = new PublishSubscribeDispatcher <ReaderSubscriptionManagement.Subscribe, ReaderSubscriptionManagement.ReaderSubscriptionManagementMessage, EventReaderSubscriptionMessage >(publisher, v => v.SubscriptionId, v => v.SubscriptionId); ; _eventReaderCoreService = new EventReaderCoreService( publisher, 10, db.Config.WriterCheckpoint, runHeadingReader: runProjections >= RunProjections.System); _feedReaderService = new FeedReaderService(_subscriptionDispatcher, timeProvider); if (runProjections >= RunProjections.System) { _projectionCoreService = new ProjectionCoreService(inputQueue, publisher, _subscriptionDispatcher, timeProvider); } }
public ProjectionWorkerNode(TFChunkDb db, QueuedHandler inputQueue, ITimeProvider timeProvider, RunProjections runProjections) { _runProjections = runProjections; Ensure.NotNull(db, "db"); _coreOutput = new InMemoryBus("Core Output"); IPublisher publisher = CoreOutput; _subscriptionDispatcher = new ReaderSubscriptionDispatcher(publisher); _spoolProcessingResponseDispatcher = new SpooledStreamReadingDispatcher(publisher); _ioDispatcher = new IODispatcher(publisher, new PublishEnvelope(inputQueue)); _eventReaderCoreService = new EventReaderCoreService( publisher, _ioDispatcher, 10, db.Config.WriterCheckpoint, runHeadingReader: runProjections >= RunProjections.System); _feedReaderService = new FeedReaderService(_subscriptionDispatcher, timeProvider); if (runProjections >= RunProjections.System) { _projectionCoreService = new ProjectionCoreService( inputQueue, publisher, _subscriptionDispatcher, timeProvider, _ioDispatcher, _spoolProcessingResponseDispatcher); } }
private void SetupMessaging( TFChunkDb db, QueuedHandler mainQueue, ISubscriber mainBus, TimerService timerService, ITimeProvider timeProvider, IHttpForwarder httpForwarder, HttpService[] httpServices, IPublisher networkSendQueue, RunProjections runProjections) { _coreQueues = new List<QueuedHandler>(); _managerInputBus = new InMemoryBus("manager input bus"); _managerInputQueue = new QueuedHandler(_managerInputBus, "Projections Master"); while (_coreQueues.Count < _projectionWorkerThreadCount) { var coreInputBus = new InMemoryBus("bus"); var coreQueue = new QueuedHandler( coreInputBus, "Projection Core #" + _coreQueues.Count, groupName: "Projection Core"); var projectionNode = new ProjectionWorkerNode(db, coreQueue, timeProvider, runProjections); projectionNode.SetupMessaging(coreInputBus); var forwarder = new RequestResponseQueueForwarder( inputQueue: coreQueue, externalRequestQueue: mainQueue); // forwarded messages projectionNode.CoreOutput.Subscribe<ClientMessage.ReadEvent>(forwarder); projectionNode.CoreOutput.Subscribe<ClientMessage.ReadStreamEventsBackward>(forwarder); projectionNode.CoreOutput.Subscribe<ClientMessage.ReadStreamEventsForward>(forwarder); projectionNode.CoreOutput.Subscribe<ClientMessage.ReadAllEventsForward>(forwarder); projectionNode.CoreOutput.Subscribe<ClientMessage.WriteEvents>(forwarder); if (runProjections >= RunProjections.System) { projectionNode.CoreOutput.Subscribe( Forwarder.Create<CoreProjectionManagementMessage.StateReport>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create<CoreProjectionManagementMessage.ResultReport>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create<CoreProjectionManagementMessage.StatisticsReport>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create<CoreProjectionManagementMessage.Started>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create<CoreProjectionManagementMessage.Stopped>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create<CoreProjectionManagementMessage.Faulted>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create<CoreProjectionManagementMessage.Prepared>(_managerInputQueue)); } projectionNode.CoreOutput.Subscribe(timerService); projectionNode.CoreOutput.Subscribe(Forwarder.Create<Message>(coreQueue)); // forward all coreInputBus.Subscribe(new UnwrapEnvelopeHandler()); _coreQueues.Add(coreQueue); } _managerInputBus.Subscribe( Forwarder.CreateBalancing<FeedReaderMessage.ReadPage>(_coreQueues.Cast<IPublisher>().ToArray())); _projectionManagerNode = ProjectionManagerNode.Create( db, _managerInputQueue, httpForwarder, httpServices, networkSendQueue, _coreQueues.Cast<IPublisher>().ToArray(), runProjections); _projectionManagerNode.SetupMessaging(_managerInputBus); { var forwarder = new RequestResponseQueueForwarder( inputQueue: _managerInputQueue, externalRequestQueue: mainQueue); _projectionManagerNode.Output.Subscribe<ClientMessage.ReadEvent>(forwarder); _projectionManagerNode.Output.Subscribe<ClientMessage.ReadStreamEventsBackward>(forwarder); _projectionManagerNode.Output.Subscribe<ClientMessage.ReadStreamEventsForward>(forwarder); _projectionManagerNode.Output.Subscribe<ClientMessage.WriteEvents>(forwarder); _projectionManagerNode.Output.Subscribe( Forwarder.Create<ProjectionManagementMessage.RequestSystemProjections>(mainQueue)); _projectionManagerNode.Output.Subscribe(Forwarder.Create<Message>(_managerInputQueue)); _projectionManagerNode.Output.Subscribe(timerService); // self forward all mainBus.Subscribe(Forwarder.Create<SystemMessage.StateChangeMessage>(_managerInputQueue)); _managerInputBus.Subscribe(new UnwrapEnvelopeHandler()); } }
private void SetupMessaging( TFChunkDb db, QueuedHandler mainQueue, ISubscriber mainBus, TimerService timerService, ITimeProvider timeProvider, IHttpForwarder httpForwarder, HttpService[] httpServices, IPublisher networkSendQueue, RunProjections runProjections) { _coreQueues = new List <QueuedHandler>(); _managerInputBus = new InMemoryBus("manager input bus"); _managerInputQueue = new QueuedHandler(_managerInputBus, "Projections Master"); while (_coreQueues.Count < _projectionWorkerThreadCount) { var coreInputBus = new InMemoryBus("bus"); var coreQueue = new QueuedHandler( coreInputBus, "Projection Core #" + _coreQueues.Count, groupName: "Projection Core"); var projectionNode = new ProjectionWorkerNode(db, coreQueue, timeProvider, runProjections); projectionNode.SetupMessaging(coreInputBus); var forwarder = new RequestResponseQueueForwarder( inputQueue: coreQueue, externalRequestQueue: mainQueue); // forwarded messages projectionNode.CoreOutput.Subscribe <ClientMessage.ReadEvent>(forwarder); projectionNode.CoreOutput.Subscribe <ClientMessage.ReadStreamEventsBackward>(forwarder); projectionNode.CoreOutput.Subscribe <ClientMessage.ReadStreamEventsForward>(forwarder); projectionNode.CoreOutput.Subscribe <ClientMessage.ReadAllEventsForward>(forwarder); projectionNode.CoreOutput.Subscribe <ClientMessage.WriteEvents>(forwarder); if (runProjections >= RunProjections.System) { projectionNode.CoreOutput.Subscribe( Forwarder.Create <CoreProjectionManagementMessage.StateReport>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create <CoreProjectionManagementMessage.ResultReport>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create <CoreProjectionManagementMessage.StatisticsReport>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create <CoreProjectionManagementMessage.Started>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create <CoreProjectionManagementMessage.Stopped>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create <CoreProjectionManagementMessage.Faulted>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create <CoreProjectionManagementMessage.Prepared>(_managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create <CoreProjectionManagementMessage.SlaveProjectionReaderAssigned>( _managerInputQueue)); projectionNode.CoreOutput.Subscribe( Forwarder.Create <ProjectionManagementMessage.ControlMessage>(_managerInputQueue)); } projectionNode.CoreOutput.Subscribe <TimerMessage.Schedule>(timerService); projectionNode.CoreOutput.Subscribe(Forwarder.Create <Message>(coreQueue)); // forward all coreInputBus.Subscribe(new UnwrapEnvelopeHandler()); _coreQueues.Add(coreQueue); } _managerInputBus.Subscribe( Forwarder.CreateBalancing <FeedReaderMessage.ReadPage>(_coreQueues.Cast <IPublisher>().ToArray())); _projectionManagerNode = ProjectionManagerNode.Create( db, _managerInputQueue, httpForwarder, httpServices, networkSendQueue, _coreQueues.Cast <IPublisher>().ToArray(), runProjections); _projectionManagerNode.SetupMessaging(_managerInputBus); { var forwarder = new RequestResponseQueueForwarder( inputQueue: _managerInputQueue, externalRequestQueue: mainQueue); _projectionManagerNode.Output.Subscribe <ClientMessage.ReadEvent>(forwarder); _projectionManagerNode.Output.Subscribe <ClientMessage.ReadStreamEventsBackward>(forwarder); _projectionManagerNode.Output.Subscribe <ClientMessage.ReadStreamEventsForward>(forwarder); _projectionManagerNode.Output.Subscribe <ClientMessage.WriteEvents>(forwarder); _projectionManagerNode.Output.Subscribe( Forwarder.Create <ProjectionManagementMessage.RequestSystemProjections>(mainQueue)); _projectionManagerNode.Output.Subscribe(Forwarder.Create <Message>(_managerInputQueue)); _projectionManagerNode.Output.Subscribe <TimerMessage.Schedule>(timerService); // self forward all mainBus.Subscribe(Forwarder.Create <SystemMessage.StateChangeMessage>(_managerInputQueue)); _managerInputBus.Subscribe(new UnwrapEnvelopeHandler()); } }