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()); }
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(); }