.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)咨询.
.Net下RabbitMQ发布订阅模式实践的更多相关文章
- RabbitMQ 发布订阅
互联网公司对消息队列是深度使用者,因此需要我们了解消息队列的方方面面,良好的设计及深入的理解,更有利于我们对消息队列的规划. 当前我们使用消息队列中发现一些问题: 1.实际上是异步无返回远程调用,由发 ...
- Go RabbitMQ(三)发布订阅模式
RabbitMQ 在上一节中我们创建了工作队列,并且假设每一个任务都能够准确的到达对应的worker.在本节中我们将介绍如何将一个消息传递到多个消费者,这也就是所说的发布订阅模式 为了验证该模式我们使 ...
- RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)
在上一章中,我们创建了一个工作队列,工作队列模式的设想是每一条消息只会被转发给一个消费者.本章将会讲解完全不一样的场景: 我们会把一个消息转发给多个消费者,这种模式称之为发布-订阅模式. 为了阐述这个 ...
- RabbitMQ六种队列模式-发布订阅模式
前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅 [本文]RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
- RabbitMQ入门学习系列(四) 发布订阅模式
发布订阅模式 什么时发布订阅模式 把消息发送给多个订阅者.也就是有多个消费端都完整的接收生产者的消息 换句话说 把消息广播给多个消费者 消息模型的核心 RabbitMQ不发送消息给队列,生产者也不知道 ...
- RabbitMQ学习第三记:发布/订阅模式(Publish/Subscribe)
工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有 ...
- RabbitMQ/JAVA (发布/订阅模式)
发布/订阅模式即生产者将消息发送给多个消费者. 下面介绍几个在发布/订阅模式中的关键概念-- 1. Exchanges (转发器) 可能原来我们都是基于一个队列发送和接收消息.现在介绍一下完整的消息传 ...
- python使用rabbitMQ介绍三(发布订阅模式)
一.模式介绍 在前面的例子中,消息直接发送到queue中. 现在介绍的模式,消息发送到exchange中,消费者把队列绑定到exchange上. 发布-订阅模式是把消息广播到每个消费者,每个消费者接收 ...
- 《JavaScript设计模式与开发实践》笔记第八章 发布-订阅模式
第八章 发布-订阅模式 发布-订阅模式描述 发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于 ...
随机推荐
- SQL优化小结
一 背景 客户数据库经常出现死锁.超时.查询慢等问题,数据库mssql,数据量主要表大概上千W. 二 收集信息 首先是要找出IO大.查询慢.使用频率高的脚本.直接用Profiler ...
- php基本语法与函数
1.标记与注释 <?php 代码 ?> 用/* */注释一段代码, 用 // 注释一行代码 /** */文档注释 注意:若php下面只有php代码没有别的代码,那么最好不要加 ...
- rail模型
rail是一种以用户为中心的性能模型,又google提出,其主要目标是让用户满意,主要分为response animation idle load四个部分 response 输入延迟时间小于100毫秒 ...
- 大话设计模式--访问者模式 Visitor -- C++实现实例
1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...
- Android_微信_设置
减少 内存的使用 (http://news.ifeng.com/a/20170716/51440541_0.shtml) 1.关闭“附近的人” 打开微信,依次点击[我]—[设置]—[通用]—[功能], ...
- Hadoop- DistCp(分布式拷贝)
在实际的生产环境中,我们的企业都有测试集群和生产集群,有的比较大型的企业有多个版本的Hadoop 大数据集群,这时候有个这样的需求,各个集群上的资源需要进行迁移,比如说一些生产集群需要一些测试集群的数 ...
- BZOJ 1562 [NOI2009]变换序列:二分图匹配
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1562 题意: 给定n,定义D(x,y) = min(|x-y|, n-|x-y|),然后 ...
- 关于c++中命名空间namespace
一.定义命名空间: 步骤一:在.h文件中:namespace ns{.......}//将定义的类和全局变量,全局函数写入花括号内. 步骤二:在.cpp文件中: using namespace ns ...
- linux命令学习笔记(50):crontab命令
前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...
- ffmpeg代码实现自定义encoder
1.概述 本文主要讲述如何用ffmpeg代码实现自己的encoder. 2.代码 /* *本程序主要实现一个自己的encoder并加入到encoder链中去,供api调用 *作者:缪国凯(MK) *8 ...