Example #1
0
        public EventHandlerGroup <T> CreateEventProcessors(
            ISequence[] barrierSequences,
            IEventHandler <T>[] eventHandlers)
        {
            CheckNotStarted();

            var processorSequences = new ISequence[eventHandlers.Length];
            var barrier            = _ringBuffer.NewBarrier(barrierSequences);

            for (var i = 0; i < eventHandlers.Length; i++)
            {
                var eventHandler        = eventHandlers[i];
                var batchEventProcessor = new BatchEventProcessor <T>(_ringBuffer, barrier, eventHandler);

                if (_exceptionHandler != null)
                {
                    batchEventProcessor.SetExceptionHandler(_exceptionHandler);
                }

                _consumerRepository.Add(batchEventProcessor, eventHandler, barrier);
                processorSequences[i] = batchEventProcessor.GetSequence();
            }

            UpdateGatingSequencesForNextInChain(barrierSequences, processorSequences);
            return(new EventHandlerGroup <T>(this, _consumerRepository, processorSequences));
        }
Example #2
0
        internal EventHandlerGroup <T> CreateEventProcessors(ISequence[] barrierSequences, IEventHandler <T>[] eventHandlers)
        {
            CheckNotStarted();

            var processorSequences = new List <ISequence>(eventHandlers.Length);
            var barrier            = _ringBuffer.NewBarrier(barrierSequences);

            foreach (var eventHandler in eventHandlers)
            {
                var batchEventProcessor = new BatchEventProcessor <T>(_ringBuffer, barrier, eventHandler);
                if (_exceptionHandler != null)
                {
                    batchEventProcessor.SetExceptionHandler(_exceptionHandler);
                }

                _consumerRepository.Add(batchEventProcessor, eventHandler, barrier);
                processorSequences.Add(batchEventProcessor.Sequence);
            }

            if (processorSequences.Count > 0)
            {
                _consumerRepository.UnMarkEventProcessorsAsEndOfChain(barrierSequences);
            }

            return(new EventHandlerGroup <T>(this, _consumerRepository, processorSequences));
        }
Example #3
0
        internal EventHandlerGroup <T> CreateEventProcessors(IEventProcessor[] barrierEventProcessors,
                                                             IEventHandler <T>[] eventHandlers, long startSequence = Sequencer.InitialCursorValue)
        {
            CheckNotStarted();

            var createdEventProcessors = new IEventProcessor[eventHandlers.Length];
            ISequenceBarrier barrier   = _ringBuffer.NewBarrier(Util.GetSequencesFor(barrierEventProcessors));

            for (int i = 0; i < eventHandlers.Length; i++)
            {
                var eventHandler = eventHandlers[i];

                var batchEventProcessor = new BatchEventProcessor <T>(_ringBuffer, barrier, eventHandler, startSequence);

                if (_exceptionHandler != null)
                {
                    batchEventProcessor.SetExceptionHandler(_exceptionHandler);
                }

                _eventProcessorRepository.Add(batchEventProcessor, eventHandler, barrier);
                createdEventProcessors[i] = batchEventProcessor;
            }

            if (createdEventProcessors.Length > 0)
            {
                _eventProcessorRepository.UnmarkEventProcessorsAsEndOfChain(barrierEventProcessors);
            }

            return(new EventHandlerGroup <T>(this, _eventProcessorRepository, createdEventProcessors));
        }
        public void ShouldThrowExceptionOnSettingNullExceptionHandler()
        {
            var eventHandler        = new ActionEventHandler <StubEvent>(x => throw new NullReferenceException());
            var batchEventProcessor = new BatchEventProcessor <StubEvent>(_ringBuffer, _sequenceBarrier, eventHandler);

            Assert.Throws <ArgumentNullException>(() => batchEventProcessor.SetExceptionHandler(null));
        }
        public EventHandlerGroup <T> CreateEventProcessors(Sequence[] barrierSequences,
                                                           IEventHandler <T>[] eventHandlers)
        {
            CheckNotStarted();

            var processorSequences = new Sequence[eventHandlers.Length];
            var barrier            = ringBuffer.NewBarrier(barrierSequences);

            for (int i = 0, eventHandlersLength = eventHandlers.Length; i < eventHandlersLength; i++)
            {
                IEventHandler <T> eventHandler = eventHandlers[i];

                BatchEventProcessor <T> batchEventProcessor = new BatchEventProcessor <T>(ringBuffer, barrier, eventHandler);

                if (exceptionHandler != null)
                {
                    batchEventProcessor.SetExceptionHandler(exceptionHandler);
                }

                consumerRepository.Add(batchEventProcessor, eventHandler, barrier);
                processorSequences[i] = batchEventProcessor.Sequence;
            }

            if (processorSequences.Length > 0)
            {
                consumerRepository.UnMarkEventProcessorsAsEndOfChain(barrierSequences);
            }

            return(new EventHandlerGroup <T>(this, consumerRepository, processorSequences));
        }
        public void ShouldCallExceptionHandlerOnUncaughtException()
        {
            var exceptionSignal     = new CountdownEvent(1);
            var exceptionHandler    = new ActionExceptionHandler <StubEvent>(x => exceptionSignal.Signal());
            var eventHandler        = new ActionEventHandler <StubEvent>(x => throw new NullReferenceException());
            var batchEventProcessor = new BatchEventProcessor <StubEvent>(_ringBuffer, _sequenceBarrier, eventHandler);

            _ringBuffer.AddGatingSequences(batchEventProcessor.Sequence);

            batchEventProcessor.SetExceptionHandler(exceptionHandler);

            var task = Task.Run(() => batchEventProcessor.Run());

            _ringBuffer.Publish(_ringBuffer.Next());

            Assert.IsTrue(exceptionSignal.Wait(TimeSpan.FromSeconds(2)));

            batchEventProcessor.Halt();

            Assert.IsTrue(task.Wait(500));
        }
Example #7
0
 public void ShouldThrowExceptionOnSettingNullExceptionHandler()
 {
     _batchEventProcessor.SetExceptionHandler(null);
 }
        public void Should_Throw_Exception_On_Setting_Null_Exception_Handler()
        {
            var processor = new BatchEventProcessor <StubEvent>(_ringBuffer, _barrier, null, _exceptionHandler);

            Assert.Throws <ArgumentNullException>(() => { processor.SetExceptionHandler(null); });
        }