RabbitMQ操作方法
首先需要安装Erlang和Rabbitmq
Erlang下载地址:https://www.erlang.org/downloads
rabbitmq下载地址:https://www.rabbitmq.com/install-windows.html
安装成功后需要切换到Rabbitmq目录下执行如下命令配置Rabbitmq:
rabbitmq-plugins.bat enable rabbitmq_management 然后可在浏览器中输入地址http://localhost:15672/进行服务端配置; 操作代码如下:
/// <summary>
/// 消费者(消息)
/// </summary>
public class CustmerMq
{
/// <summary>
/// 最大的队列数目 根据cpu 来
/// </summary>
private static int Maximum_number_queues = ;
private static int number = ; /// <summary>
/// 消费者(单个)
/// </summary>
/// <param name="url">RabbitMQ地址</param>
/// <param name="userName">登录名</param>
/// <param name="passWord">密码</param>
/// <param name="virtualHost">虚拟主机</param>
/// <param name="requestedHeartbeat">请求心跳,默认0</param>
/// <param name="queueName">队列名称</param>
/// <returns></returns>
public static string InitCustmerMqStr(string url, string userName, string passWord, string virtualHost, ushort requestedHeartbeat, string queueName)
{
var strMQ = string.Empty;
try
{
Uri uri = new Uri(url);//"amqp://172.16.11.148:5672/" //使用ConnectionFactory创建连接,虽然创建时指定了多个server address,但每个connection只与一个物理的server进行连接
ConnectionFactory cf = new ConnectionFactory(); cf.Endpoint = new AmqpTcpEndpoint(uri);
cf.UserName = userName; //"rollen";
cf.Password = passWord; //"root";
cf.VirtualHost = virtualHost; //"/";
cf.RequestedHeartbeat = requestedHeartbeat; //0; using (IConnection conn = cf.CreateConnection())
{
using (IModel ch = conn.CreateModel())
{
//普通使用方式BasicGet
//noAck = true,不需要回复,接收到消息后,queue上的消息就会清除
//noAck = false,需要回复,接收到消息后,queue上的消息不会被清除,直到调用channel.basicAck(deliveryTag, false); queue上的消息才会被清除 而且,在当前连接断开以前,其它客户端将不能收到此queue上的消息
BasicGetResult res = ch.BasicGet(queueName, false/*noAck*/);
if (res != null)
{
bool t = res.Redelivered;
t = true;
strMQ = System.Text.UTF8Encoding.UTF8.GetString(res.Body); ch.BasicAck(res.DeliveryTag, false);
}
}
}
}
catch (Exception ex)
{
Logger.Debug("RabbitMQ消费异常:" + ex.Message);
} return strMQ;
} /// <summary>
/// 消费者(遍历)
/// </summary>
/// <returns></returns>
public static object InitCustmerMqListT()
{
var url = ConfigurationManager.AppSettings["MQ_url_loan"];
var userName = ConfigurationManager.AppSettings["MQ_userName_loan"];
var passWord = ConfigurationManager.AppSettings["MQ_passWord_loan"];
var virtualHost = ConfigurationManager.AppSettings["MQ_virtualHost_loan"];
var requestedHeartbeat = ushort.Parse(ConfigurationManager.AppSettings["MQ_requestedHeartbeat_loan"] ?? "");
var queueName = ConfigurationManager.AppSettings["MQ_queueName_loan"]; return InitCustmerMqLists(url, userName, passWord, virtualHost, requestedHeartbeat, queueName);
} private static List<string> InitCustmerMqLists(string url, string userName, string passWord, string virtualHost, ushort requestedHeartbeat, string queueName)
{
var DeliveryTagList = new List<ulong>();
var list = new List<string>();
try
{
Uri uri = new Uri(url);//使用ConnectionFactory创建连接,虽然创建时指定了多个server address,但每个connection只与一个物理的server进行连接
ConnectionFactory cf = new ConnectionFactory(); cf.Endpoint = new AmqpTcpEndpoint(uri);
cf.UserName = userName; //"rollen";
cf.Password = passWord; //"root";
cf.VirtualHost = virtualHost; //"/";
cf.RequestedHeartbeat = requestedHeartbeat; //0; int ErrorSum = ; using (IConnection conn = cf.CreateConnection())
{ using (IModel ch = conn.CreateModel())
{
#region 清除队列消息
//var consumer = new QueueingBasicConsumer(ch); //ch.BasicConsume(queueName, noAck: true, consumer: consumer); //var msgResponse = consumer.Queue.Dequeue(); //blocking //ch.BasicAck(msgResponse.DeliveryTag, false);
#endregion //ch.BasicQos(0, 1, false);//这样RabbitMQ就会使得每个Consumer在同一个时间点最多处理一个Message。换句话说,在接收到该Consumer的ack前,他它不会将新的Message分发给它。
#region 遍历消息队列获取消息
int k = ;
while (k < )
{
BasicGetResult res = ch.BasicGet(queueName, false/*noAck*/);
if (res != null)
{
try
{
var body = System.Text.UTF8Encoding.UTF8.GetString(res.Body);
list.Add(body);
DeliveryTagList.Add(res.DeliveryTag);
}
catch (Exception ex)
{
Logger.Debug("RabbitMQ消费异常:" + ex.Message);
if (ErrorSum >= )
{
break;
}
ErrorSum++;
}
}
else
{
break;
}
k++;
}
#endregion #region 消费完成,删除队列
try
{
if (DeliveryTagList != null && DeliveryTagList.Count > )
{
for (int i = ; i < DeliveryTagList.Count; i++)
{
ch.BasicAck(DeliveryTagList[i], false);
}
}
}
catch (Exception ex)
{
Logger.Debug("RabbitMQ消费异常:" + ex.Message);
}
#endregion ch.Close();
}
conn.Close();
}
}
catch (Exception ex)
{
Logger.Debug("RabbitMQ消费异常:" + ex.Message);
}
return list;
}
}
/// <summary>
/// 产生消息
/// </summary>
public class ProducerMQ
{
/// <summary>
/// 消息添加入队列
/// </summary>
/// <param name="str">消息内容</param>
/// <param name="url">消息队列服务器地址</param>
/// <param name="exchange">交换方式名称</param>
/// <param name="exchangeType">方式类型</param>
/// <param name="routingKey">方式Key</param>
/// <param name="userName">登录名称</param>
/// <param name="passWord">密码</param>
/// <param name="virtualHost">虚拟主机名</param>
/// <param name="requestedHeartbeat">请求心跳,默认0</param>
/// <param name="queueName">队列名称</param>
public static void InitProducerMQ(string str, string url, string exchange, string exchangeType, string routingKey, string userName, string passWord, string virtualHost, ushort requestedHeartbeat, string queueName)
{
//定义要链接的rabbitmq-server地址(基于amqp协议)
//Uri uri = new Uri("amqp://172.16.11.148:5672/");
Uri uri = new Uri(url);
//定义交换方式
//是否对消息队列持久化保存
bool persistMode = true;
//使用ConnectionFactory创建连接,虽然创建时指定了多个server address,但每个connection只与一个物理的server进行连接
ConnectionFactory cf = new ConnectionFactory(); cf.UserName = userName;
cf.Password = passWord; //cf.VirtualHost = "/";
cf.VirtualHost = virtualHost;
cf.RequestedHeartbeat = requestedHeartbeat;
cf.Endpoint = new AmqpTcpEndpoint(uri); //实例化IConnection对象,并设置交换方式
using (IConnection conn = cf.CreateConnection())
{
using (IModel ch = conn.CreateModel())
{
if (exchangeType != null)
{
//交换机持久化
ch.ExchangeDeclare(exchange, exchangeType, true);//,true,true,false,false, true,null);
////队列持久化
ch.QueueDeclare(queueName, true, false, false, null);
//ch.QueueBind("q2", "ex2", "m1");
ch.QueueBind(queueName, exchange, routingKey);
} //构造消息实体对象并发布到消息队列上
IMapMessageBuilder b = new MapMessageBuilder(ch);
if (persistMode)
{
//数据持久化
((IBasicProperties)b.GetContentHeader()).DeliveryMode = ;
} ////简单发布方式
ch.BasicPublish(exchange, routingKey,
(IBasicProperties)b.GetContentHeader(),
Encoding.UTF8.GetBytes(str));
ch.Close();
}
conn.Close();
}
} /// <summary>
/// 消息添加入队列
/// </summary>
/// <param name="model">消息内容</param>
public static void InitProducerMQ(object model)
{
try
{
var Is_RabbitMQ = ConfigurationManager.AppSettings["Is_RabbitMQ"] == null ? : Convert.ToInt32(ConfigurationManager.AppSettings["Is_RabbitMQ"].ToString());//是否开启队列
if (Is_RabbitMQ == )
{
var url = ConfigurationManager.AppSettings["RabbitMQ_url"] == null ? "amqp://172.16.5.180:5672/" : ConfigurationManager.AppSettings["RabbitMQ_url"].ToString();//消息队列服务器地址
var exchange = ConfigurationManager.AppSettings["RabbitMQ_exchange"] == null ? "WebApi" : ConfigurationManager.AppSettings["RabbitMQ_exchange"].ToString();//交换方式名称
var exchangeType = ConfigurationManager.AppSettings["RabbitMQ_exchangeType"] == null ? "direct" : ConfigurationManager.AppSettings["RabbitMQ_exchangeType"].ToString();//方式类型
var routingKey = ConfigurationManager.AppSettings["RabbitMQ_routingKey"] == null ? "XYJAPP" : ConfigurationManager.AppSettings["RabbitMQ_routingKey"].ToString();//方式Key
var userName = ConfigurationManager.AppSettings["RabbitMQ_userName"] == null ? "rollen" : ConfigurationManager.AppSettings["RabbitMQ_userName"].ToString();//登录名称
var passWord = ConfigurationManager.AppSettings["RabbitMQ_passWord"] == null ? "" : ConfigurationManager.AppSettings["RabbitMQ_passWord"].ToString();//密码
var virtualHost = ConfigurationManager.AppSettings["RabbitMQ_virtualHost"] == null ? "/" : ConfigurationManager.AppSettings["RabbitMQ_virtualHost"].ToString();//虚拟主机名
ushort requestedHeartbeat = ConfigurationManager.AppSettings["RabbitMQ_requestedHeartbeat"] == null ? ushort.Parse("") : Convert.ToUInt16(ConfigurationManager.AppSettings["RabbitMQ_requestedHeartbeat"].ToString());//请求心跳,默认0
var queueName = ConfigurationManager.AppSettings["RabbitMQ_queueName"] == null ? "APP" : ConfigurationManager.AppSettings["RabbitMQ_queueName"].ToString();//队列名称
var str = JsonConvert.SerializeObject(model); if (!string.IsNullOrWhiteSpace(str))
{
InitProducerMQ(str, url, exchange, exchangeType, routingKey, userName, passWord, virtualHost, requestedHeartbeat, queueName);
}
}
}
catch (Exception ex)
{
//Logger.Error("ProducerMQ", ex);
}
} /// <summary>
/// 消息添加入队列
/// </summary>
/// <param name="str">消息内容</param>
public static void InitProducerMQ(string str)
{
try
{
var Is_RabbitMQ = ConfigurationManager.AppSettings["Is_RabbitMQ"] == null ? : Convert.ToInt32(ConfigurationManager.AppSettings["Is_RabbitMQ"].ToString());//是否开启队列
if (Is_RabbitMQ == )
{
var url = ConfigurationManager.AppSettings["RabbitMQ_url"] == null ? "amqp://172.16.5.180:5672/" : ConfigurationManager.AppSettings["RabbitMQ_url"].ToString();//消息队列服务器地址
var exchange = ConfigurationManager.AppSettings["RabbitMQ_exchange"] == null ? "WebApi" : ConfigurationManager.AppSettings["RabbitMQ_exchange"].ToString();//交换方式名称
var exchangeType = ConfigurationManager.AppSettings["RabbitMQ_exchangeType"] == null ? "direct" : ConfigurationManager.AppSettings["RabbitMQ_exchangeType"].ToString();//方式类型
var routingKey = ConfigurationManager.AppSettings["RabbitMQ_routingKey"] == null ? "XYJAPP" : ConfigurationManager.AppSettings["RabbitMQ_routingKey"].ToString();//方式Key
var userName = ConfigurationManager.AppSettings["RabbitMQ_userName"] == null ? "rollen" : ConfigurationManager.AppSettings["RabbitMQ_userName"].ToString();//登录名称
var passWord = ConfigurationManager.AppSettings["RabbitMQ_passWord"] == null ? "" : ConfigurationManager.AppSettings["RabbitMQ_passWord"].ToString();//密码
var virtualHost = ConfigurationManager.AppSettings["RabbitMQ_virtualHost"] == null ? "/" : ConfigurationManager.AppSettings["RabbitMQ_virtualHost"].ToString();//虚拟主机名
ushort requestedHeartbeat = ConfigurationManager.AppSettings["RabbitMQ_requestedHeartbeat"] == null ? ushort.Parse("") : Convert.ToUInt16(ConfigurationManager.AppSettings["RabbitMQ_requestedHeartbeat"].ToString());//请求心跳,默认0
var queueName = ConfigurationManager.AppSettings["RabbitMQ_queueName"] == null ? "APP" : ConfigurationManager.AppSettings["RabbitMQ_queueName"].ToString();//队列名称 if (!string.IsNullOrWhiteSpace(str))
{
InitProducerMQ(str, url, exchange, exchangeType, routingKey, userName, passWord, virtualHost, requestedHeartbeat, queueName);
}
}
}
catch (Exception ex)
{
//Logger.Error("ProducerMQ", ex);
}
} /// <summary>
/// 添加入账内容进入队列
/// </summary>
/// <param name="model">消息内容</param>
public static void InitProducerLoanMQ(object model)
{
try
{
var Is_MQ = ConfigurationManager.AppSettings["Is_MQ_loan"] == null ? : Convert.ToInt32(ConfigurationManager.AppSettings["Is_MQ_loan"].ToString());//是否开启队列
if (Is_MQ == )
{
var url = ConfigurationManager.AppSettings["MQ_url_loan"] == null ? "amqp://172.16.5.180:5672/" : ConfigurationManager.AppSettings["MQ_url_loan"].ToString();//消息队列服务器地址
var exchange = ConfigurationManager.AppSettings["MQ_exchange_loan"] == null ? "WebApi" : ConfigurationManager.AppSettings["MQ_exchange_loan"].ToString();//交换方式名称
var exchangeType = ConfigurationManager.AppSettings["MQ_exchangeType_loan"] == null ? "direct" : ConfigurationManager.AppSettings["MQ_exchangeType_loan"].ToString();//方式类型
var routingKey = ConfigurationManager.AppSettings["MQ_routingKey_loan"] == null ? "XYJAPP" : ConfigurationManager.AppSettings["MQ_routingKey_loan"].ToString();//方式Key
var userName = ConfigurationManager.AppSettings["MQ_userName_loan"] == null ? "rollen" : ConfigurationManager.AppSettings["MQ_userName_loan"].ToString();//登录名称
var passWord = ConfigurationManager.AppSettings["MQ_passWord_loan"] == null ? "" : ConfigurationManager.AppSettings["MQ_passWord_loan"].ToString();//密码
var virtualHost = ConfigurationManager.AppSettings["MQ_virtualHost_loan"] == null ? "/" : ConfigurationManager.AppSettings["MQ_virtualHost_loan"].ToString();//虚拟主机名
ushort requestedHeartbeat = ConfigurationManager.AppSettings["MQ_requestedHeartbeat_loan"] == null ? ushort.Parse("") : Convert.ToUInt16(ConfigurationManager.AppSettings["MQ_requestedHeartbeat_loan"].ToString());//请求心跳,默认0
var queueName = ConfigurationManager.AppSettings["MQ_queueName_loan"] == null ? "APP" : ConfigurationManager.AppSettings["MQ_queueName_loan"].ToString();//队列名称
var str = JsonConvert.SerializeObject(model); if (!string.IsNullOrWhiteSpace(str))
{
InitProducerMQ(str, url, exchange, exchangeType, routingKey, userName, passWord, virtualHost, requestedHeartbeat, queueName);
}
}
}
catch (Exception ex)
{
//Logger.Error("ProducerMQ", ex);
}
}
}
以上为MQ生产者和消费者代码,引用以上代码必须添加引用RabbitMQ.Client.dll
RabbitMQ操作方法的更多相关文章
- 队列工厂之RabbitMQ
本次和大家分享的是RabbitMQ队列的用法,前一篇文章队列工厂之(MSMQ)中在描述的时候已经搭建了简单工厂,因此本章内容是在其之上扩充的子项不再过多讲解工厂的代码了:RabbitMQ应该是现在互联 ...
- RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介
今天这篇博文是我翻译的RabbitMQ的最后一篇文章了,介绍一下RabbitMQ的C#开发的接口.好了,言归正传吧. Net/C# 客户端 API简介1.主要的命名空间,接口和类 定义核心的API的 ...
- Asp.NetCore轻松学-实现一个轻量级高可复用的RabbitMQ客户端
前言 本示例通过对服务订阅的封装.隐藏细节实现.统一配置.自动重连.异常处理等各个方面来打造一个简单易用的 RabbitMQ 工厂:本文适合适合有一定 RabbitMQ 使用经验的读者阅读,如果你还没 ...
- 【c#】RabbitMQ学习文档(七)C# API
今天这篇博文是我翻译的RabbitMQ的最后一篇文章了,介绍一下RabbitMQ的C#开发的接口.好了,言归正传吧. Net/C# 客户端 API简介 主要的命名空间,接口和类 定义核心的API的接口 ...
- Docker部署Django项目+Nginx+Fluend日志收集 和redis、memcached、RabbitMQ、Celery
前言 一.docker 1.docker是什么? Docker的英文本意是“搬运工”,Docker搬运的是集装箱(Container)可以成为容器,我可以把写的Django的WEB应用以及Python ...
- 初识RabbitMQ
1.安装 rabbitmq官网:http://www.rabbitmq.com/ 下载地址:https://packagecloud.io/rabbitmq 下载rabbitmq-server 安装脚 ...
- RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介(转载)
RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介 今天这篇博文是我翻译的RabbitMQ的最后一篇文章了,介绍一下RabbitMQ的C#开发的接口.好了,言归正传吧. N ...
- 杂项之rabbitmq
杂项之rabbitmq 本节内容 rabbitmq简介 AMQP协议 rabbitmq使用 应用举例 rabbitmq简介 介绍rabbitmq之前,先介绍一下AMQP协议,因为rabbitmq就是基 ...
- .Net Core 商城微服务项目系列(七):使用消息队列(RabbitMQ)实现服务异步通信
RabbitMQ是什么,怎么使用我就不介绍了,大家可以到园子里搜一下教程.本篇的重点在于实现服务与服务之间的异步通信. 首先说一下为什么要使用消息队列来实现服务通信:1.提高接口并发能力. 2.保证 ...
随机推荐
- mongodb底层存储和索引原理——本质是文档数据库,无表设计,同时wiredTiger存储引擎支持文档级别的锁,MMAPv1引擎基于mmap,二级索引(二级是文档的存储位置信息『文件id + 文件内offset 』)
MongoDB是面向文档的数据库管理系统DBMS(显然mongodb不是oracle那样的RDBMS,而仅仅是DBMS). 想想一下MySQL中没有任何关系型数据库的表,而由JSON类型的对象组成数据 ...
- 【Hive】执行脚本
1.linux下执行hive sql脚本 (1)hive -e “sql语句” (2)hive -e “sql语句” >> xxx 将sql查出来的语句重定向到xxx文件中,会显示Ok和数 ...
- C#—序列化(Serialize)和反序列化(NonSerialize)
(转自:http://www.cnblogs.com/Abel-Zhang/p/Serialize.html) 一.概述 序列化是把对象转变成流.相反的过程就是反序列化. 哪些场合用到这项技术呢? 1 ...
- 理解RESTful风格(转)
原文链接:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件 ...
- QGrapicsView类
QGraphicsView提供一个显示QGraphicsScene内容的窗口,该窗口可以滚动,可以在构造时候把场景对象作为参数,或者之后使用setScene()来设置view的场景,然后调用了show ...
- Spring核心AOP(面向切面编程)总结
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/75208354冷血之心的博客) 1.AOP概念: 面向切面编程,指扩 ...
- FlycoTabLayout 从头到脚
简介 FlycoTabLayout,是一个比Google原生TabLayout 功能更强大的TabLayout库.目前有3种TabLayout: SlidingTabLayout CommonTabL ...
- 作为一名Java开发工程师需要掌握的专业技能
在学习Java编程完之后,学员们面临的就是就业问题.作为一名Java开发工程师,企业在招聘的时候,也是有一定的标准的. 为了帮助大家更好的找到适合自己的工作,在这里分享了作为一名Java开发工程师需要 ...
- 【前端】CSS入门笔记
教程 CSS 指层叠样式表 (Cascading Style Sheets) CSS 语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 选择器通常是您需要改变样式的 HTML 元素 ...
- Hibernate之mappedBy【必读】
[http://www.cnblogs.com/redcoatjk/p/4236445.html] 一.mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段 数据库中1 ...