Преглед на файлове

新增udp的session缓存管理,默认5min的滑动过期时间。

tags/v1.0.2
TK преди 6 години
родител
ревизия
4b0e395b09
променени са 12 файла, в които са добавени 92 реда и са изтрити 13 реда
  1. +1
    -1
      src/JT808.DotNetty.Abstractions/JT808.DotNetty.Abstractions.csproj
  2. +2
    -0
      src/JT808.DotNetty.Core/Configurations/JT808Configuration.cs
  3. +2
    -1
      src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj
  4. +44
    -0
      src/JT808.DotNetty.Core/Jobs/JT808UdpMaintainSessionJob.cs
  5. +29
    -3
      src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs
  6. +1
    -1
      src/JT808.DotNetty.Tcp/JT808.DotNetty.Tcp.csproj
  7. +2
    -2
      src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Program.cs
  8. +2
    -1
      src/JT808.DotNetty.Udp/JT808.DotNetty.Udp.csproj
  9. +6
    -1
      src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs
  10. +1
    -1
      src/JT808.DotNetty.WebApi/JT808.DotNetty.WebApi.csproj
  11. +1
    -1
      src/JT808.DotNetty.WebApiClientTool/JT808.DotNetty.WebApiClientTool.csproj
  12. +1
    -1
      src/JT808.Protocol

+ 1
- 1
src/JT808.DotNetty.Abstractions/JT808.DotNetty.Abstractions.csproj Целия файл

@@ -14,7 +14,7 @@
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>1.0.1</Version>
<Version>1.0.2</Version>
</PropertyGroup>

</Project>

+ 2
- 0
src/JT808.DotNetty.Core/Configurations/JT808Configuration.cs Целия файл

@@ -28,6 +28,8 @@ namespace JT808.DotNetty.Core.Configurations

public int AllIdleTimeSeconds { get; set; } = 3600;

public int UdpSlidingExpirationTimeSeconds { get; set; } = 5*60;

/// <summary>
/// WebApi服务
/// 默认828端口


+ 2
- 1
src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj Целия файл

@@ -14,13 +14,14 @@
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>1.0.1</Version>
<Version>1.0.2</Version>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="DotNetty.Handlers" Version="0.6.0" />
<PackageReference Include="DotNetty.Transport.Libuv" Version="0.6.0" />
<PackageReference Include="DotNetty.Codecs" Version="0.6.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />


+ 44
- 0
src/JT808.DotNetty.Core/Jobs/JT808UdpMaintainSessionJob.cs Целия файл

@@ -0,0 +1,44 @@
using JT808.DotNetty.Core.Configurations;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace JT808.DotNetty.Core.Jobs
{
public class JT808UdpMaintainSessionJob : JT808BackgroundService
{
private readonly ILogger<JT808UdpMaintainSessionJob> _logger;

private readonly JT808UdpSessionManager jT808UdpSessionManager;
private readonly IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor;

public JT808UdpMaintainSessionJob(
JT808UdpSessionManager jT808UdpSessionManager,
IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor,
ILoggerFactory loggerFactory)
{
this.jT808UdpSessionManager = jT808UdpSessionManager;
this.jT808ConfigurationAccessor = jT808ConfigurationAccessor;
_logger = loggerFactory.CreateLogger<JT808UdpMaintainSessionJob>();
}

public override string ServiceName => nameof(JT808UdpMaintainSessionJob);

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation($"{ServiceName} is starting.");
stoppingToken.Register(() => _logger.LogInformation($"{ServiceName} background task is stopping."));
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation($"{ServiceName} task doing background work.");
jT808UdpSessionManager.TimerToRemoveExpiredData();
await Task.Delay(TimeSpan.FromSeconds(jT808ConfigurationAccessor.CurrentValue.UdpSlidingExpirationTimeSeconds), stoppingToken);
}
_logger.LogInformation($"{ServiceName} background task is stopping.");
}
}
}

+ 29
- 3
src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs Целия файл

@@ -6,6 +6,9 @@ using System.Linq;
using JT808.DotNetty.Abstractions;
using JT808.DotNetty.Core.Metadata;
using DotNetty.Transport.Channels;
using Microsoft.Extensions.Caching.Memory;
using JT808.DotNetty.Core.Configurations;
using Microsoft.Extensions.Options;

namespace JT808.DotNetty.Core
{
@@ -18,13 +21,18 @@ namespace JT808.DotNetty.Core
private readonly ILogger<JT808UdpSessionManager> logger;

private readonly IJT808SessionPublishing jT808SessionPublishing;

private readonly IMemoryCache memoryCache;
private readonly IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor;
public JT808UdpSessionManager(
IJT808SessionPublishing jT808SessionPublishing,
IMemoryCache memoryCache,
IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor,
ILoggerFactory loggerFactory)
{
this.jT808SessionPublishing = jT808SessionPublishing;
logger = loggerFactory.CreateLogger<JT808UdpSessionManager>();
this.memoryCache = memoryCache;
this.jT808ConfigurationAccessor = jT808ConfigurationAccessor;
}

private ConcurrentDictionary<string, JT808UdpSession> SessionIdDict = new ConcurrentDictionary<string, JT808UdpSession>(StringComparer.OrdinalIgnoreCase);
@@ -50,11 +58,29 @@ namespace JT808.DotNetty.Core
return default;
}
}
/// <summary>
/// 定期去删除过期数据
/// </summary>
public void TimerToRemoveExpiredData() {
foreach (var item in SessionIdDict)
{
memoryCache.Get(item.Key);
}
}

public void TryAdd(JT808UdpSession appSession)
{
{
memoryCache.GetOrCreate<bool>(appSession.TerminalPhoneNo, (cacheEntry) =>
{
cacheEntry.SetSlidingExpiration(TimeSpan.FromSeconds(jT808ConfigurationAccessor.CurrentValue.UdpSlidingExpirationTimeSeconds));
cacheEntry.RegisterPostEvictionCallback((key, value, reason, state) =>
{
RemoveSession(key.ToString());
});
return true;
});
//1.先判断是否在缓存里面
if(SessionIdDict.TryGetValue(appSession.TerminalPhoneNo,out JT808UdpSession jT808UdpSession))
if (SessionIdDict.TryGetValue(appSession.TerminalPhoneNo,out JT808UdpSession jT808UdpSession))
{
//处理缓存
//判断设备的终结点是否相同


+ 1
- 1
src/JT808.DotNetty.Tcp/JT808.DotNetty.Tcp.csproj Целия файл

@@ -14,7 +14,7 @@
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>1.0.1</Version>
<Version>1.0.2</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" />


+ 2
- 2
src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Program.cs Целия файл

@@ -59,8 +59,8 @@ namespace JT808.DotNetty.Hosting
c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
c.LoggerFactory = p.GetRequiredService<ILoggerFactory>();
});
var client = services.BuildServiceProvider().GetRequiredService<IJT808DotNettyWebApi>();
var result = client.GetTcpAtomicCounter().InvokeAsync().Result;
//var client = services.BuildServiceProvider().GetRequiredService<IJT808DotNettyWebApi>();
//var result = client.GetTcpAtomicCounter().InvokeAsync().Result;
});

await serverHostBuilder.RunConsoleAsync();


+ 2
- 1
src/JT808.DotNetty.Udp/JT808.DotNetty.Udp.csproj Целия файл

@@ -14,7 +14,7 @@
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>1.0.1</Version>
<Version>1.0.2</Version>
</PropertyGroup>

<ItemGroup>
@@ -22,6 +22,7 @@
<PackageReference Include="DotNetty.Codecs" Version="0.6.0" />
<PackageReference Include="DotNetty.Handlers" Version="0.6.0" />
<PackageReference Include="DotNetty.Transport.Libuv" Version="0.6.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" />
</ItemGroup>


+ 6
- 1
src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs Целия файл

@@ -4,8 +4,11 @@ using JT808.DotNetty.Core.Handlers;
using JT808.DotNetty.Core.Jobs;
using JT808.DotNetty.Core.Services;
using JT808.DotNetty.Udp.Handlers;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Internal;
using System;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("JT808.DotNetty.Udp.Test")]
@@ -16,7 +19,8 @@ namespace JT808.DotNetty.Udp
{
public static IServiceCollection AddJT808UdpHost(this IServiceCollection serviceDescriptors)
{
serviceDescriptors.TryAddSingleton<JT808UdpSessionManager>();
serviceDescriptors.TryAddSingleton< IMemoryCache, MemoryCache>();
serviceDescriptors.TryAddSingleton<JT808UdpSessionManager>();
serviceDescriptors.TryAddSingleton<JT808UdpAtomicCounterService>();
serviceDescriptors.TryAddSingleton<JT808UdpTrafficService>();
serviceDescriptors.TryAddSingleton<JT808MsgIdUdpHandlerBase, JT808MsgIdDefaultUdpHandler>();
@@ -24,6 +28,7 @@ namespace JT808.DotNetty.Udp
serviceDescriptors.TryAddScoped<JT808UdpServerHandler>();
serviceDescriptors.AddHostedService<JT808UdpAtomicCouterResetDailyJob>();
serviceDescriptors.AddHostedService<JT808UdpTrafficResetDailyJob>();
serviceDescriptors.AddHostedService<JT808UdpMaintainSessionJob>();
serviceDescriptors.AddHostedService<JT808UdpServerHost>();
return serviceDescriptors;
}


+ 1
- 1
src/JT808.DotNetty.WebApi/JT808.DotNetty.WebApi.csproj Целия файл

@@ -14,7 +14,7 @@
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>1.0.1</Version>
<Version>1.0.2</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" />


+ 1
- 1
src/JT808.DotNetty.WebApiClientTool/JT808.DotNetty.WebApiClientTool.csproj Целия файл

@@ -14,7 +14,7 @@
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>1.0.1</Version>
<Version>1.0.2</Version>
</PropertyGroup>

<ItemGroup>


+ 1
- 1
src/JT808.Protocol

@@ -1 +1 @@
Subproject commit 16b8bfcd87686c809912b3ed722c5c035e1121cf
Subproject commit 641907ad8373cf62d8973dedf76b84aaa894e52f

Зареждане…
Отказ
Запис