生产者
using RabbitMQ.Client;
using System;
using System.Text;
using RabbitMQHelper;
using System.Collections.Generic;
using RabbitMQ.Client.MessagePatterns;
using RabbitMQ.Client.Events;
using System.Diagnostics;
using System.Threading;
namespace RabbitMQServer
{
class Program
{
static void Main(string[] args)
{
//创建返回一个新的频道
using (var channel = RabbitMqHelper.GetConnection().CreateModel())
{
channel.QueueDeclare("test1", true, false, false, null);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
for (var i = 0; i < 10000; i++)
{
try
{
channel.BasicPublish(string.Empty, "test1", properties, Encoding.UTF8.GetBytes($"这是{i}个消息"));
Thread.Sleep(1000);
Console.WriteLine($"发布消息 {i}");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
i--;
}
}
}
}
#region 懒队列
//static void Main(string[] args)
//{
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //声明一个懒队列
// channel.QueueDeclare("lazyqueue", true, false, false, new Dictionary<string, object>
// {
// { "x-queue-mode","lazy"}
// });
// for (var i = 0; i < 10000; i++)
// {
// channel.BasicPublish(string.Empty, "testqueue", null, Encoding.UTF8.GetBytes($"这是{i}个消息"));
// }
// }
//}
#endregion
#region 确认机制
//static void Main(string[] args)
//{
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// var watch = new Stopwatch();
// try
// {
// watch.Start();
// //channel.TxSelect();
// for (var i = 0; i < 10000; i++)
// {
// channel.BasicPublish(string.Empty, "testqueue", null, Encoding.UTF8.GetBytes($"这是{i}个消息"));
// }
// //channel.TxCommit();
// //等待发布成功并返回发布状态
// // bool isok = channel.WaitForConfirms(new TimeSpan(1, 20, 30));
// watch.Stop();
// Console.WriteLine($"发布一万条没有消息确认,耗时{watch.ElapsedMilliseconds}毫秒");
// Console.ReadKey();
// }
// catch (Exception e)
// {
// //watch.Stop();
// //Console.WriteLine($"发布一万条使用了Confirm,耗时{watch.ElapsedMilliseconds}毫秒");
// //回退
// //channel.TxRollback();
// }
// }
//}
#endregion
#region 死信与优先级别
//static void Main(string[] args)
//{
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// channel.QueueDeclare("priorityQueue", true, false, false, new Dictionary<string, object> { { "x-max-priority", 5 } });
// var properties = channel.CreateBasicProperties();
// for (var i = 0; i < 6; i++)
// {
// properties.Priority = (byte)i;
// channel.BasicPublish(string.Empty, "priorityQueue", properties, Encoding.UTF8.GetBytes($"{i}级别的消息"));
// }
// Console.ReadKey();
// }
//}
#endregion
#region dead letter
//static void Main(string[] args)
//{
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// channel.BasicPublish(string.Empty, "testqueue", null, Encoding.UTF8.GetBytes("我五秒后就会消失"));
// Console.ReadKey();
// }
//}
#endregion
#region 声明queue的参数们的作用
//static void Main(string[] args)
//{
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //声明一个queue,最大长度10,最大大小2048bytes
// channel.QueueDeclare("queue", true, false, false, new Dictionary<string, object>
// {
// { "x-max-length", 10 },
// { "x-max-length-bytes", 2048}
// });
// //声明一个queue,queue五秒内而且未被任何形式的消费,则被删除
// channel.QueueDeclare("queue", true, false, false, new Dictionary<string, object> { { "x-expires", 5000 } });
// //声明一个queue,里面的内容自发布起五秒后被删除
// channel.QueueDeclare("messagettlqueue", true, false, false, new Dictionary<string, object> { { "x-message-ttl", 5000 } });
// var properties = channel.CreateBasicProperties();
// //设置过期时间
// properties.Expiration = "5000";
// channel.BasicPublish(null, "queue", properties, Encoding.UTF8.GetBytes("我五秒后就会消失"));
// 创建一个rpc queue
// //channel.QueueDeclare("testQueue", true, true, false, null,);
// //using (var channel2 = RabbitMqHelper.GetConnection().CreateModel())
// //{
// // var consumer = new EventingBasicConsumer(channel2);
// // channel2.BasicGet("testQueue", true);
// //}
// //using (var connection = RabbitMqHelper.GetNewConnection())
// //using (var channel2 = connection.CreateModel())
// //{
// // var consumer = new EventingBasicConsumer(channel2);
// // channel2.BasicGet("testQueue", true);
// //}
// Console.ReadKey();
// }
//}
#endregion
#region rpc server
//static void Main(string[] args)
//{
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //创建一个rpc queue
// channel.QueueDeclare("RpcQueue", true, false, false, null);
// SimpleRpcServer rpc = new SmsSimpleRpcServer(new Subscription(channel, "RpcQueue"));
// Console.WriteLine("服务端启动成功");
// rpc.MainLoop();
// Console.ReadKey();
// }
//}
#endregion
#region topic 模式
//static void Main(string[] args)
//{
// var flag = true;
// while (flag)
// {
// Console.WriteLine("请输入要发布的消息 key|msg。 或者按Ctrl+ C退出");
// var msg = Console.ReadLine();
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// var msgs = msg.Split('|');
// //发布一个消息
// var msgbody = Encoding.UTF8.GetBytes(msgs[1]);
// channel.BasicPublish("TopicExchange", routingKey: string.Empty, basicProperties: null, body: msgbody);
// Console.Write("发布成功!");
// }
// }
// Console.ReadKey();
//}
#endregion
#region headers 模式
//static void Main(string[] args)
//{
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //创建properties
// var properties = channel.CreateBasicProperties();
// //往内容的headers中塞入值
// properties.Headers = new Dictionary<string, object>()
// {
// {"user","admin" },
// {"pwd","123456" }
// };
// //发布一个消息
// var msg = Encoding.UTF8.GetBytes($"二狗子");
// channel.BasicPublish("headersExchange", routingKey: string.Empty, basicProperties: properties, body: msg);
// Console.Write("发布成功!");
// }
// Console.ReadKey();
//}
#endregion
#region fanout模式
//static void Main(string[] args)
//{
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //发布一个消息
// var msg = Encoding.UTF8.GetBytes($"二狗子");
// //不需要指定routingkey,指定了也没用.因为交换机是fanout类型
// channel.BasicPublish("fanoutExchange", routingKey: string.Empty, basicProperties: null, body: msg);
// Console.Write("发布成功!");
// }
// Console.ReadKey();
//}
#endregion
#region 日志消息发布者 direct模式根据routngkey
//static void Main(string[] args)
//{
// //创建返回一个新的频道
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //发布一百个消息
// for (var i = 0; i < 100; i++)
// {
// //对i进行求余来决定日志的级别
// var routingkey = i % 2 == 0 ? "info" : i % 3 == 0 ? "debug" : "error";
// var msg = Encoding.UTF8.GetBytes($"{i} :{routingkey}Message");
// channel.BasicPublish("LogExchange", routingKey: routingkey, basicProperties: null, body: msg);
// }
// Console.Write("发布成功!");
// }
// Console.ReadKey();
//}
#endregion
#region 第一版与第二版 发布多条消息到交换机
//static void Main(string[] args)
//{
// //从工厂中拿到实例 本地host、用户admin
// var factory = new ConnectionFactory()
// {
// UserName = "admin",
// Password = "admin",
// HostName = "localhost"
// };
// //创建连接
// using (var connection = factory.CreateConnection())
// //创建返回一个新的频道
// using (var channel = connection.CreateModel())
// {
// //声明一个direct类型的交换机
// channel.ExchangeDeclare("firstExchange", "direct", true, false, null);
// //声明队列
// channel.QueueDeclare("firstTest", true, false, false, null);
// //绑定队列
// channel.QueueBind("firstTest", "firstExchange", "firstExchange_Demo_firstTest", null);
// //发布一百个消息
// for (var i = 0; i < 100; i++)
// {
// var msg = Encoding.UTF8.GetBytes($"{i} :Hello RabbitMQ");
// channel.BasicPublish("firstExchange", routingKey: "firstExchange_Demo_firstTest", basicProperties: null, body: msg);
// }
// Console.Write("发布成功!");
// }
// Console.ReadKey();
//}
#endregion
}
/// <summary>
/// 发送短信的Rpc
/// </summary>
public class SmsSimpleRpcServer : SimpleRpcServer
{
public SmsSimpleRpcServer(Subscription subscription) : base(subscription)
{
}
/// <summary>
/// 执行完成后进行h回调
/// </summary>
/// <param name="isRedelivered"></param>
/// <param name="requestProperties"></param>
/// <param name="body"></param>
/// <param name="replyProperties"></param>
/// <returns></returns>
public override byte[] HandleSimpleCall(bool isRedelivered, IBasicProperties requestProperties, byte[] body, out IBasicProperties replyProperties)
{
replyProperties = null;
return Encoding.UTF8.GetBytes($"给{Encoding.UTF8.GetString(body)}发送短信成功");
}
/// <summary>
/// 进行处理
/// </summary>
/// <param name="evt"></param>
public override void ProcessRequest(BasicDeliverEventArgs evt)
{
// todo.....
base.ProcessRequest(evt);
}
}
}
消费者
using System;
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using RabbitMQHelper;
using System.Collections.Generic;
using RabbitMQ.Client.MessagePatterns;
namespace RabbitMQConsumer
{
class Program
{
static void Main(string[] args)
{
using (var channel = RabbitMqHelper.GetConnection().CreateModel())
{
//声明队列
channel.QueueDeclare("testqueue", true, false, false, null);
var consumer = new EventingBasicConsumer(channel);
var result = channel.BasicGet("testqueue", false);
Console.WriteLine(Encoding.UTF8.GetString(result.Body));
//扔掉消息
//channel.BasicReject(result.DeliveryTag, false);
//退回消息
channel.BasicReject(result.DeliveryTag, true);
//批量退回或删除,中间的参数 是否批量 true是/false否 (也就是只一条)
//channel.BasicNack(result.DeliveryTag, true, true);
////补发消息 true退回到queue中/false只补发给当前的consumer
//channel.BasicRecover(true);
var result2 = channel.BasicGet("testqueue", false);
Console.WriteLine(Encoding.UTF8.GetString(result2.Body));
//consumer.Received += (sender, e) =>
//{
// Console.WriteLine(Encoding.UTF8.GetString(e.Body));
// //扔掉消息
// channel.BasicReject(e.DeliveryTag, false);
// //再还给queue
// //channel.BasicReject(e.DeliveryTag, true);
//};
//不自动确认
channel.BasicConsume("testqueue", false, consumer);
Console.WriteLine("consumer启动成功");
Console.ReadKey();
}
}
#region 死信
//static void Main(string[] args)
//{
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //声明一个带有死信功能功能的queue exchange: dlexchange queue: dlexqueue
// channel.QueueDeclare("testqueue", true, false, false, new Dictionary<string, object>
// {
// { "x-message-ttl",5000},
// { "x-dead-letter-exchange", "dlexchange" },
// { "x-dead-letter-routing-key", "dlexqueue"}
// });
// //负责死信的交换机
// channel.ExchangeDeclare("dlexchange", ExchangeType.Direct, true, false, null);
// channel.QueueDeclare("dlexqueue", true, false, false, null);
// channel.QueueBind("dlexqueue", "dlexchange", "dlexqueue", null);
// var consumer = new EventingBasicConsumer(channel);
// consumer.Received += (sender, e) =>
// {
// Console.WriteLine(Encoding.UTF8.GetString(e.Body));
// };
// channel.BasicConsume("testqueue", true, consumer);
// Console.WriteLine("consumer启动成功");
// Console.ReadKey();
// }
//}
#endregion
#region RPC客户端
//static void Main(string[] args)
//{
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //创建client的rpc
// SimpleRpcClient client = new SimpleRpcClient(channel, new PublicationAddress(exchangeType: ExchangeType.Direct, exchangeName: string.Empty, routingKey: "RpcQueue"));
// bool flag = true;
// var sendmsg = "";
// while (flag)
// {
// Console.WriteLine("请输入要发送的消息");
// sendmsg = Console.ReadLine();
// if (string.IsNullOrWhiteSpace(sendmsg))
// {
// Console.Write("请输入消息");
// continue;
// }
// var msg = client.Call(Encoding.UTF8.GetBytes(sendmsg));
// Console.WriteLine(Encoding.UTF8.GetString(msg));
// }
// Console.ReadKey();
// }
//}
#endregion
#region topic 模式
//static void Main(string[] args)
//{
// bool flag = true;
// var key = "";
// while (flag)
// {
// Console.WriteLine("请输入路由正则 .代表一个字符 *代表零到多个字符");
// key = Console.ReadLine();
// if (string.IsNullOrWhiteSpace(key))
// {
// Console.Write("请输入路由");
// continue;
// }
// else
// flag = false;
// }
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //根据声明使用的队列
// var QueueName = key + "Queue";
// //声明交换机 headers模式
// channel.ExchangeDeclare("TopicExchange", ExchangeType.Topic, true, false);
// channel.QueueDeclare(QueueName, true, false, false, null);
// //进行绑定
// channel.QueueBind(QueueName, "TopicExchange", key, null);
// //创建consumbers
// var consumer = new EventingBasicConsumer(channel);
// consumer.Received += (sender, e) =>
// {
// var msg = Encoding.UTF8.GetString(e.Body);
// Console.WriteLine($"{e.RoutingKey}:{msg}");
// };
// //进行消费
// channel.BasicConsume(QueueName, true, consumer);
// Console.ReadKey();
// }
//}
#endregion
#region headers exchange模式
//static void Main(string[] args)
//{
// bool flag = true;
// string pattern = "";
// while (flag)
// {
// Console.WriteLine("请选择headers匹配模式 1(any)/2(all)");
// pattern = Console.ReadLine();
// if (pattern == "1" || pattern == "2")
// flag = false;
// else
// Console.Write("请做出正确的选择");
// }
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //根据声明使用的队列
// var headersType = pattern == "1" ? "any" : "all";
// //声明交换机 headers模式
// channel.ExchangeDeclare("headersExchange", ExchangeType.Headers, true, false);
// channel.QueueDeclare("headersQueue", true, false, false, null);
// //进行绑定
// channel.QueueBind("headersQueue", "headersExchange", string.Empty, new Dictionary<string, object>
// {
// //第一个匹配格式 ,第二与第三个则是匹配项
// { "x-match",headersType},
// { "user","admin"},
// { "pwd","123456"}
// });
// //创建consumbers
// var consumer = new EventingBasicConsumer(channel);
// consumer.Received += (sender, e) =>
// {
// var msg = Encoding.UTF8.GetString(e.Body);
// Console.WriteLine($"{msg}");
// };
// //进行消费
// channel.BasicConsume("headersQueue", true, consumer);
// Console.ReadKey();
// }
//}
#endregion
#region fanout模式
//static void Main(string[] args)
//{
// bool flag = true;
// string pattern = "";
// while (flag)
// {
// Console.WriteLine("请选择Ccnsumer模式 1(发短信)/2(发邮件)");
// pattern = Console.ReadLine();
// if (pattern == "1" || pattern == "2")
// flag = false;
// else
// Console.Write("请做出正确的选择");
// }
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //声明交换机 Fanout模式
// channel.ExchangeDeclare("fanoutExchange", ExchangeType.Fanout, true, false, null);
// //根据声明使用的队列
// var queueName = pattern == "1" ? "sms" : "emai";
// channel.QueueDeclare(queueName, true, false, false, null);
// //进行绑定
// channel.QueueBind(queueName, "fanoutExchange", string.Empty, null);
// //创建consumbers
// var consumer = new EventingBasicConsumer(channel);
// consumer.Received += (sender, e) =>
// {
// var msg = Encoding.UTF8.GetString(e.Body);
// var action = (pattern == "1" ? "发短信" : "发邮件");
// Console.WriteLine($"给{msg}{action}");
// };
// //进行消费
// channel.BasicConsume(queueName, true, consumer);
// Console.ReadKey();
// }
//}
#endregion
#region 日志消息消费者 direct模式根据routingkey
//static void Main(string[] args)
//{
// bool flag = true;
// string level = "";
// while (flag)
// {
// Console.WriteLine("请指定要接收的消息级别");
// level = Console.ReadLine();
// if (level == "info" || level == "error" || level == "debug")
// flag = false;
// else
// Console.Write("仅支持info、debug与error级别");
// }
// using (var channel = RabbitMqHelper.GetConnection().CreateModel())
// {
// //声明交换机 direct模式
// channel.ExchangeDeclare("LogExchange", "direct", true, false, null);
// //根据声明使用的队列
// var queueName = level == "info" ? "Log_else" : level == "debug" ? "Log_else" : "Log_error";
// channel.QueueDeclare(queueName, true, false, false, null);
// //进行绑定
// channel.QueueBind(queueName, "LogExchange", level, null);
// //创建consumbers
// var consumer = new EventingBasicConsumer(channel);
// consumer.Received += (sender, e) =>
// {
// var msg = Encoding.UTF8.GetString(e.Body);
// Console.WriteLine(msg);
// };
// //进行消费
// channel.BasicConsume(queueName, true, consumer);
// Console.ReadKey();
// }
//}
#endregion
#region 第一版与第二版简单Demo、交换机队列绑定
//static void Main(string[] args)
//{
// //consumber端
// var factory = new ConnectionFactory()
// {
// HostName = "localhost",
// UserName = "admin",
// Password = "admin"
// };
// using (var connection = factory.CreateConnection())
// using (var channel = connection.CreateModel())
// {
// //获取消息
// #region 第一版直接拉取
// //不再使用直接拉取的方式
// //var result = channel.BasicGet("firstTest", true);
// //var msg = Encoding.UTF8.GetString(result.Body);
// // Console.WriteLine(msg);
// #endregion
// //使用订阅的方式
// //这里的创建队列,是为了防止 消费 在 生产 之前
// channel.QueueDeclare("firstTest", true, false, false, null);
// //绑定队列
// channel.ExchangeDeclare("firstExchange", "direct", true, false, null);
// channel.QueueBind("firstTest", "firstExchange", "firstExchange_Demo_firstTest", null);
// var consumer = new EventingBasicConsumer(channel);
// consumer.Received += (sender, e) =>
// {
// var msg = Encoding.UTF8.GetString(e.Body);
// Console.WriteLine(msg);
// };
// //进行消费
// channel.BasicConsume("firstTest", true, consumer);
// Console.ReadKey();
// }
//}
#endregion
}
}
RabbitMqHelper.cs
using RabbitMQ.Client;
using System;
using System.Text;
namespace RabbitMQHelper
{
/// <summary>
/// RabbitMQ帮助类
/// </summary>
public class RabbitMqHelper
{
private static IConnection Connection;
/// <summary>
/// 获取连接对象
/// </summary>
/// <returns></returns>
public static IConnection GetConnection()
{
if (Connection == null)
{
//从工厂中拿到实例 本地host、用户admin
var factory = new ConnectionFactory()
{
HostName = "192.168.1.117",
UserName = "admin",
Password = "admin",
AutomaticRecoveryEnabled = true,
TopologyRecoveryEnabled = true,
Port = 25672
};
Connection = factory.CreateConnection();
return Connection;
}
return Connection;
}
public static IConnection GetNewConnection()
{
//从工厂中拿到实例 本地host、用户admin
var factory = new ConnectionFactory()
{
HostName = "192.168.1.117",
UserName = "admin",
Password = "admin",
AutomaticRecoveryEnabled = true,
TopologyRecoveryEnabled = true,
Port = 25672
};
Connection = factory.CreateConnection();
return Connection;
}
}
}