區別
https://www.zhihu.com/question/20795043
https://blog.csdn.net/dd18709200301/article/details/79077839
RabbitMQ安裝
https://blog.csdn.net/weixin_39735923/article/details/79288578
然后http://localhost:15672 進得去 說明安裝成功
有三種模式 fanout , direct topic
fanout 發送到所有的隊列
direct 可以設置key 發送到對應的隊列
topic 第二種的增強版 key支持模糊匹配
自己創建賬號 不要用guest賬號(應用程序跟RabbitMQ在同一個電腦上 可以用guest登陸 guest賬號給限制了 無法通過外網登陸 )
賬號創建完成需要設置賬號權限才可以使用
1.生產者
//創建連接工廠 ConnectionFactory factory = new ConnectionFactory { //這是默認帳號密碼 UserName = "guest",//用戶名 Password = "guest",//密碼 HostName = "localhost"//"192.168.157.130"//rabbitmq ip }; //創建連接 var connection = factory.CreateConnection(); //創建通道 var channel = connection.CreateModel(); //聲明一個隊列 channel.QueueDeclare("hello", false, false, false, null); Console.WriteLine("\nRabbitMQ連接成功,請輸入消息,輸入exit退出!"); string input; do { input = Console.ReadLine(); var sendBytes = Encoding.UTF8.GetBytes(input); //發布消息到hello隊列 channel.BasicPublish("", "hello", null, sendBytes); } while (input.Trim().ToLower() != "exit"); channel.Close(); connection.Close();
2.消費者
//創建連接工廠 ConnectionFactory factory = new ConnectionFactory { UserName = "guest",//用戶名 Password = "guest",//密碼 HostName = "localhost"//"192.168.157.130"//rabbitmq ip }; //創建連接 var connection = factory.CreateConnection(); //創建通道 var channel = connection.CreateModel(); //事件基本消費者 EventingBasicConsumer consumer = new EventingBasicConsumer(channel); //接收到消息事件 consumer.Received += (ch, ea) => { var message = Encoding.UTF8.GetString(ea.Body); Console.WriteLine($"收到消息: {message}"); //確認該消息已被消費 channel.BasicAck(ea.DeliveryTag, false); }; //啟動消費者 設置為手動應答消息 //監聽hello隊列 channel.BasicConsume("hello", false, consumer); Console.WriteLine("消費者已啟動"); Console.ReadKey(); channel.Dispose(); connection.Close();
channel.BasicAck(ea.DeliveryTag, false);
執行這句話就表示當前這條記錄已經被消費
可以在這句話之前執行調用接口 或者某些數據庫操作 成功在執行這句話 不成功該條信息還會放回隊列中
上面這種寫法是生產者直接把消息直接放到某個隊列中 一般我們不會這樣做 實際上都是生產者將消息發送到Exchange交換器中 由它將消息路由到一個或多個隊列(Queue)中
string exchangeName = "TestFanoutChange"; string queueName1 = "hello1"; string queueName2 = "hello2"; string routeKey = ""; //創建連接工廠 ConnectionFactory factory = new ConnectionFactory { //這是默認帳號密碼 UserName = "guest",//用戶名 Password = "guest",//密碼 HostName = "localhost"//"192.168.157.130"//rabbitmq ip }; //創建連接 var connection = factory.CreateConnection(); //創建通道 var channel = connection.CreateModel(); //定義一個Direct類型交換機 channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout, false, false, null); //定義隊列1 channel.QueueDeclare(queueName1, false, false, false, null); //定義隊列2 channel.QueueDeclare(queueName2, false, false, false, null); //將隊列綁定到交換機 channel.QueueBind(queueName1, exchangeName, routeKey, null); channel.QueueBind(queueName2, exchangeName, routeKey, null); //生成兩個隊列的消費者 ConsumerGenerator(queueName1); ConsumerGenerator(queueName2); Console.WriteLine("\nRabbitMQ連接成功,請輸入消息,輸入exit退出!"); string input; do { input = Console.ReadLine(); var sendBytes = Encoding.UTF8.GetBytes(input); //發布消息到exchangeName交換機上 綁定到這個交換機上的所有隊列都會產生信息 channel.BasicPublish(exchangeName, routeKey, null, sendBytes); } while (input.Trim().ToLower() != "exit"); channel.Close(); connection.Close();
static void ConsumerGenerator(string queueName) { //創建連接工廠 ConnectionFactory factory = new ConnectionFactory { UserName = "guest",//用戶名 Password = "guest",//密碼 HostName = "localhost"//rabbitmq ip }; //創建連接 var connection = factory.CreateConnection(); //創建通道 var channel = connection.CreateModel(); //事件基本消費者 EventingBasicConsumer consumer = new EventingBasicConsumer(channel); //接收到消息事件 consumer.Received += (ch, ea) => { var message = Encoding.UTF8.GetString(ea.Body); Console.WriteLine($"Queue:{queueName}收到消息: {message}"); //確認該消息已被消費 channel.BasicAck(ea.DeliveryTag, false); }; //啟動消費者 設置為手動應答消息 channel.BasicConsume(queueName, false, consumer); Console.WriteLine($"Queue:{queueName},消費者已啟動"); }
更具體的 見 https://www.cnblogs.com/stulzq/p/7551819.html