@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.1</Version> | |||||
<Version>1.0.2</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
</Project> | </Project> |
@@ -28,6 +28,8 @@ namespace JT808.DotNetty.Core.Configurations | |||||
public int AllIdleTimeSeconds { get; set; } = 3600; | public int AllIdleTimeSeconds { get; set; } = 3600; | ||||
public int UdpSlidingExpirationTimeSeconds { get; set; } = 5*60; | |||||
/// <summary> | /// <summary> | ||||
/// WebApi服务 | /// WebApi服务 | ||||
/// 默认828端口 | /// 默认828端口 | ||||
@@ -14,13 +14,14 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.1</Version> | |||||
<Version>1.0.2</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | <PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | ||||
<PackageReference Include="DotNetty.Transport.Libuv" Version="0.6.0" /> | <PackageReference Include="DotNetty.Transport.Libuv" Version="0.6.0" /> | ||||
<PackageReference Include="DotNetty.Codecs" 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.Hosting.Abstractions" Version="2.2.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | ||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" /> | <PackageReference Include="Newtonsoft.Json" Version="12.0.1" /> | ||||
@@ -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."); | |||||
} | |||||
} | |||||
} |
@@ -6,6 +6,9 @@ using System.Linq; | |||||
using JT808.DotNetty.Abstractions; | using JT808.DotNetty.Abstractions; | ||||
using JT808.DotNetty.Core.Metadata; | using JT808.DotNetty.Core.Metadata; | ||||
using DotNetty.Transport.Channels; | using DotNetty.Transport.Channels; | ||||
using Microsoft.Extensions.Caching.Memory; | |||||
using JT808.DotNetty.Core.Configurations; | |||||
using Microsoft.Extensions.Options; | |||||
namespace JT808.DotNetty.Core | namespace JT808.DotNetty.Core | ||||
{ | { | ||||
@@ -18,13 +21,18 @@ namespace JT808.DotNetty.Core | |||||
private readonly ILogger<JT808UdpSessionManager> logger; | private readonly ILogger<JT808UdpSessionManager> logger; | ||||
private readonly IJT808SessionPublishing jT808SessionPublishing; | private readonly IJT808SessionPublishing jT808SessionPublishing; | ||||
private readonly IMemoryCache memoryCache; | |||||
private readonly IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor; | |||||
public JT808UdpSessionManager( | public JT808UdpSessionManager( | ||||
IJT808SessionPublishing jT808SessionPublishing, | IJT808SessionPublishing jT808SessionPublishing, | ||||
IMemoryCache memoryCache, | |||||
IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor, | |||||
ILoggerFactory loggerFactory) | ILoggerFactory loggerFactory) | ||||
{ | { | ||||
this.jT808SessionPublishing = jT808SessionPublishing; | this.jT808SessionPublishing = jT808SessionPublishing; | ||||
logger = loggerFactory.CreateLogger<JT808UdpSessionManager>(); | logger = loggerFactory.CreateLogger<JT808UdpSessionManager>(); | ||||
this.memoryCache = memoryCache; | |||||
this.jT808ConfigurationAccessor = jT808ConfigurationAccessor; | |||||
} | } | ||||
private ConcurrentDictionary<string, JT808UdpSession> SessionIdDict = new ConcurrentDictionary<string, JT808UdpSession>(StringComparer.OrdinalIgnoreCase); | private ConcurrentDictionary<string, JT808UdpSession> SessionIdDict = new ConcurrentDictionary<string, JT808UdpSession>(StringComparer.OrdinalIgnoreCase); | ||||
@@ -50,11 +58,29 @@ namespace JT808.DotNetty.Core | |||||
return default; | return default; | ||||
} | } | ||||
} | } | ||||
/// <summary> | |||||
/// 定期去删除过期数据 | |||||
/// </summary> | |||||
public void TimerToRemoveExpiredData() { | |||||
foreach (var item in SessionIdDict) | |||||
{ | |||||
memoryCache.Get(item.Key); | |||||
} | |||||
} | |||||
public void TryAdd(JT808UdpSession appSession) | 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.先判断是否在缓存里面 | //1.先判断是否在缓存里面 | ||||
if(SessionIdDict.TryGetValue(appSession.TerminalPhoneNo,out JT808UdpSession jT808UdpSession)) | |||||
if (SessionIdDict.TryGetValue(appSession.TerminalPhoneNo,out JT808UdpSession jT808UdpSession)) | |||||
{ | { | ||||
//处理缓存 | //处理缓存 | ||||
//判断设备的终结点是否相同 | //判断设备的终结点是否相同 | ||||
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.1</Version> | |||||
<Version>1.0.2</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | <PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | ||||
@@ -59,8 +59,8 @@ namespace JT808.DotNetty.Hosting | |||||
c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; | c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; | ||||
c.LoggerFactory = p.GetRequiredService<ILoggerFactory>(); | 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(); | await serverHostBuilder.RunConsoleAsync(); | ||||
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.1</Version> | |||||
<Version>1.0.2</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -22,6 +22,7 @@ | |||||
<PackageReference Include="DotNetty.Codecs" Version="0.6.0" /> | <PackageReference Include="DotNetty.Codecs" Version="0.6.0" /> | ||||
<PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | <PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | ||||
<PackageReference Include="DotNetty.Transport.Libuv" 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.Hosting.Abstractions" Version="2.2.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
@@ -4,8 +4,11 @@ using JT808.DotNetty.Core.Handlers; | |||||
using JT808.DotNetty.Core.Jobs; | using JT808.DotNetty.Core.Jobs; | ||||
using JT808.DotNetty.Core.Services; | using JT808.DotNetty.Core.Services; | ||||
using JT808.DotNetty.Udp.Handlers; | using JT808.DotNetty.Udp.Handlers; | ||||
using Microsoft.Extensions.Caching.Memory; | |||||
using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||
using Microsoft.Extensions.DependencyInjection.Extensions; | using Microsoft.Extensions.DependencyInjection.Extensions; | ||||
using Microsoft.Extensions.Internal; | |||||
using System; | |||||
using System.Runtime.CompilerServices; | using System.Runtime.CompilerServices; | ||||
[assembly: InternalsVisibleTo("JT808.DotNetty.Udp.Test")] | [assembly: InternalsVisibleTo("JT808.DotNetty.Udp.Test")] | ||||
@@ -16,7 +19,8 @@ namespace JT808.DotNetty.Udp | |||||
{ | { | ||||
public static IServiceCollection AddJT808UdpHost(this IServiceCollection serviceDescriptors) | public static IServiceCollection AddJT808UdpHost(this IServiceCollection serviceDescriptors) | ||||
{ | { | ||||
serviceDescriptors.TryAddSingleton<JT808UdpSessionManager>(); | |||||
serviceDescriptors.TryAddSingleton< IMemoryCache, MemoryCache>(); | |||||
serviceDescriptors.TryAddSingleton<JT808UdpSessionManager>(); | |||||
serviceDescriptors.TryAddSingleton<JT808UdpAtomicCounterService>(); | serviceDescriptors.TryAddSingleton<JT808UdpAtomicCounterService>(); | ||||
serviceDescriptors.TryAddSingleton<JT808UdpTrafficService>(); | serviceDescriptors.TryAddSingleton<JT808UdpTrafficService>(); | ||||
serviceDescriptors.TryAddSingleton<JT808MsgIdUdpHandlerBase, JT808MsgIdDefaultUdpHandler>(); | serviceDescriptors.TryAddSingleton<JT808MsgIdUdpHandlerBase, JT808MsgIdDefaultUdpHandler>(); | ||||
@@ -24,6 +28,7 @@ namespace JT808.DotNetty.Udp | |||||
serviceDescriptors.TryAddScoped<JT808UdpServerHandler>(); | serviceDescriptors.TryAddScoped<JT808UdpServerHandler>(); | ||||
serviceDescriptors.AddHostedService<JT808UdpAtomicCouterResetDailyJob>(); | serviceDescriptors.AddHostedService<JT808UdpAtomicCouterResetDailyJob>(); | ||||
serviceDescriptors.AddHostedService<JT808UdpTrafficResetDailyJob>(); | serviceDescriptors.AddHostedService<JT808UdpTrafficResetDailyJob>(); | ||||
serviceDescriptors.AddHostedService<JT808UdpMaintainSessionJob>(); | |||||
serviceDescriptors.AddHostedService<JT808UdpServerHost>(); | serviceDescriptors.AddHostedService<JT808UdpServerHost>(); | ||||
return serviceDescriptors; | return serviceDescriptors; | ||||
} | } | ||||
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.1</Version> | |||||
<Version>1.0.2</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | <PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | ||||
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.1</Version> | |||||
<Version>1.0.2</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -1 +1 @@ | |||||
Subproject commit 16b8bfcd87686c809912b3ed722c5c035e1121cf | |||||
Subproject commit 641907ad8373cf62d8973dedf76b84aaa894e52f |