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 是一个基于 ...
随机推荐
- 4185 Oil Skimming 最大匹配 奇偶建图
题目大意: 统计相邻(上下左右)的‘#’的对数. 解法: 与题目hdu1507 Uncle Tom's Inherited Land*类似,需要用奇偶建图.就是行+列为奇数的作为X集合,偶尔作为Y集合 ...
- python安装Django需要环境
Django==1.10.3 -e git+https://github.com/duoshuo/duoshuo-python-sdk.git#egg=duoshuo-python-sdk djang ...
- Boost1.67编译+CMake Generate时遇到的一个错误
下载的一个库编译时依赖boost,记录一下boost的编译: 下载源码 vs命令行里cd到根目录,运行bootstrap.bat,发现多了几个文件{b2.exe.bjam.exe.project-co ...
- UBuntu安裝使用PIP
Windows下安裝python包還是比較方便的,直接在FLD網站下載對應的EXE文件就可以安裝,在linux系統下,使用pip,easy egg 管理工具可以減輕安裝負擔. 原文鏈接:http:// ...
- 模拟试题B
模拟试题B 一.单项选择题(2′*8 =16′) 1.灰度等级为256级,分辨率为2048*1024的显示器,至少需要的帧缓存容量为( ) A)512KB B)1MB C)2MB D)3MB 2.在多 ...
- Postfix Self Expression
Postfix Self Expression A postfix self expression consists of an expression or the name of a type, i ...
- Python 数据清洗--处理Nan
参考:http://blog.sina.com.cn/s/blog_13050351e0102xfis.html https://www.sogou.com/link?url=DOb0bgH2eKh1 ...
- 【路飞学城Day170】算法小结
Evernote Export 算法的思想是能省则省,内存能少则少,时间运行能少尽量少 堆排序的时间复杂度O(nlogn) 堆排序的内置模块heapq 常用函数 heapify(x) heappush ...
- PHP中调用Soap/WebService
关于在PHP中如何调用Soap/WebService的描述,网络上有不少帖子.但是主要讲述了如何用PHP开发服务器端.客户端并加以关联,而很少触及在PHP中调用现成的WebService的情况.在本文 ...
- Spring 的IOC和DI
IOC:IOC其实就是一种容器,该容器会主动的将资源推送给他所管理的组件, 组件所要做的仅是一种合适的方式来接受资源,这种行为也被称为查找的被动形式! IOC的反转控制:传统应用程序是由我们自己在对象 ...