Exemple #1
0
        public void ShouldAddEventProcessorsAfterPublishing()
        {
            var rb = _disruptor.GetRingBuffer();

            var b1 = new BatchEventProcessor <TestEvent>(rb, rb.NewBarrier(), new SleepingEventHandler());
            var b2 = new BatchEventProcessor <TestEvent>(rb, rb.NewBarrier(b1.GetSequence()), new SleepingEventHandler());
            var b3 = new BatchEventProcessor <TestEvent>(
                rb, rb.NewBarrier(b2.GetSequence()), new SleepingEventHandler());

            Assert.Equal(b1.GetSequence().GetValue(), -1L);
            Assert.Equal(b2.GetSequence().GetValue(), -1L);
            Assert.Equal(b3.GetSequence().GetValue(), -1L);

            rb.Publish(rb.Next());
            rb.Publish(rb.Next());
            rb.Publish(rb.Next());
            rb.Publish(rb.Next());
            rb.Publish(rb.Next());
            rb.Publish(rb.Next());

            _disruptor.HandleEventsWith(b1, b2, b3);

            Assert.Equal(5L, b1.GetSequence().GetValue());
            Assert.Equal(5L, b2.GetSequence().GetValue());
            Assert.Equal(5L, b3.GetSequence().GetValue());
        }
Exemple #2
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));
        }
        public void Should_Call_Exception_Handler_On_Uncaught_Exception()
        {
            var exceptionLatch   = new CountdownEvent(1);
            var exceptionHandler = new LatchExceptionHandler(exceptionLatch);
            var processor        = new BatchEventProcessor <StubEvent>(_ringBuffer, _barrier, new ExceptionEventHandler(), exceptionHandler);

            _ringBuffer.AddGatingSequences(processor.GetSequence());

            var thread = new Thread(() => processor.Run());

            thread.Start();

            _ringBuffer.Publish(_ringBuffer.Next());

            Assert.True(exceptionLatch.Wait(TimeSpan.FromSeconds(2000)));

            processor.Halt();
            thread.Join();
        }
        public void Should_Call_Methods_In_Lifecycle_Order_For_Batch()
        {
            var eventLatch   = new CountdownEvent(3);
            var eventHandler = new LatchEventHandler(eventLatch);
            var processor    = new BatchEventProcessor <StubEvent>(_ringBuffer, _barrier, eventHandler, _exceptionHandler);

            _ringBuffer.AddGatingSequences(processor.GetSequence());

            _ringBuffer.Publish(_ringBuffer.Next());
            _ringBuffer.Publish(_ringBuffer.Next());
            _ringBuffer.Publish(_ringBuffer.Next());

            var thread = new Thread(() => processor.Run());

            thread.Start();

            Assert.True(eventLatch.Wait(TimeSpan.FromSeconds(2)));

            processor.Halt();
            thread.Join();
        }