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