zoukankan      html  css  js  c++  java
  • .Net下RabbitMQ发布订阅模式实践

    一、概念
    AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
    AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。(很多信息网上都有,大伙可以自己去看看)

    二、Linux安装RabbitMQ(基于CentOS7)

    1、erlang安装

    rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
    yum install erlang
    

      

    2、安装RabbitMQ

    wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.8/rabbitmq-server-3.6.8-1.el7.noarch.rpm
    yum install rabbitmq-server-3.6.6-1.el7.noarch.rpm 
    service rabbitmq-server start
    

      

    3、配置RabbitMQ配置文件

       首次安装需要自己创建配置文件

    cd /etc/rabbitmq/
    vim rabbitmq.config
    

       写入以下内容:

    [{rabbit, [{loopback_users, []}]}].
    

    这样就可以用guest进行远程访问了,更加详细的信息,大家自己再百度百度,如何不能访问的话,可以尝试关闭防火墙再试试

    4、开启管理UI

    rabbitmq-plugins enable rabbitmq_management
    

         开启后访问以下地址:

    http://192.168.10.97:15672/#/
    

    通过这个UI工具可以更好的管理RabbitMQ

    三、.Net下开发RabbitMQ

    1、配置Exchange以及Queue

      新建一个exchange,如下 所示:

      新建一个queue,如下所示;

      创建exchange以及queue的对应关系:

    2、接收端代码

            private void Form2_Load(object sender, EventArgs e)
            {
                var factory = new ConnectionFactory();
                factory.UserName = "guest";
                factory.Password = "guest";
                factory.HostName = "192.168.10.97";
                factory.AutomaticRecoveryEnabled = true;
                var connection = factory.CreateConnection();
    
                var channel = connection.CreateModel();
    
                var consumer = new RabbitMQ.Client.Events.EventingBasicConsumer(channel);
                consumer.ConsumerTag = "11111111111";
                consumer.Received += Consumer_Received;
                channel.BasicConsume(queue: "hello",
                            noAck: true,
                            consumer: consumer);
            }
    
            private void Consumer_Received(object sender, RabbitMQ.Client.Events.BasicDeliverEventArgs e)
            {
                MessageBox.Show(Encoding.UTF8.GetString(e.Body));
            }
    

      

     PS:特别注意AutomaticRecoveryEnabled树形必须设置为true,否则再接收到一次数据后,后面就不会再接收到数据了(被这个坑了一天)

    3、发送端代码

     private void button1_Click(object sender, EventArgs e)
            {
                var factory = new ConnectionFactory();
                factory.UserName = "guest";
                factory.Password = "guest";
                factory.HostName = "192.168.10.97";
                using (var connection = factory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        channel.BasicPublish("hello_e", "hello", null, Encoding.UTF8.GetBytes(DateTime.Now.ToString()));
                    }
                }
            }
    

     4、程序运行效果

    点击按钮之后,弹出了messagebox,证明数据监听到了,有些时候大概有几秒的延迟,不过本身异步处理主要是保证最终一致性,所以也无所谓

    源码下载地址:https://pan.baidu.com/s/1nvhp0MH

    如部分文档有侵权,请联系:568898448

    参考文档:安装过程参考http://www.cnblogs.com/uptothesky/p/6094357.html

    作者: 因致研发官方博客

    出处: http://www.cnblogs.com/yizitrd/>

    关于公司:专注制造业MES系统,也开始涉足工业互联网相关

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(hongjb@yizit.com)咨询.

  • 相关阅读:
    jquery全屏幻灯轮播焦点图
    PHP curl 上传文件版本兼容问题
    一个网站同一域名不同目录下的文件访问到的cookie值不同是什么原因?
    Linux系统查找清理磁盘大文件方法
    REDIS常用命令
    CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法
    centos6 编译安装nodejs4.3
    centos yum安装php5.6.19 remi源按照
    Mac下用brew搭建PHP(LNMP/LAMP)开发环境
    为什么JAVA要提供 wait/notify 机制?是为了避免轮询带来的性能损失
  • 原文地址:https://www.cnblogs.com/yizitrd/p/6590593.html
Copyright © 2011-2022 走看看