一、前言

  传送门: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的理解(九)的更多相关文章

  1. Centos7 minimal 系列之rabbitmq安装(八)

    一.安装Erlang 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. 这种方法网站访问不了 wget https://packages.erlang-solutions.com/ ...

  2. Centos7 minimal 系列之Redis共享sessionid(七)

    这一章节的内容就当看看,只是个人理解,我想应该是有误的. 一.SessionId sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessioni ...

  3. Centos7 minimal 系列之Redis集群搭建(六)

    一.redis安装 借鉴上篇博客:http://www.cnblogs.com/WJ--NET/p/8176071.html 二.集群搭建 2.1.创建文件夹 mkdir redis_cluster ...

  4. Centos7 minimal 系列之Redis(五)

    一.Redis安装 1.1 .进入/usr/local 创建redis文件夹(mkdir)方便统一管理 1.2.下载redis $ wget http://download.redis.io/rele ...

  5. Centos7 minimal 系列之Nginx负载均衡搭建(四)

    一.Nginx搭建请参考我的上篇文章 http://www.cnblogs.com/WJ--NET/p/8143899.html 二.在IIS上搭建2个网站 三.配置nginx 虚拟机和主机网络互通请 ...

  6. Centos7 minimal 系列之Nginx搭建(三)

    一.安装nginx 1.1.安装依赖包 yum -y install gcc-c++ yum -y install pcre pcre-devel yum -y install zlib zlib-d ...

  7. Centos7 minimal 系列之桥接模式联网(二)

    一.桥接模式联网 之前用NAT模式连接网络,Centos是可以上网,而且Centos可以ping通主机,但是主机ping不通虚拟机.后来发现Nat模式只能由内而外. 1.1设置虚拟机的网络适配器 1. ...

  8. Centos7 minimal 系列之NAT联网(一)

    一.安装 参考:http://m.blog.csdn.net/qq_24879495/article/details/77838512 二.解决不能联网问题 打开网络共享中心,设置虚拟网卡 编辑虚拟机 ...

  9. 【SpringBoot MQ 系列】RabbitMq 核心知识点小结

    [MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 ...

随机推荐

  1. MemCached总结三:PHP的memcached管理接口

    在Web系统中应用MemCached缓存技术,必须使用客户端API(PHP)进行访问,这样才能将用户请求的动态数据,缓存到memcached服务器中,来减少对数据库的访问压力.PHP中提供了用于内存缓 ...

  2. Kafka 分布式消息系统详解

    实际上kafka对机器的需求与Hadoop的类似. 原来,对于Linkin这样的互联网企业来说,用户和网站上产生的数据有三种: 需要实时响应的交易数据,用户提交一个表单,输入一段内容,这种数据最后是存 ...

  3. 【Five-Minute Share】“请先了解所使用的工具 ,磨刀不误砍柴工”

    数据是应用系统的血液,没有数据的系统应用价值是非常有限的.经过多年的观察发现,身边很多的程序开发人员在开发应用系统的时候,都是按照标准SQL语法及应用方法去进行数据库设计,并进行应用开发的,没有任何的 ...

  4. 励志:98岁老爷爷用Windows系统自带画图软件制作的神作

    哈尔拉斯科,是一位很出名的老爷爷,他70岁才接触MS Paint(就是我们熟知的Windows自带的画图软件).他曾经是一名图形艺术家,但是之前他都是手工创作.他熟知怎么用双手进行艺术创作.但是后来, ...

  5. NagiosQL安装

        NagiosQL和Nconf是比较好用的Nagios配置工具. 一.安装NagiosQL 1.在服务器终端运行以下命令: ##YUM安装PHP模块yum -y install --disabl ...

  6. H5动效的常见制作手法

    众所周知,一个元素,动往往比静更吸引眼球: 一套操作界面,合适的动态交互反馈能给用户带来更好的操作体验: 一个H5运营宣传页,炫酷的动画特效定能助力传播和品牌打造. 近两年,小到loading动画,表 ...

  7. H3C交换机telnet服务认证模式配置

    以H3C交换机为例,介绍telnet服务的三种认证方式配置(none无需认证,password密码认证,scheme账户+密码认证) None认证模式配置步骤:[H3C]telnet server e ...

  8. vc++如何创建程序-函数的重载

    重载构成的条件:函数的参数类型,参数个数不同,才能构成函数的重载 函数重载分为两种情况: 1 .(1)void output(); (2)int output(); 2 .(1)void output ...

  9. PHP 使用 Kafka 安装拾遗

    最近项目开发中需要使用 Kafka 消息队列.经过检索,PHP下面有通用的两种方式来调用 Kafka . php-rdkafka 扩展 以 PHP 扩展的形式进行使用是非常高效的.另外,该项目也提供了 ...

  10. Python-基础-day2

    Python环境的安装 安装Python: windows: 1.下载安装包     https://www.python.org/downloads/ 2.安装     默认安装路径:C:\pyth ...