Centos7 minimal 系列之rabbitmq的理解(九)
一、前言
传送门:rabbitmq安装
第一次接触消息队列,有很多不熟悉的地方,可能也有很多写的不对的,大家一起学习。
RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统。
使用场景:在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
二、名词解释
Exchange:消息交换机,它指定消息按照什么规则,路由到那个队列。(类型:Direct,Fanout,Topic)
Queue:消息队列载体,每个消息都会被投入到一个或者多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange会根据这个关键字进行消息投递。
producer:消息生成着,就是投递消息的程序。
consumer:消息消费着,就是接收消息的程序。
channel:消息通道,在客户端的每个连接里,可以建立多个channel,每个channel代表一个任务会话。
由exchange,queue,routingkey三个才能决定一个exchange到queue的唯一路线。
三、Exchange类型
类型有4种,direct,fanout,topic,headers。其中headers不常用,本篇不做介绍,其他三种类型,会做详细介绍。
Direct Exchange – 处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。

Fanout Exchange – 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。

Topic Exchange – 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。我在RedHat的朋友做了一张不错的图,来表明topic交换机是如何工作的:

注:这种情况下队列会收到所有路由器中符合topic规则的消息
四、流程


发送端:
using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Client
{
class Send
{
static void Main(string[] args)
{
//1、创建连接实例
var factory = new ConnectionFactory()
{
HostName = "168.33.162.245",
UserName = "dirk",
Password = "wangjun1234"
};
//2、打开连接
using (var connection = factory.CreateConnection())
{
//3、打开一个通道,该通道可以用来发送和接收消息
using (var channel = connection.CreateModel())
{
//4、队列参数设置
channel.QueueDeclare(queue: "sqls",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
//5、发送的消息
string message = "select * from dual where asdfsa";
var body = Encoding.UTF8.GetBytes(message);
//6、指定消息属性
var properties = channel.CreateBasicProperties();
//持久的
properties.Persistent = true;
properties.DeliveryMode = 2;
// 设置过期时间
properties.Expiration = "36000";
//7、发送消息
channel.BasicPublish(exchange: "topic",
routingKey: "sqls",
basicProperties: properties,
body: body);
Console.WriteLine(" Send {0}", message);
}
Console.WriteLine("消息发送成功!!!");
Console.ReadLine();
}
}
}
}
接收端:
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace Receive
{
class Receive
{
static void Main(string[] args)
{
var factory = new ConnectionFactory() {
HostName = "168.33.162.245",
UserName = "dirk",
Password = "wangjun1234"
};
using (var connection = factory.CreateConnection())
{
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "sql",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null); channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false); var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message); Thread t = new Thread(new ParameterizedThreadStart(Listener));
t.Start(new par { channel = channel, ea = ea });
};
channel.BasicConsume(queue: "sql",
noAck: false,
consumer: consumer); Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
} } private static void Listener(object p)
{
par pa = p as par;
Thread.Sleep(10000);
//pa.channel.BasicAck(deliveryTag: pa.ea.DeliveryTag, multiple: false);
pa.channel.BasicReject(deliveryTag: pa.ea.DeliveryTag, requeue: false);
} private class par
{
public IModel channel { get; set; }
public BasicDeliverEventArgs ea { get; set; }
}
}
}
借鉴:http://blog.csdn.net/rainday0310/article/details/22082503
http://www.cnblogs.com/knowledgesea/p/5296008.html
Centos7 minimal 系列之rabbitmq的理解(九)的更多相关文章
- Centos7 minimal 系列之rabbitmq安装(八)
一.安装Erlang 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. 这种方法网站访问不了 wget https://packages.erlang-solutions.com/ ...
- Centos7 minimal 系列之Redis共享sessionid(七)
这一章节的内容就当看看,只是个人理解,我想应该是有误的. 一.SessionId sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessioni ...
- Centos7 minimal 系列之Redis集群搭建(六)
一.redis安装 借鉴上篇博客:http://www.cnblogs.com/WJ--NET/p/8176071.html 二.集群搭建 2.1.创建文件夹 mkdir redis_cluster ...
- Centos7 minimal 系列之Redis(五)
一.Redis安装 1.1 .进入/usr/local 创建redis文件夹(mkdir)方便统一管理 1.2.下载redis $ wget http://download.redis.io/rele ...
- Centos7 minimal 系列之Nginx负载均衡搭建(四)
一.Nginx搭建请参考我的上篇文章 http://www.cnblogs.com/WJ--NET/p/8143899.html 二.在IIS上搭建2个网站 三.配置nginx 虚拟机和主机网络互通请 ...
- Centos7 minimal 系列之Nginx搭建(三)
一.安装nginx 1.1.安装依赖包 yum -y install gcc-c++ yum -y install pcre pcre-devel yum -y install zlib zlib-d ...
- Centos7 minimal 系列之桥接模式联网(二)
一.桥接模式联网 之前用NAT模式连接网络,Centos是可以上网,而且Centos可以ping通主机,但是主机ping不通虚拟机.后来发现Nat模式只能由内而外. 1.1设置虚拟机的网络适配器 1. ...
- Centos7 minimal 系列之NAT联网(一)
一.安装 参考:http://m.blog.csdn.net/qq_24879495/article/details/77838512 二.解决不能联网问题 打开网络共享中心,设置虚拟网卡 编辑虚拟机 ...
- 【SpringBoot MQ 系列】RabbitMq 核心知识点小结
[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...
随机推荐
- mysqldump+mydumper+xtrabackup备份原理流程
mysqldump备份原理 备份的基本流程如下: 1.调用FTWRL(flush tables with read lock),全局禁止读写 2.开启快照读,获取此时的快照(仅对innodb表起作用) ...
- matplotlib显示中文字体
原始地址:http://zanyongli.i.sohu.com/blog/view/195716528.htm matplotlib 1.0.0版 对于3.0的可能不太适用,要注意语法结构! C:/ ...
- java学习笔记1——继承
通过在类的声明中加入extends子句创建一个子类并继承父类的成员变量和方法.如: class SubClass extends SuperClass{ ... } 若SuperClass是另一个类的 ...
- bzoj 1121: [POI2008]激光发射器SZK 思维_结论
Description 多边形相邻边垂直,边长为整数,边平行坐标轴.要在多边形的点上放一些激光发射器和接收器.满足下列要求: 1发射器和接收器不能放置在同一点: 2发射器发出激光可以沿壁反射,最终到达 ...
- 死磕itchat源码--content.py
content.py中定义了接受消息的类型,即,用于注册消息函数时的参数类型.源码如下: TEXT = 'Text' MAP = 'Map' CARD = 'Card' NOTE = 'Note' S ...
- mysql新建用户,修改权限
(1)登录:mysql -u root -p (2)查看现有用户(mysql8.0.1) mysql> select host,user,authentication_string from m ...
- Java 习惯用法总结
转自:http://www.importnew.com/15605.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » Java 习惯用法总结 2015/04/ ...
- 《你又怎么了我错了行了吧》【Alpha】Scrum meeting 2
第二天 日期:2019/6/15 前言: 第2次会议在9C-405召开 进行第一天工作的检查,开始第二天工作的安排和学习 1.1 今日完成任务情况以及明天任务安排 姓名 当前阶段任务 下一阶段任务 刘 ...
- 2015 Multi-University Training Contest 9 hdu 5396 Expression
Expression Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 4350
最近这些天,确实很烦恼.因为发现自己好像无论怎么样努力,也赶不上那些强校的学生.不得不承认,我们是传统弱校了.停了有一周了,什么也不想写,不停的反思,到底自己在哪里比不上人.D说,那是因为自始至终你只 ...