Преглед изворни кода

1、升级Furion v4.4.8 2、增加redis自定义事件源存储

zuohuaijun пре 3 година
родитељ
комит
7af117e475

+ 3 - 3
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -24,9 +24,9 @@
 
   <ItemGroup>
     <PackageReference Include="AspNetCoreRateLimit" Version="4.0.2" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.4.6" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.4.6" />
-    <PackageReference Include="Furion.Pure" Version="4.4.6" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.4.8" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.4.8" />
+    <PackageReference Include="Furion.Pure" Version="4.4.8" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.6.4" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.6.4" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.9" />

+ 19 - 0
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -2674,6 +2674,25 @@
             <param name="context"></param>
             <returns></returns>
         </member>
+        <member name="T:Admin.NET.Core.RedisEventSourceStorer">
+            <summary>
+            Redis自定义事件源存储器
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.RedisEventSourceStorer.WriteAsync(Furion.EventBus.IEventSource,System.Threading.CancellationToken)">
+            <summary>
+            往 Redis 中写入一条
+            </summary>
+            <param name="eventSource"></param>
+            <param name="cancellationToken"></param>
+        </member>
+        <member name="M:Admin.NET.Core.RedisEventSourceStorer.ReadAsync(System.Threading.CancellationToken)">
+            <summary>
+            从 Redis 中读取一条
+            </summary>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="T:Admin.NET.Core.RetryEventHandlerExecutor">
             <summary>
             事件执行器-超时控制、失败重试熔断等等

+ 2 - 2
Admin.NET/Admin.NET.Core/AdminNETConfig.json

@@ -74,8 +74,8 @@
         "SignalRSupport": true // 启用 SignalR 跨域支持
     },
     "Cache": {
-        "CacheType": "Memory", // Memory、Redis
-        "RedisConnectionString": "127.0.0.1:6379;password=;db=2"
+        "CacheType": "Redis", // Memory、Redis
+        "RedisConnectionString": "server=127.0.0.2:6379,127.0.0.1:6379;password=;db=5;"
     },
     "SnowId": {
         "WorkerId": 5 // 取值范围0~63,默认1

+ 2 - 2
Admin.NET/Admin.NET.Core/Cache/CacheSetup.cs

@@ -10,12 +10,12 @@ public static class CacheSetup
     /// <param name="services"></param>
     public static void AddCache(this IServiceCollection services)
     {
-        services.AddSingleton<ICache>(options =>
+        services.AddSingleton(options =>
         {
             var cacheOptions = App.GetOptions<CacheOptions>();
             if (cacheOptions.CacheType == CacheTypeEnum.Redis.ToString())
             {
-                var redis = new Redis();
+                var redis = new FullRedis();
                 redis.Init(cacheOptions.RedisConnectionString);
                 return redis;
             }

+ 63 - 0
Admin.NET/Admin.NET.Core/EventBus/RedisEventSourceStorer.cs

@@ -0,0 +1,63 @@
+using NewLife.Caching;
+using System.Threading.Channels;
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// Redis自定义事件源存储器
+/// </summary>
+public class RedisEventSourceStorer : IEventSourceStorer
+{
+    private readonly Channel<IEventSource> _channel; // 内存通道事件源存储器
+
+    private readonly FullRedis _redis;
+
+    private readonly string _topic = "eventbus";
+
+    public RedisEventSourceStorer(ICache redis, int capacity = 10000)
+    {
+        _redis = (FullRedis)redis;
+
+        // 配置通道(超出默认容量后进入等待)
+        var boundedChannelOptions = new BoundedChannelOptions(capacity)
+        {
+            FullMode = BoundedChannelFullMode.Wait
+        };
+        // 创建有限容量通道
+        _channel = Channel.CreateBounded<IEventSource>(boundedChannelOptions);
+        //RedisHelper.Subscribe((_topic, msg =>
+        //{
+        //    var eventSource = JSON.Deserialize<ChannelEventSource>(msg.Body);
+        //    // 写入内存管道存储器
+        //    _channel!.Writer.TryWrite(eventSource);
+        //}
+        //));
+    }
+
+    /// <summary>
+    /// 往 Redis 中写入一条
+    /// </summary>
+    /// <param name="eventSource"></param>
+    /// <param name="cancellationToken"></param>
+    public async ValueTask WriteAsync(IEventSource eventSource, CancellationToken cancellationToken)
+    {
+        if (eventSource is ChannelEventSource es)
+        {
+            //await RedisHelper.PublishAsync(_topic, JSON.Serialize(es));
+        }
+        else
+        {
+            await _channel.Writer.WriteAsync(eventSource, cancellationToken);
+        }
+    }
+
+    /// <summary>
+    /// 从 Redis 中读取一条
+    /// </summary>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public async ValueTask<IEventSource> ReadAsync(CancellationToken cancellationToken)
+    {
+        return await _channel.Reader.ReadAsync(cancellationToken);
+    }
+}

+ 6 - 0
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -89,6 +89,12 @@ public class Startup : AppStartup
             options.LogEnabled = false;
             // 事件执行器(失败重试)
             options.AddExecutor<RetryEventHandlerExecutor>();
+            //// 替换事件源存储器
+            //options.ReplaceStorer(serviceProvider =>
+            //{
+            //    var redisClient = serviceProvider.GetService<ICache>();
+            //    return new RedisEventSourceStorer(redisClient);
+            //});
         });
 
         // OSS对象存储(必须一个个赋值)