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.保证 ...
随机推荐
- 24-THREE.JS 镜面高光材质
<!DOCTYPE html> <html> <head> <title>Example 04.07 - Mesh Phong material< ...
- react-redux: async promise
1.the simple sample action: 事实上,只是返回个一个至少包含type的对象{ },用于reducer接收. import {RECEIVE_DATA} from " ...
- Week06《Java程序设计》第六次作业总结
Week06<Java程序设计>第六次作业总结 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行 ...
- 剑指offer--24.树的子结构
时间限制:1秒 空间限制:32768K 热度指数:407165 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) class Solution ...
- Android 进阶9:进程通信之 AIDL 解析
读完本文你将了解: AIDL AIDL 生成文件分析 Stub Proxy AIDL 生成的内容小结 AIDL 的使用回顾 服务端 客户端 小结 手动写个 Binder 首先是定义跨进程接口实现 II ...
- (五)js数组方法二
一:数组方法 var arr = []; 1.arr.push()//给数组末尾<添加>元素 2.arr.unshift()//给数组头部<添加>元素 3.arr.shift( ...
- 简述Java面向对象三大特征:封装、继承、多态
封装: 把对象的全部属性和服务结合在一起,形成不可分割的独立单位: 尽可能隐藏内部细节.(数据隐藏.隐藏具体实现的细节) public.private.protected.default pu ...
- 在javascript中使用提示信息来熟悉当前的程序流程
最近,因为需要,开始了解javascript,这个对我来说是个新的东西,在分析现有程序的功能的时候,需要增加一些提示信息来帮助了解程序的处理流程.于是在网上了解了一下提示信息的使用和区别.在此整理一下 ...
- setContentHuggingPriority和setContentCompressionResistancePriority的使用
当两个UILabel并排显示时,如何设置约束,让 leftLB 和 rightLB 正常显示就很重要了. 方案1:左右两个Label的宽度相同,则约束设置如下: //添加标题约束,左边的label [ ...
- 使用DeflateStream压缩与解压
具体可以了解下:http://msdn.microsoft.com/zh-cn/library/system.io.compression.deflatestream(v=vs.110).aspx / ...