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.保证 ...
随机推荐
- QT Designer 的汉化
Designer是很好用的设计器,通过 pip 安装PyQt5之后,一般都是英文的 所以给有需要的人带来汉化的包(这个是通过替换 translations 文件夹来实现的) translations ...
- LeetCode OJ:Evaluate Reverse Polish Notation(逆波兰表示法的计算器)
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- 关于socket绑定INADDR_ANY
其中INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”.“任意地址”. 一般情况下,如果你要建立网络服务器,则你要通知服务器操作系统:请在某地址 xx ...
- AS3里面的错误代码
ActionScript 3 出现2048安全策略服务,一种原因是因为843端口下发策略文件有问题,另一种原因是Socket端口有问题,可以用telnet来测试. 其它AS3错误代码的意义可以在官网文 ...
- 旧书重温:0day2【8】狙击windows的异常处理实验
现在进入0day2的第六章内容 其中第六章的书本内容我都拍成了图片格式放在了QQ空间中(博客园一张一传,太慢了)http://user.qzone.qq.com/252738331/photo/V10 ...
- E: Could not get lock /var/lib/dpkg/lock解决
ubuntu常见错误--Could not get lock /var/lib/dpkg/lock解决 通过终端安装或卸载程序sudo apt-get install/autoremove xxx时出 ...
- LINUX 命令—netstat [简单实用]
1.--当我们在检查程序是否启动或者网络状况的时候 会查看本机活跃的端口,就需要这个命令: |--"netstat – Print network connections, routing ...
- 5款实用的硬盘、SSD固态硬盘、U盘、储存卡磁盘性能测试工具绿色版
http://www.iplaysoft.com/disk-benchmark-tools.html/comment-page-1#comment-149425
- HBase错误大全
1. stopping hbasecat: /tmp/hbase-root-master.pid: No such file or directory 原因:hadoop的pid文件丢失,hadoop ...
- python manage.py makemigrations生成数据变化的问题
今天遇到的生成数据库的问题django生成数据库的话,使用的是两条命令,一个是python manage.py makemigrations,以及python manage.py migrate在设计 ...