Disruptor.NET example
Asked Answered
R

2

28

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?

Rozanna answered 14/1, 2012 at 6:52 Comment(3)
This question might lead you to some information you haven't seen yet: #6933847Discommodity
The official project wiki has some information.Rusch
The one code example on their seems to be outdated - for instance, I can't find the interface "IBatchHandler" anywhere in the current build and the parameters of the RingBuffer seems to have entirely different parameters. It would seem that the official site has moved to GitHub but I can't find any additional examples/documentations on the site (but I'm not sure if I am doing it correctly) - github.com/odeheurles/Disruptor-net#readmeRozanna
F
33

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);
            }
        }
    }
}
Find answered 2/4, 2012 at 16:42 Comment(5)
also can you add note how to run it? what dll should I add to a project? should I download them somewhere or I should build them myself?Linolinocut
also can someone explaing an example? why it's better than standard .net libriries? how many threads are involved? just one? i don't see any threads creation.Linolinocut
Most people using the disruptor pattern would likely be using a three stage pipeline, so it would be nice with an example with an Input Disruptor and an Output Disruptor.Latrena
The comment for _ringSize is wrong. The value should be a power of 2, not a multiple of 2.Grotius
Thanks @tzachs, updated the answer with correct comment on _ringSize.Find
D
4

There is a detailed blog post on the Disruptor pattern, The Latency Issue. It demonstrates how to get started and use the Disruptor in detail.

Dulcie answered 27/11, 2012 at 13:12 Comment(3)
This link is stale. New link is tradesharp.se/…Gorden
New link is stale too.Whitefish
web.archive.org/web/20160726004920/http://tradesharp.se:80/…Object

© 2022 - 2024 — McMap. All rights reserved.