public StorageReaderService( IPublisher bus, ISubscriber subscriber, IReadIndex readIndex, int threadCount, IReadOnlyCheckpoint writerCheckpoint, QueueStatsManager queueStatsManager) { Ensure.NotNull(bus, "bus"); Ensure.NotNull(subscriber, "subscriber"); Ensure.NotNull(readIndex, "readIndex"); Ensure.Positive(threadCount, "threadCount"); Ensure.NotNull(writerCheckpoint, "writerCheckpoint"); _bus = bus; _readIndex = readIndex; _threadCount = threadCount; StorageReaderWorker[] readerWorkers = new StorageReaderWorker[threadCount]; InMemoryBus[] storageReaderBuses = new InMemoryBus[threadCount]; for (var i = 0; i < threadCount; i++) { readerWorkers[i] = new StorageReaderWorker(bus, readIndex, writerCheckpoint, i); storageReaderBuses[i] = new InMemoryBus("StorageReaderBus", watchSlowMsg: false); storageReaderBuses[i].Subscribe <ClientMessage.ReadEvent>(readerWorkers[i]); storageReaderBuses[i].Subscribe <ClientMessage.ReadStreamEventsBackward>(readerWorkers[i]); storageReaderBuses[i].Subscribe <ClientMessage.ReadStreamEventsForward>(readerWorkers[i]); storageReaderBuses[i].Subscribe <ClientMessage.ReadAllEventsForward>(readerWorkers[i]); storageReaderBuses[i].Subscribe <ClientMessage.ReadAllEventsBackward>(readerWorkers[i]); storageReaderBuses[i].Subscribe <ClientMessage.FilteredReadAllEventsForward>(readerWorkers[i]); storageReaderBuses[i].Subscribe <ClientMessage.FilteredReadAllEventsBackward>(readerWorkers[i]); storageReaderBuses[i].Subscribe <StorageMessage.BatchLogExpiredMessages>(readerWorkers[i]); storageReaderBuses[i].Subscribe <StorageMessage.EffectiveStreamAclRequest>(readerWorkers[i]); storageReaderBuses[i].Subscribe <StorageMessage.StreamIdFromTransactionIdRequest>(readerWorkers[i]); } _workersMultiHandler = new MultiQueuedHandler( _threadCount, queueNum => new QueuedHandlerThreadPool(storageReaderBuses[queueNum], string.Format("StorageReaderQueue #{0}", queueNum + 1), queueStatsManager, groupName: "StorageReaderQueue", watchSlowMsg: true, slowMsgThreshold: TimeSpan.FromMilliseconds(200))); _workersMultiHandler.Start(); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadEvent, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadStreamEventsBackward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadStreamEventsForward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadAllEventsForward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadAllEventsBackward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.FilteredReadAllEventsForward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.FilteredReadAllEventsBackward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <StorageMessage.BatchLogExpiredMessages, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <StorageMessage.EffectiveStreamAclRequest, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <StorageMessage.StreamIdFromTransactionIdRequest, Message>()); }
public StorageReaderService(IPublisher bus, ISubscriber subscriber, IReadIndex readIndex, int threadCount, ICheckpoint writerCheckpoint) { Ensure.NotNull(bus, "bus"); Ensure.NotNull(subscriber, "subscriber"); Ensure.NotNull(readIndex, "readIndex"); Ensure.Positive(threadCount, "threadCount"); Ensure.NotNull(writerCheckpoint, "writerCheckpoint"); _bus = bus; _readIndex = readIndex; _threadCount = threadCount; var readerWorker = new StorageReaderWorker(bus, readIndex, writerCheckpoint); var storageReaderBus = new InMemoryBus("StorageReaderBus", watchSlowMsg: false); storageReaderBus.Subscribe <ClientMessage.ReadEvent>(readerWorker); storageReaderBus.Subscribe <ClientMessage.ReadStreamEventsBackward>(readerWorker); storageReaderBus.Subscribe <ClientMessage.ReadStreamEventsForward>(readerWorker); storageReaderBus.Subscribe <ClientMessage.ReadAllEventsForward>(readerWorker); storageReaderBus.Subscribe <ClientMessage.ReadAllEventsBackward>(readerWorker); storageReaderBus.Subscribe <StorageMessage.CheckStreamAccess>(readerWorker); _workersMultiHandler = new MultiQueuedHandler( _threadCount, queueNum => new QueuedHandlerThreadPool(storageReaderBus, string.Format("StorageReaderQueue #{0}", queueNum + 1), groupName: "StorageReaderQueue", watchSlowMsg: true, slowMsgThreshold: TimeSpan.FromMilliseconds(200))); _workersMultiHandler.Start(); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadEvent, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadStreamEventsBackward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadStreamEventsForward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadAllEventsForward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <ClientMessage.ReadAllEventsBackward, Message>()); subscriber.Subscribe(_workersMultiHandler.WidenFrom <StorageMessage.CheckStreamAccess, Message>()); }