From c574f2241ec6814c1f8796f7e96dccc7ce934742 Mon Sep 17 00:00:00 2001 From: falcon <9504402@qq.com> Date: Mon, 6 Mar 2023 11:24:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=B9RabbitMQ=E7=9A=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Falcon.SugarApi.sln | 8 +- RabbitMqTest/OriginalTest.cs | 142 +++++++++++++++++++++++++++++++ RabbitMqTest/PageTest.html | 8 ++ RabbitMqTest/RabbitMqTest.csproj | 16 ++++ RabbitMqTest/RabbitmqBase.cs | 52 +++++++++++ RabbitMqTest/stomp.min.js | 8 ++ 6 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 RabbitMqTest/OriginalTest.cs create mode 100644 RabbitMqTest/PageTest.html create mode 100644 RabbitMqTest/RabbitMqTest.csproj create mode 100644 RabbitMqTest/RabbitmqBase.cs create mode 100644 RabbitMqTest/stomp.min.js diff --git a/Falcon.SugarApi.sln b/Falcon.SugarApi.sln index 5024744..ddb893a 100644 --- a/Falcon.SugarApi.sln +++ b/Falcon.SugarApi.sln @@ -15,7 +15,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Falcon.SugarApi.WebService", "Falcon.SugarApi.WebService\Falcon.SugarApi.WebService.csproj", "{A02586C2-B485-47C3-988B-AC050BD2286C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Falcon.SugarApi.Windows", "Falcon.SugarApi.Windows\Falcon.SugarApi.Windows.csproj", "{68AF37DA-5B3E-4ADF-9054-CE5F42667625}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Falcon.SugarApi.Windows", "Falcon.SugarApi.Windows\Falcon.SugarApi.Windows.csproj", "{68AF37DA-5B3E-4ADF-9054-CE5F42667625}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RabbitMqTest", "RabbitMqTest\RabbitMqTest.csproj", "{7F308FE9-B5C5-45BA-B882-15B4B983C39C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,6 +41,10 @@ Global {68AF37DA-5B3E-4ADF-9054-CE5F42667625}.Debug|Any CPU.Build.0 = Debug|Any CPU {68AF37DA-5B3E-4ADF-9054-CE5F42667625}.Release|Any CPU.ActiveCfg = Release|Any CPU {68AF37DA-5B3E-4ADF-9054-CE5F42667625}.Release|Any CPU.Build.0 = Release|Any CPU + {7F308FE9-B5C5-45BA-B882-15B4B983C39C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F308FE9-B5C5-45BA-B882-15B4B983C39C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F308FE9-B5C5-45BA-B882-15B4B983C39C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F308FE9-B5C5-45BA-B882-15B4B983C39C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/RabbitMqTest/OriginalTest.cs b/RabbitMqTest/OriginalTest.cs new file mode 100644 index 0000000..a40a948 --- /dev/null +++ b/RabbitMqTest/OriginalTest.cs @@ -0,0 +1,142 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using RabbitMQ.Client; +using RabbitMQ.Client.Events; +using System.Text; + +namespace RabbitMqTest +{ + [TestClass] + public class OriginalTest:RabbitmqBase + { + /// + /// 轮训消息,一个生产者,多个消费者轮训接收。 + /// + [TestMethod("轮训消息")] + public void BaseTest() { + var smsg1 = base.RandomString(); + var smsg2 = base.RandomString(); + var smsg3 = base.RandomString(); + //消费者1 + using var channel = GetChannel(); + channel.QueueDeclare("hello",false,false,false,null); + var consumer = new EventingBasicConsumer(channel); + consumer.Received+=(model,args) => { + var msg = Encoding.UTF8.GetString(args.Body.ToArray()); + Console.WriteLine($"Received message 1 {msg}"); + //Assert.IsTrue(msg==smsg1 || msg==smsg2); + + //手动回复Ack,如果非自动回复 + channel.BasicAck(args.DeliveryTag,false); + }; + channel.BasicConsume("hello",false,consumer); + + //消费者2 + using var channel2 = GetChannel(); + var consumer2 = new EventingBasicConsumer(channel2); + consumer2.Received+=(model,args) => { + var msg = Encoding.UTF8.GetString(args.Body.ToArray()); + Console.WriteLine($"Received message 2 {msg}"); + //Assert.IsTrue(msg==smsg1||msg==smsg2); + + //手动回复Ack,如果非自动回复 + channel.BasicAck(args.DeliveryTag,false); + }; + channel.BasicConsume("hello",false,consumer2); + + //生产者 + using var channel1 = GetChannel(); + channel1.QueueDeclare("hello",false,false,false,null); + channel.BasicPublish("","hello",null,Encoding.UTF8.GetBytes(smsg1)); + Console.WriteLine($"Send message 1 {smsg1}"); + channel.BasicPublish("","hello",null,Encoding.UTF8.GetBytes(smsg2)); + Console.WriteLine($"Send message 2 {smsg2}"); + channel.BasicPublish("","hello",null,Encoding.UTF8.GetBytes(smsg3)); + Console.WriteLine($"Send message 3 {smsg3}"); + } + + /// + /// 订阅发布模式。一个发布者多个订阅。消费者可以同时收到消息 + /// + [TestMethod("订阅发布模式")] + public void BaseTest2() { + var exchangeName = RandomString(); + var smsg = RandomString(); + + //消费者1 + using var channel1 = GetChannel(); + //创建交换机 + channel1.ExchangeDeclare(exchangeName,ExchangeType.Fanout); + //创建队列 + var queueName1 = channel1.QueueDeclare().QueueName; + Console.WriteLine($"创建的临时队列名1:{queueName1}"); + channel1.QueueBind(queueName1,exchangeName,"",null); + var consumer1 = new EventingBasicConsumer(channel1); + consumer1.Received+=(m,a) => { + var msgs = Encoding.UTF8.GetString(a.Body.ToArray()); + Console.WriteLine($"Received message 1 {msgs}"); + Assert.AreEqual(msgs,smsg); + }; + channel1.BasicConsume(queueName1,true,consumer1); + + //消费者2 + using var channel2 = GetChannel(); + //创建交换机 + channel2.ExchangeDeclare(exchangeName,ExchangeType.Fanout); + //创建队列 + var queueName2 = channel2.QueueDeclare().QueueName; + Console.WriteLine($"创建的临时队列名2:{queueName2}"); + channel2.QueueBind(queueName2,exchangeName,"",null); + var consumer2 = new EventingBasicConsumer(channel2); + consumer2.Received+=(m,a) => { + var msgs = Encoding.UTF8.GetString(a.Body.ToArray()); + Console.WriteLine($"Received message 2 {msgs}"); + Assert.AreEqual(msgs,smsg); + }; + channel2.BasicConsume(queueName2,true,consumer2); + + //生产者 + using var channel3 = GetChannel(); + channel3.ExchangeDeclare(exchangeName,ExchangeType.Fanout); + channel3.BasicPublish(exchangeName,"",null,Encoding.UTF8.GetBytes(smsg)); + } + + /// + /// 测试生产者先发送消息,消费者后连接接收消息 + /// + [TestMethod("先生产者后消费者")] + public void BaseTest3() { + var smsg = RandomString(); + //以下交换机和队列及其绑定配置需要提前在服务器上配置,否则取消相关注释自行创建 + var exchangeName = "logs"; + var queueName1 = "queueu1"; + var queueName2 = "queueu2"; + + //消费者1 + using var channel1 = GetChannel(); + var consumer1 = new EventingBasicConsumer(channel1); + consumer1.Received+=(m,a) => { + var msgs = Encoding.UTF8.GetString(a.Body.ToArray()); + Console.WriteLine($"Received message 1 {msgs}"); + Assert.AreEqual(msgs,smsg); + }; + channel1.BasicConsume(queueName1,true,consumer1); + + //生产者 + var produce = GetChannel(); + produce.BasicPublish(exchangeName,"",null,Encoding.UTF8.GetBytes(smsg)); + Console.WriteLine($"Send message {smsg}"); + + //消费者2 + using var channel2 = GetChannel(); + var consumer2 = new EventingBasicConsumer(channel2); + consumer2.Received+=(m,a) => { + var msgs = Encoding.UTF8.GetString(a.Body.ToArray()); + Console.WriteLine($"Received message 2 {msgs}"); + Assert.AreEqual(msgs,smsg); + }; + channel2.BasicConsume(queueName2,true,consumer2); + + } + + } +} diff --git a/RabbitMqTest/PageTest.html b/RabbitMqTest/PageTest.html new file mode 100644 index 0000000..476b6ab --- /dev/null +++ b/RabbitMqTest/PageTest.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/RabbitMqTest/RabbitMqTest.csproj b/RabbitMqTest/RabbitMqTest.csproj new file mode 100644 index 0000000..e678004 --- /dev/null +++ b/RabbitMqTest/RabbitMqTest.csproj @@ -0,0 +1,16 @@ + + + + net6.0 + enable + enable + + + + + + + + + + diff --git a/RabbitMqTest/RabbitmqBase.cs b/RabbitMqTest/RabbitmqBase.cs new file mode 100644 index 0000000..6a0a157 --- /dev/null +++ b/RabbitMqTest/RabbitmqBase.cs @@ -0,0 +1,52 @@ +using RabbitMQ.Client; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RabbitMqTest +{ + public abstract class RabbitmqBase + { + /// + /// 创建通道 + /// + /// + protected virtual IModel GetChannel() { + var factory = new ConnectionFactory { HostName="localhost" }; + var connection = factory.CreateConnection(); + return connection.CreateModel(); + } + + private static string MessageChars = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>''"""; + /// + /// 生成随机消息 + /// + protected virtual string RandomString(int len = 10) { + var random = new Random(); + int charslen = MessageChars.Length; + StringBuilder sb = new(len); + for(int i = 0;i + /// 创建队列 + /// + protected virtual void QueueDeclare(IModel channel,string queueName) { + channel.QueueDeclare(queueName,exclusive: false); + } + + /// + /// 创建交换机 + /// + protected virtual void ExchangeDeclare(IModel channel,string exchangeName) { + channel.ExchangeDeclare(exchangeName,ExchangeType.Fanout,autoDelete: true); + } + + } +} diff --git a/RabbitMqTest/stomp.min.js b/RabbitMqTest/stomp.min.js new file mode 100644 index 0000000..21a429f --- /dev/null +++ b/RabbitMqTest/stomp.min.js @@ -0,0 +1,8 @@ +// Generated by CoffeeScript 1.7.1 +/* + Stomp Over WebSocket http://www.jmesnil.net/stomp-websocket/doc/ | Apache License V2.0 + + Copyright (C) 2010-2013 [Jeff Mesnil](http://jmesnil.net/) + Copyright (C) 2012 [FuseSource, Inc.](http://fusesource.com) + */ +(function(){var t,e,n,i,r={}.hasOwnProperty,o=[].slice;t={LF:"\n",NULL:"\x00"};n=function(){var e;function n(t,e,n){this.command=t;this.headers=e!=null?e:{};this.body=n!=null?n:""}n.prototype.toString=function(){var e,i,o,s,u;e=[this.command];o=this.headers["content-length"]===false?true:false;if(o){delete this.headers["content-length"]}u=this.headers;for(i in u){if(!r.call(u,i))continue;s=u[i];e.push(""+i+":"+s)}if(this.body&&!o){e.push("content-length:"+n.sizeOfUTF8(this.body))}e.push(t.LF+this.body);return e.join(t.LF)};n.sizeOfUTF8=function(t){if(t){return encodeURI(t).match(/%..|./g).length}else{return 0}};e=function(e){var i,r,o,s,u,a,c,f,h,l,p,d,g,b,m,v,y;s=e.search(RegExp(""+t.LF+t.LF));u=e.substring(0,s).split(t.LF);o=u.shift();a={};d=function(t){return t.replace(/^\s+|\s+$/g,"")};v=u.reverse();for(g=0,m=v.length;gy;c=p<=y?++b:--b){r=e.charAt(c);if(r===t.NULL){break}i+=r}}return new n(o,a,i)};n.unmarshall=function(n){var i;return function(){var r,o,s,u;s=n.split(RegExp(""+t.NULL+t.LF+"*"));u=[];for(r=0,o=s.length;r0){u.push(e(i))}}return u}()};n.marshall=function(e,i,r){var o;o=new n(e,i,r);return o.toString()+t.NULL};return n}();e=function(){var e;function r(t){this.ws=t;this.ws.binaryType="arraybuffer";this.counter=0;this.connected=false;this.heartbeat={outgoing:1e4,incoming:1e4};this.maxWebSocketFrameSize=16*1024;this.subscriptions={}}r.prototype.debug=function(t){var e;return typeof window!=="undefined"&&window!==null?(e=window.console)!=null?e.log(t):void 0:void 0};e=function(){if(Date.now){return Date.now()}else{return(new Date).valueOf}};r.prototype._transmit=function(t,e,i){var r;r=n.marshall(t,e,i);if(typeof this.debug==="function"){this.debug(">>> "+r)}while(true){if(r.length>this.maxWebSocketFrameSize){this.ws.send(r.substring(0,this.maxWebSocketFrameSize));r=r.substring(this.maxWebSocketFrameSize);if(typeof this.debug==="function"){this.debug("remaining = "+r.length)}}else{return this.ws.send(r)}}};r.prototype._setupHeartbeat=function(n){var r,o,s,u,a,c;if((a=n.version)!==i.VERSIONS.V1_1&&a!==i.VERSIONS.V1_2){return}c=function(){var t,e,i,r;i=n["heart-beat"].split(",");r=[];for(t=0,e=i.length;t>> PING"):void 0}}(this))}if(!(this.heartbeat.incoming===0||o===0)){s=Math.max(this.heartbeat.incoming,o);if(typeof this.debug==="function"){this.debug("check PONG every "+s+"ms")}return this.ponger=i.setInterval(s,function(t){return function(){var n;n=e()-t.serverActivity;if(n>s*2){if(typeof t.debug==="function"){t.debug("did not receive server activity for the last "+n+"ms")}return t.ws.close()}}}(this))}};r.prototype._parseConnect=function(){var t,e,n,i;t=1<=arguments.length?o.call(arguments,0):[];i={};switch(t.length){case 2:i=t[0],e=t[1];break;case 3:if(t[1]instanceof Function){i=t[0],e=t[1],n=t[2]}else{i.login=t[0],i.passcode=t[1],e=t[2]}break;case 4:i.login=t[0],i.passcode=t[1],e=t[2],n=t[3];break;default:i.login=t[0],i.passcode=t[1],e=t[2],n=t[3],i.host=t[4]}return[i,e,n]};r.prototype.connect=function(){var r,s,u,a;r=1<=arguments.length?o.call(arguments,0):[];a=this._parseConnect.apply(this,r);u=a[0],this.connectCallback=a[1],s=a[2];if(typeof this.debug==="function"){this.debug("Opening Web Socket...")}this.ws.onmessage=function(i){return function(r){var o,u,a,c,f,h,l,p,d,g,b,m;c=typeof ArrayBuffer!=="undefined"&&r.data instanceof ArrayBuffer?(o=new Uint8Array(r.data),typeof i.debug==="function"?i.debug("--- got data length: "+o.length):void 0,function(){var t,e,n;n=[];for(t=0,e=o.length;t