Disruptor.net的用法

Disruptor据说是最快的并发消息处理器。我今天学习了下,有了一个初步的了解。
Disruptor可以当做队列使用,不过可以支持多消费者,既一条生产者的消息可以提供给多个消费者同时使用。
gethub 安装 Install-Package Disruptor -Version 3.3.7

我们添加一个实体类,这个类的主要是生产者和消费者的信息载体

public sealed class CmdEntry
{
    public string Cmd { get; set; }
}

我们增加一个类实现IEventHandler接口,这个类的作用相当于消费者触发口,也可以当作消费者。

public class ExecuteCmdHandler : IEventHandler<CmdEntry>
{
    public void OnNext(CmdEntry data, long sequence, bool endOfBatch)
    {
        Console.WriteLine("this is CmdHandler0 Cmd = {0} (index:{1})", data.Cmd, sequence);

    }
}

然后我们添加一个窗体界面。并生成生产者信息。

public partial class MainWindow : Window
{

    RingBuffer<CmdEntry> _ringBuffer;
    public MainWindow()
    {
        InitializeComponent();
       var disruptor = new Disruptor<CmdEntry>(() => new CmdEntry(), 512, TaskScheduler.Default);

       disruptor.HandleEventsWith(new ExecuteCmdHandler());
       //disruptor.HandleEventsWith(new ExecuteCmdHandler1());

       _ringBuffer = disruptor.Start();


       Thread tr = new Thread(Product);
       tr.Start();
     
    }

    private void Product(object o)
    {

        int i = 0;
        while (i<500)
        {
            long index = _ringBuffer.Next();
            var entity = _ringBuffer[index];
            entity.Cmd = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff");
            _ringBuffer.Publish(index);
            Thread.Sleep(1);
            i = i + 1;
        }

    }

}

运行


image.png

如果我们有多个消费者,只需要在实现IEventHandler接口

public class ExecuteCmdHandler1 : IEventHandler<CmdEntry>
{
    public void OnNext(CmdEntry data, long sequence, bool endOfBatch)
    {
        Console.WriteLine("this is CmdHandler1 Cmd = {0} (index:{1})", data.Cmd, sequence);
    }
}

然后再通过Disruptor对象的HandleEventsWith方法添加进去


image.png

运行,从结果可以看出,两个消费者是并行处理。


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,908评论 18 139
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,262评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,088评论 0 4
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,948评论 6 342
  • 甜美风自然就是穿搭起来让人感觉很可爱,漂亮!那么为什么很多MM喜欢甜美风的穿搭,哈哈,喜欢甜美还需要理由吗!
    还有谁叫color阅读 347评论 0 0