Search code examples
c#disruptor-pattern

Disruptor.NET example


I am trying to learn how to use the Disruptor.NET messaging framework, and I can't find any practical examples. There are quite a few articles out there with pictures about how it works, but I can't find anywhere that actually goes and shows you how to implement the methods. What would be an example?


Solution

  • Frustrated that I couldn't find a workable 'Hello World' for Disruptor-net, I fiddled around until I got one working. See below. The Console.WriteLine lines are handy for seeing how things work. For example, the RingBuffer creates each entry instance at start-up (which makes sense).

    Hopefully this helps anyone looking for help with Disruptor on .NET.

    using System;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;
    using Disruptor;
    using Disruptor.Dsl;
    
    namespace DisruptorTest
    {
        public sealed class ValueEntry
        {
            public long Value { get; set; }
    
            public ValueEntry()
            {
                Console.WriteLine("New ValueEntry created");
            }
        }
    
        public class ValueAdditionHandler : IEventHandler<ValueEntry>
        {
            public void OnNext(ValueEntry data, long sequence, bool endOfBatch)
            {
                Console.WriteLine("Event handled: Value = {0} (processed event {1}", data.Value, sequence);
            }
        }
    
        class Program
        {
            private static readonly Random _random = new Random();
            private static readonly int _ringSize = 16;  // Must be power of 2
    
            static void Main(string[] args)
            {
                var disruptor = new Disruptor.Dsl.Disruptor<ValueEntry>(() => new ValueEntry(), _ringSize, TaskScheduler.Default);    
                disruptor.HandleEventsWith(new ValueAdditionHandler());    
                var ringBuffer = disruptor.Start();    
                while (true)
                {
                    long sequenceNo = ringBuffer.Next();    
                    ValueEntry entry = ringBuffer[sequenceNo];    
                    entry.Value = _random.Next();    
                    ringBuffer.Publish(sequenceNo);    
                    Console.WriteLine("Published entry {0}, value {1}", sequenceNo, entry.Value);    
                    Thread.Sleep(250);
                }
            }
        }
    }