Esempio n. 1
0
        public void ShouldWaitForWorkCompleteWhereAllWorkersAreBlockedOnRingBuffer()
        {
            const long expectedNumberMessages = 10;

            FillRingBuffer(expectedNumberMessages);

            var workers = new StubEventProcessor[3];

            for (var i = 0; i < workers.Length; i++)
            {
                workers[i] = new StubEventProcessor(expectedNumberMessages - 1);
            }

            var dependencyBarrier = _ringBuffer.NewBarrier(DisruptorUtil.GetSequencesFor(workers));

            Task.Run(() =>
            {
                var sequence = _ringBuffer.Next();
                _ringBuffer[sequence].Value = (int)sequence;
                _ringBuffer.Publish(sequence);

                foreach (var stubWorker in workers)
                {
                    stubWorker.Sequence.SetValue(sequence);
                }
            });

            const long expectedWorkSequence  = expectedNumberMessages;
            var        completedWorkSequence = dependencyBarrier.WaitFor(expectedNumberMessages);

            Assert.IsTrue(completedWorkSequence >= expectedWorkSequence);
        }
Esempio n. 2
0
        public void ShouldWaitForWorkCompleteWhereCompleteWorkThresholdIsBehind()
        {
            const long expectedNumberMessages = 10;

            FillRingBuffer(expectedNumberMessages);

            var eventProcessors = new StubEventProcessor[3];

            for (var i = 0; i < eventProcessors.Length; i++)
            {
                eventProcessors[i] = new StubEventProcessor(expectedNumberMessages - 2);
            }

            var eventProcessorBarrier = _ringBuffer.NewBarrier(DisruptorUtil.GetSequencesFor(eventProcessors));

            Task.Factory.StartNew(() =>
            {
                foreach (var stubWorker in eventProcessors)
                {
                    stubWorker.Sequence.SetValue(stubWorker.Sequence.Value + 1);
                }
            }).Wait();

            const long expectedWorkSequence  = expectedNumberMessages - 1;
            var        completedWorkSequence = eventProcessorBarrier.WaitFor(expectedWorkSequence);

            Assert.IsTrue(completedWorkSequence >= expectedWorkSequence);
        }
Esempio n. 3
0
        /// <summary>
        /// Set up custom event processors to handle events from the ring buffer. The disruptor will
        /// automatically start this processors when <see cref="Start"/> is called.
        ///
        /// This method can be used as the start of a chain. For example if the processor <code>A</code> must
        /// process events before handler<code>B</code>:
        /// <code>dw.HandleEventsWith(A).Then(B);</code>
        /// </summary>
        /// <param name="processors">processors the event processors that will process events</param>
        /// <returns>a <see cref="ValueEventHandlerGroup{T}"/> that can be used to chain dependencies.</returns>
        public ValueEventHandlerGroup <T> HandleEventsWith(params IEventProcessor[] processors)
        {
            foreach (var processor in processors)
            {
                _consumerRepository.Add(processor);
            }

            var sequences = new ISequence[processors.Length];

            for (int i = 0; i < processors.Length; i++)
            {
                sequences[i] = processors[i].Sequence;
            }

            _ringBuffer.AddGatingSequences(sequences);

            return(new ValueEventHandlerGroup <T>(this, _consumerRepository, DisruptorUtil.GetSequencesFor(processors)));
        }
Esempio n. 4
0
 /// <summary>
 /// Create a group of event processors to be used as a dependency.
 /// </summary>
 /// <see cref="After(IValueEventHandler{T}[])"/>
 /// <param name="processors">processors the event processors, previously set up with <see cref="HandleEventsWith(IValueEventHandler{T}[])"/>,
 /// that will form the barrier for subsequent handlers or processors.</param>
 /// <returns>an <see cref="ValueEventHandlerGroup{T}"/> that can be used to setup a <see cref="ISequenceBarrier"/> over the specified event processors.</returns>
 public ValueEventHandlerGroup <T> After(params IEventProcessor[] processors)
 {
     return(new ValueEventHandlerGroup <T>(this, _consumerRepository, DisruptorUtil.GetSequencesFor(processors)));
 }