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

重构udpSession管理模块

tags/v1.1.0
TK пре 6 година
родитељ
комит
bcbc0332da
10 измењених фајлова са 21 додато и 103 уклоњено
  1. +1
    -1
      src/JT808.DotNetty.Abstractions/JT808.DotNetty.Abstractions.csproj
  2. +0
    -2
      src/JT808.DotNetty.Core/Configurations/JT808Configuration.cs
  3. +5
    -2
      src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj
  4. +0
    -44
      src/JT808.DotNetty.Core/Jobs/JT808UdpMaintainSessionJob.cs
  5. +11
    -46
      src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs
  6. +1
    -1
      src/JT808.DotNetty.Tcp/JT808.DotNetty.Tcp.csproj
  7. +1
    -2
      src/JT808.DotNetty.Udp/JT808.DotNetty.Udp.csproj
  8. +0
    -3
      src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs
  9. +1
    -1
      src/JT808.DotNetty.WebApi/JT808.DotNetty.WebApi.csproj
  10. +1
    -1
      src/JT808.DotNetty.WebApiClientTool/JT808.DotNetty.WebApiClientTool.csproj

+ 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.2</Version>
<Version>1.0.3</Version>
</PropertyGroup>

</Project>

+ 0
- 2
src/JT808.DotNetty.Core/Configurations/JT808Configuration.cs Прегледај датотеку

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

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

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

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


+ 5
- 2
src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj Прегледај датотеку

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

<ItemGroup>
<Compile Remove="Jobs\JT808UdpMaintainSessionJob.cs" />
</ItemGroup>

<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" />


+ 0
- 44
src/JT808.DotNetty.Core/Jobs/JT808UdpMaintainSessionJob.cs Прегледај датотеку

@@ -1,44 +0,0 @@
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.");
}
}
}

+ 11
- 46
src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs Прегледај датотеку

@@ -6,7 +6,6 @@ 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;

@@ -21,17 +20,14 @@ 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;
}

@@ -58,59 +54,28 @@ 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 (jT808UdpSession.Sender.Equals(appSession.Sender))
{
//相同 更新最后上线时间
//每次使用最新的通道
//将设备第一次上线时间赋值给当前上线的时间
appSession.StartTime = jT808UdpSession.StartTime;
SessionIdDict.TryUpdate(appSession.TerminalPhoneNo, appSession, appSession);
}
else
{
//不同 算成新设备上来并且推送通知
SessionIdDict.TryUpdate(appSession.TerminalPhoneNo, appSession, appSession);
jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, appSession.TerminalPhoneNo);
}
SessionIdDict.TryUpdate(appSession.TerminalPhoneNo, appSession, appSession);
}
else
{
//添加缓存
if (SessionIdDict.TryAdd(appSession.TerminalPhoneNo, appSession))
{
//使用场景:
//部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接,
//这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。
//有设备关联上来可以进行通知 例如:使用Redis发布订阅
jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, appSession.TerminalPhoneNo);
}
//使用场景:
//部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接,
//这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。
//有设备关联上来可以进行通知 例如:使用Redis发布订阅
SessionIdDict.TryAdd(appSession.TerminalPhoneNo, appSession);
}
//移动是个大的内网,不跟随下发,根本就发不出来
//移动很多卡,存储的那个socket地址端口,有效期非常短
//不速度快点下发,那个socket地址端口就可能映射到别的对应卡去了
//所以此处采用跟随设备消息下发指令
jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, appSession.TerminalPhoneNo);
}

public void Heartbeat(string terminalPhoneNo)


+ 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.2</Version>
<Version>1.0.3</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" />


+ 1
- 2
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.2</Version>
<Version>1.0.3</Version>
</PropertyGroup>

<ItemGroup>
@@ -22,7 +22,6 @@
<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>


+ 0
- 3
src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs Прегледај датотеку

@@ -4,7 +4,6 @@ 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;
@@ -19,7 +18,6 @@ namespace JT808.DotNetty.Udp
{
public static IServiceCollection AddJT808UdpHost(this IServiceCollection serviceDescriptors)
{
serviceDescriptors.TryAddSingleton< IMemoryCache, MemoryCache>();
serviceDescriptors.TryAddSingleton<JT808UdpSessionManager>();
serviceDescriptors.TryAddSingleton<JT808UdpAtomicCounterService>();
serviceDescriptors.TryAddSingleton<JT808UdpTrafficService>();
@@ -28,7 +26,6 @@ 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.2</Version>
<Version>1.0.3</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.2</Version>
<Version>1.0.3</Version>
</PropertyGroup>

<ItemGroup>


Loading…
Откажи
Сачувај