RabbitMQ .NET消息队列使用入门(一)【简单示例】-程序员宅基地

技术标签: 大数据  

首先下载安装包,我都环境是win7 64位:

去官网下载 otp_win64_19.0.exe 和rabbitmq-server-3.6.3.exe安装好

然后开始编程了:

(1)创建生产者类:

  class Program
    {
        private static void Main()
        {
            //建立RabbitMQ连接和通道
            var connectionFactory = new ConnectionFactory
            {
                HostName = "127.0.0.1",
                Port = 5672,
                UserName = "guest",
                Password = "guest",
                Protocol = Protocols.DefaultProtocol,
                AutomaticRecoveryEnabled = true, //自动重连
                RequestedFrameMax = UInt32.MaxValue,
                RequestedHeartbeat = UInt16.MaxValue //心跳超时时间
            };
            try
            {
                using (var connection = connectionFactory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        //创建一个新的,持久的交换区
                        channel.ExchangeDeclare("SISOExchange", ExchangeType.Direct, true, false, null);
                        //创建一个新的,持久的队列, 没有排他性,与不自动删除
                        channel.QueueDeclare("SISOqueue", true, false, false, null);
                        // 绑定队列到交换区
                        channel.QueueBind("SISOqueue", "SISOExchange", "optionalRoutingKey");

                        // 设置消息属性
                        var properties = channel.CreateBasicProperties();
                        properties.DeliveryMode = 2; //消息是持久的,存在并不会受服务器重启影响 

                        //准备开始推送
                        //发布的消息可以是任何一个(可以被序列化的)字节数组,如序列化对象,一个实体的ID,或只是一个字符串
                        var encoding = new UTF8Encoding();
                        for (var i = 0; i < 10; i++)
                        {
                            var msg = string.Format("这是消息 #{0}?", i + 1);
                            var msgBytes = encoding.GetBytes(msg);
                            //RabbitMQ消息模型的核心思想就是,生产者不把消息直接发送给队列。实际上,生产者在很多情况下都不知道消息是否会被发送到一个队列中。取而代之的是,生产者将消息发送到交换区。交换区是一个非常简单的东西,它一端接受生产者的消息,另一端将他们推送到队列中。交换区必须要明确的指导如何处理它接受到的消息。是放到一个队列中,还是放到多个队列中,亦或是被丢弃。这些规则可以通过交换区的类型来定义。
                            //可用的交换区类型有:direct,topic,headers,fanout。
                            //Exchange:用于接收消息生产者发送的消息,有三种类型的exchange:direct, fanout,topic,不同类型实现了不同的路由算法;
                            //RoutingKey:是RabbitMQ实现路由分发到各个队列的规则,并结合Binging提供于Exchange使用将消息推送入队列;
                            //Queue:是消息队列,可以根据需要定义多个队列,设置队列的属性,比如:消息移除、消息缓存、回调机制等设置,实现与Consumer通信;
                            channel.BasicPublish("SISOExchange", "optionalRoutingKey", properties, msgBytes);
                        }
                        channel.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.WriteLine("消息发布!");
            Console.ReadKey(true);
        }
    }

(2)创建消费者类:

 class Program
    {
        private static void Main()
        {
            // 建立RabbitMQ连接和通道
            var connectionFactory = new ConnectionFactory
            {
                HostName = "127.0.0.1",
                Port = 5672,
                UserName = "guest",
                Password = "guest",
                Protocol = Protocols.AMQP_0_9_1,
                RequestedFrameMax = UInt32.MaxValue,
                RequestedHeartbeat = UInt16.MaxValue
            };

            using (var connection = connectionFactory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                // 这指示通道不预取超过1个消息
                channel.BasicQos(0, 1, false);

                //创建一个新的,持久的交换区
                channel.ExchangeDeclare("SISOExchange", ExchangeType.Direct, true, false, null);
                //创建一个新的,持久的队列
                channel.QueueDeclare("sample-queue", true, false, false, null);
                //绑定队列到交换区
                channel.QueueBind("SISOqueue", "SISOExchange", "optionalRoutingKey");
                using (var subscription = new Subscription(channel, "SISOqueue", false))
                {
                    Console.WriteLine("等待消息...");
                    var encoding = new UTF8Encoding();
                    while (channel.IsOpen)
                    {
                        BasicDeliverEventArgs eventArgs;
                        var success = subscription.Next(2000, out eventArgs);
                        if (success == false) continue;
                        var msgBytes = eventArgs.Body;
                        var message = encoding.GetString(msgBytes);
                        Console.WriteLine(message);
                        channel.BasicAck(eventArgs.DeliveryTag, false);
                    }
                }
            }
        }
    }

消费者--结果如图:

458212-20170608220102528-2098610708.png

转载于:https://www.cnblogs.com/Wulex/p/6965023.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a879086/article/details/101842793

智能推荐

.pdb文件详解+“.pdb”中的 PDB 格式不兼容;请删除并重新生成”解决办法_pdb格式不兼容-程序员宅基地

对于问题:“.pdb”中的 PDB 格式不兼容;请删除并重新生成”根据路径提示将文件删除,重新编译生成即可解决问题~转自http://www.cnblogs.com/lidabo/p/3486114.html.pdb文件,是VS生成的用于调试的符号文件(program database),保存着调试的信息。在VS的工程属性,C/C++,调试信息格式,设置/Zi,那么VS就会在构建项目时..._pdb格式不兼容

Safari打不开github,速度很慢_safari浏览器打不开github-程序员宅基地

尝试用谷歌浏览器打开_safari浏览器打不开github

Linux网络设备驱动模块——虚拟网卡virnet-程序员宅基地

新建目录和文件$ mkdir virnet$ cd virnet$ touch virnet.c$ touch Makefile添加以下内容到virnet.c文件#include &amp;amp;lt;linux/module.h&amp;amp;gt;#include &amp;amp;lt;linux/errno.h&amp;amp;gt;#include &amp;amp;lt;linux/netdevice.h&amp;amp;gt

安卓6.0系统权限问题android.permission.WRITE_SETTINGS-程序员宅基地

关于“Android.permission.WRITE_SETTINGS”的权限,申请,判断精简代码如下:if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(!Settings.System.canWrite(this)){ Intent in_android.permission.write_settings

AdaBoost中利用Haar特征进行人脸识别算法分析与总结_adaboostcasde-程序员宅基地

提到AdaBoost的人脸识别,不得不提的几篇大牛的文章可以看看,但是大牛的文章一般都是只有主要的算法框架,没有详细的说明。大牛论文推荐:1. Robust Real-time Object Detection, Paul Viola, Michael Jones2. Rapid Object Detection using a Boosted Cascade of Sim_adaboostcasde

随便推点

VHDL操作符_vhdl rem-程序员宅基地

VHDL操作符按照算数优先级排序:混合运算符 (miscellaneous operators): 乘方 ** 取绝对值 abs 非 not 求积运算符(multiplying operators): 乘 * 除 / 取模 mod 取余 rem 符号运算符(sign operators): 正 + 负 - 加法运算符(adding opera..._vhdl rem

iview中table返回的标签设置禁用-程序员宅基地

iview中自己不知到的知识问题,在export中render返回的Button标签怎么根据状态禁用欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Mark...

swoft 使用 swoftcli.phar-程序员宅基地

php swoftcli.phar run -cd http:restart_swoftcli.phar

深入dubbo内核(3):本地服务暴露-程序员宅基地

服务发布原理观察dubbo服务发布时的启动日志[DUBBO] The service ready on spring started. service: com.alibaba.dubbo.demo.DemoService, dubbo version: 2.0.0, current host: 127.0.0.1// 第一步:暴露本地服务[DUBBO] Export dubbo ...

pip使用国内源_pyarrow模块下载-程序员宅基地

阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/豆瓣(douban) http://pypi.douban.com/simple/清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/以安装pyarrow包为例pip install p_pyarrow模块下载

Android ActionBar使用方法-程序员宅基地

到沙龙图书源码获取下载豆周刊淘帖心情墙 帖子搜索热搜:二维码聊天二维码扫描传感器游戏定位手势绘图小项目相框绘图涂鸦拨打电话记事本定时器通话记录短信群发listview音乐播放器项目例子百度地图Android开发论坛 - 安卓开发论坛 - Android

推荐文章

热门文章

相关标签