一、前言

  传送门: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. jquery mobile动态加载数据后无法渲染

    引自:http://blog.sina.com.cn/s/blog_025270e901016lst.html jquery mobile在动态添加html之后无法渲染控件,无法转换控件的办法! jq ...

  2. (转)基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍

    http://www.cnblogs.com/wuhuacong/p/3281103.html 最近花了很多时间在重构和进一步提炼Winform开发框架的工作上,加上时不时有一些项目的开发工作,我博客 ...

  3. strusts2_json

    引用别人的 Struts.xml <package name="default" extends ="json-default" > <act ...

  4. Fear No More歌词

      "Fear No More"   Every anxious thought that steals my breath It's a heavy weight upon my ...

  5. 创建一个dynamics CRM workflow (一) - Introduction to Custom Workflows

    Workflow: Use this process to model and automate real world business processes. These processes can ...

  6. Centos7 单节点安装 FastDFS + FastDHT服务

    Centos7 单节点安装 FastDFS + FastDHT服务 1.安装gcc(编译时需要) FastDFS是C语言开发,安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果 ...

  7. anaconda下安装xgboost

    1.下载whl文件 网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 选择合适自己的环境的下载,比如python3.6还是3.5的,64位机 ...

  8. [Papers] Semantic Segmentation Papers(1)

    目录 FCN Abstract Introduction Related Work FCN Adapting classifiers for dense prediction Shift-and-st ...

  9. PyCharm中导入MySQLDB模块小结

    安装完MySQL-python驱动,在PyCharm中导入MySQLDB模块一直不成功 Settings里面也没有MySQLdb 百般尝试找解决办法,一直搞不定,最后抱着试一试的心态尝试了一个办法: ...

  10. ubuntu系统自动配置开机启动脚本

    以前一直搞的centos配置开机启动脚本,但是相同方法用在ubuntu系统上就不管用了,非常伤脑筋. 非常感谢  https://www.linuxidc.com/Linux/2017-09/1471 ...