Browse Source

😁增加RabbitMQ消息队列及代码调整优化 感谢 @Hans !975

zuohuaijun 2 years ago
parent
commit
c740e2ce9f

+ 3 - 0
Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj

@@ -54,6 +54,9 @@
     <None Update="Configuration\Email.json">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Update="Configuration\EventBus.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Update="Configuration\JWT.json">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>

+ 4 - 2
Admin.NET/Admin.NET.Application/Configuration/EventBus.json

@@ -1,8 +1,10 @@
 {
+  "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
+
   "EventBus": {
     "RabbitMQ": {
-      "UserName": "guest",
-      "Password": "aaa@1234",
+      "UserName": "adminnet",
+      "Password": "adminnet++123456",
       "HostName": "127.0.0.1",
       "Port": 5672
     }

+ 6 - 12
Admin.NET/Admin.NET.Core/EventBus/RabbitMQEventSourceStore.cs

@@ -11,7 +11,7 @@ using RabbitMQ.Client;
 using RabbitMQ.Client.Events;
 using System.Threading.Channels;
 
-namespace Admin.Core;
+namespace Admin.NET.Core;
 
 /// <summary>
 /// RabbitMQ自定义事件源存储器
@@ -74,7 +74,7 @@ public class RabbitMQEventSourceStore : IEventSourceStorer
             // 读取原始消息
             var stringEventSource = Encoding.UTF8.GetString(ea.Body.ToArray());
 
-            // 转换为 IEventSource,这里可以选择自己喜欢的序列化工具,如果自定义了 EventSource,注意属性是可读可写
+            // 转换为 IEventSource,如果自定义了 EventSource,注意属性是可读可写
             var eventSource = JSON.Deserialize<ChannelEventSource>(stringEventSource);
 
             // 写入内存管道存储器
@@ -84,7 +84,7 @@ public class RabbitMQEventSourceStore : IEventSourceStorer
             _model.BasicAck(ea.DeliveryTag, false);
         };
 
-        // 启动消费者 设置为手动应答消息
+        // 启动消费者设置为手动应答消息
         _model.BasicConsume(routeKey, false, consumer);
     }
 
@@ -96,24 +96,19 @@ public class RabbitMQEventSourceStore : IEventSourceStorer
     /// <returns><see cref="ValueTask"/></returns>
     public async ValueTask WriteAsync(IEventSource eventSource, CancellationToken cancellationToken)
     {
-        // 空检查
         if (eventSource == default)
-        {
             throw new ArgumentNullException(nameof(eventSource));
-        }
 
-        // 这里判断是否是 ChannelEventSource 或自定义的 EventSource
+        // 判断是否是 ChannelEventSource 或自定义的 EventSource
         if (eventSource is ChannelEventSource source)
         {
-            // 序列化,这里可以选择自己喜欢的序列化工具
+            // 序列化及发布
             var data = Encoding.UTF8.GetBytes(JSON.Serialize(source));
-
-            // 发布
             _model.BasicPublish("", _routeKey, null, data);
         }
         else
         {
-            // 这里处理动态订阅问题
+            // 处理动态订阅
             await _channel.Writer.WriteAsync(eventSource, cancellationToken);
         }
     }
@@ -125,7 +120,6 @@ public class RabbitMQEventSourceStore : IEventSourceStorer
     /// <returns>事件源对象</returns>
     public async ValueTask<IEventSource> ReadAsync(CancellationToken cancellationToken)
     {
-        // 读取一条事件源
         var eventSource = await _channel.Reader.ReadAsync(cancellationToken);
         return eventSource;
     }

+ 47 - 0
Admin.NET/Admin.NET.Core/Option/EventBusOptions.cs

@@ -0,0 +1,47 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 事件总线配置选项
+/// </summary>
+public sealed class EventBusOptions : IConfigurableOptions
+{
+    /// <summary>
+    /// RabbitMQ
+    /// </summary>
+    public RabbitMQSettings RabbitMQ { get; set; }
+}
+
+/// <summary>
+/// RabbitMQ
+/// </summary>
+public sealed class RabbitMQSettings
+{
+    /// <summary>
+    /// 账号
+    /// </summary>
+    public string UserName { get; set; }
+
+    /// <summary>
+    /// 密码
+    /// </summary>
+    public string Password { get; set; }
+
+    /// <summary>
+    /// 主机
+    /// </summary>
+    public string HostName { get; set; }
+
+    /// <summary>
+    /// 端口
+    /// </summary>
+    public int Port { get; set; }
+}

+ 1 - 0
Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs

@@ -39,6 +39,7 @@ public static class ProjectOptions
         services.AddConfigurableOptions<OAuthOptions>();
         services.AddConfigurableOptions<CryptogramOptions>();
         services.AddConfigurableOptions<SMSOptions>();
+        services.AddConfigurableOptions<EventBusOptions>();
         //services.AddConfigurableOptions<IpRateLimitingOptions>();
         //services.AddConfigurableOptions<IpRateLimitPoliciesOptions>();
         //services.AddConfigurableOptions<ClientRateLimitingOptions>();

+ 26 - 24
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -108,36 +108,38 @@ public class Startup : AppStartup
             options.LogEnabled = false;
             // 事件执行器(失败重试)
             options.AddExecutor<RetryEventHandlerExecutor>();
+
+            #region Redis消息队列
+
             //// 替换事件源存储器
             //options.ReplaceStorer(serviceProvider =>
             //{
             //    var redisCache = serviceProvider.GetService<ICache>();
-            //    // 创建默认内存通道事件源对象,可自定义队列路由key,比如这里是 eventbus
-            //    return new RedisEventSourceStorer(redisCache, "eventbus", 3000);
+            //    // 创建默认内存通道事件源对象,可自定义队列路由key,如:adminnet
+            //    return new RedisEventSourceStorer(redisCache, "adminnet", 3000);
             //});
-            #region RabbitMQ示例
-            //var _UserName = App.GetConfig<string>("EventBus:RabbitMQ:UserName");
-            //var _Password = App.GetConfig<string>("EventBus:RabbitMQ:Password");
-            //var _HostName = App.GetConfig<string>("EventBus:RabbitMQ:HostName");
-            //var _Port = App.GetConfig<int>("EventBus:RabbitMQ:Port");
-            //if (!string.IsNullOrEmpty(_HostName) && !string.IsNullOrEmpty(_Password) && !string.IsNullOrEmpty(_UserName))
+
+            #endregion Redis消息队列
+
+            #region RabbitMQ消息队列
+
+            //// 创建默认内存通道事件源对象,可自定义队列路由key,如:adminnet
+            //var eventBusOpt = App.GetConfig<EventBusOptions>("EventBus", true);
+            //var rbmqEventSourceStorer = new RabbitMQEventSourceStore(new ConnectionFactory
             //{
-            //    // 创建默认内存通道事件源对象,可自定义队列路由key,比如这里是 eventbus
-            //    var rbmqEventSourceStorer = new RabbitMQEventSourceStore(new ConnectionFactory
-            //    {
-            //        UserName = _UserName,
-            //        Password = _Password,
-            //        HostName = _HostName,
-            //        Port = _Port
-            //    }, "eventbus", 3000);
-
-            //    // 替换默认事件总线存储器
-            //    options.ReplaceStorer(serviceProvider =>
-            //    {
-            //        return rbmqEventSourceStorer;
-            //    });
-            //}
-            #endregion
+            //    UserName = eventBusOpt.RabbitMQ.UserName,
+            //    Password = eventBusOpt.RabbitMQ.Password,
+            //    HostName = eventBusOpt.RabbitMQ.HostName,
+            //    Port = eventBusOpt.RabbitMQ.Port
+            //}, "adminnet", 3000);
+
+            //// 替换默认事件总线存储器
+            //options.ReplaceStorer(serviceProvider =>
+            //{
+            //    return rbmqEventSourceStorer;
+            //});
+
+            #endregion RabbitMQ消息队列
         });
 
         // 图像处理