@@ -7,10 +7,10 @@ | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="JT808.DotNetty.Client" Version="2.3.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" /> | |||
<PackageReference Include="WebApiClient.Extensions.DependencyInjection" Version="2.0.3" /> | |||
</ItemGroup> | |||
@@ -7,10 +7,10 @@ | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="JT808.DotNetty.Tcp" Version="2.3.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" /> | |||
<PackageReference Include="WebApiClient.Extensions.DependencyInjection" Version="2.0.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -8,10 +8,10 @@ | |||
<ItemGroup> | |||
<PackageReference Include="JT808.Gateway.Abstractions" Version="1.0.0" /> | |||
<PackageReference Include="JT808.Gateway.Client" Version="1.0.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" /> | |||
<PackageReference Include="WebApiClient.Extensions.DependencyInjection" Version="2.0.3" /> | |||
</ItemGroup> | |||
</Project> |
@@ -8,10 +8,10 @@ | |||
<ItemGroup> | |||
<PackageReference Include="JT808.Gateway" Version="1.0.0" /> | |||
<PackageReference Include="JT808.Gateway.Kafka" Version="1.0.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -14,10 +14,10 @@ | |||
<PackageReference Include="JT808.Gateway.SessionNotice" Version="1.0.0" /> | |||
<PackageReference Include="JT808.Gateway.Traffic" Version="1.0.0" /> | |||
<PackageReference Include="JT808.Gateway.Transmit" Version="1.0.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -12,10 +12,10 @@ | |||
<PackageReference Include="JT808.Gateway.SessionNotice" Version="1.0.0" /> | |||
<PackageReference Include="JT808.Gateway.Traffic" Version="1.0.0" /> | |||
<PackageReference Include="JT808.Gateway.Transmit" Version="1.0.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Update="appsettings.json"> | |||
@@ -17,7 +17,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.SimpleQueueSe | |||
EndProject | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.SimpleQueueService", "JT808.Gateway.SimpleQueueService\JT808.Gateway.SimpleQueueService.csproj", "{E2D1CFEF-417A-4C44-BC2E-E5A160602485}" | |||
EndProject | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.Gateway.SimpleQueueNotification", "JT808.Gateway.SimpleQueueNotification\JT808.Gateway.SimpleQueueNotification.csproj", "{163D2EE2-9A62-4E8A-B203-BF147909E89A}" | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.SimpleQueueNotification", "JT808.Gateway.SimpleQueueNotification\JT808.Gateway.SimpleQueueNotification.csproj", "{163D2EE2-9A62-4E8A-B203-BF147909E89A}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
@@ -10,8 +10,9 @@ using System.Threading.Tasks; | |||
namespace JT808.DotNetty.Kafka | |||
{ | |||
public class JT808MsgConsumer : IJT808MsgConsumer | |||
public sealed class JT808MsgConsumer : IJT808MsgConsumer | |||
{ | |||
private bool disposed = false; | |||
public CancellationTokenSource Cts { get; private set; } = new CancellationTokenSource(); | |||
private readonly IConsumer<string, byte[]> consumer; | |||
@@ -35,6 +36,7 @@ namespace JT808.DotNetty.Kafka | |||
{ | |||
while (!Cts.IsCancellationRequested) | |||
{ | |||
if (disposed) return; | |||
try | |||
{ | |||
//如果不指定分区,根据kafka的机制会从多个分区中拉取数据 | |||
@@ -42,9 +44,9 @@ namespace JT808.DotNetty.Kafka | |||
var data = consumer.Consume(Cts.Token); | |||
if (logger.IsEnabled(LogLevel.Debug)) | |||
{ | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Message.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
} | |||
callback((data.Key, data.Value)); | |||
callback((data.Message.Key, data.Message.Value)); | |||
} | |||
catch (ConsumeException ex) | |||
{ | |||
@@ -61,21 +63,37 @@ namespace JT808.DotNetty.Kafka | |||
} | |||
}, Cts.Token); | |||
} | |||
public void Subscribe() | |||
{ | |||
consumer.Subscribe(TopicName); | |||
} | |||
public void Unsubscribe() | |||
{ | |||
if (disposed) return; | |||
consumer.Unsubscribe(); | |||
Cts.Cancel(); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
Cts.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808MsgConsumer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -8,8 +8,9 @@ using System.Threading.Tasks; | |||
namespace JT808.DotNetty.Kafka | |||
{ | |||
public class JT808MsgProducer : IJT808MsgProducer | |||
public sealed class JT808MsgProducer : IJT808MsgProducer | |||
{ | |||
private bool disposed = false; | |||
public string TopicName { get; } | |||
private readonly IProducer<string, byte[]> producer; | |||
@@ -20,18 +21,34 @@ namespace JT808.DotNetty.Kafka | |||
TopicName = producerConfigAccessor.Value.TopicName; | |||
} | |||
public void Dispose() | |||
{ | |||
producer.Dispose(); | |||
} | |||
public async Task ProduceAsync(string terminalNo, byte[] data) | |||
{ | |||
if (disposed) return; | |||
await producer.ProduceAsync(TopicName, new Message<string, byte[]> | |||
{ | |||
Key = terminalNo, | |||
Value = data | |||
}); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
producer.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808MsgProducer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -10,8 +10,9 @@ using System.Threading.Tasks; | |||
namespace JT808.DotNetty.Kafka | |||
{ | |||
public class JT808MsgReplyConsumer : IJT808MsgReplyConsumer | |||
public sealed class JT808MsgReplyConsumer : IJT808MsgReplyConsumer | |||
{ | |||
private bool disposed = false; | |||
public CancellationTokenSource Cts { get; private set; } = new CancellationTokenSource(); | |||
private readonly IConsumer<string, byte[]> consumer; | |||
@@ -35,6 +36,7 @@ namespace JT808.DotNetty.Kafka | |||
{ | |||
while (!Cts.IsCancellationRequested) | |||
{ | |||
if (disposed) return; | |||
try | |||
{ | |||
//如果不指定分区,根据kafka的机制会从多个分区中拉取数据 | |||
@@ -42,9 +44,9 @@ namespace JT808.DotNetty.Kafka | |||
var data = consumer.Consume(Cts.Token); | |||
if (logger.IsEnabled(LogLevel.Debug)) | |||
{ | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Message.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
} | |||
callback((data.Key, data.Value)); | |||
callback((data.Message.Key, data.Message.Value)); | |||
} | |||
catch (ConsumeException ex) | |||
{ | |||
@@ -69,13 +71,32 @@ namespace JT808.DotNetty.Kafka | |||
public void Unsubscribe() | |||
{ | |||
if (disposed) return; | |||
consumer.Unsubscribe(); | |||
Cts.Cancel(); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
Cts.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808MsgReplyConsumer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -8,8 +8,9 @@ using System.Threading.Tasks; | |||
namespace JT808.DotNetty.Kafka | |||
{ | |||
public class JT808MsgReplyProducer : IJT808MsgReplyProducer | |||
public sealed class JT808MsgReplyProducer : IJT808MsgReplyProducer | |||
{ | |||
private bool disposed = false; | |||
public string TopicName { get;} | |||
private IProducer<string, byte[]> producer; | |||
@@ -20,18 +21,35 @@ namespace JT808.DotNetty.Kafka | |||
TopicName = producerConfigAccessor.Value.TopicName; | |||
} | |||
public void Dispose() | |||
{ | |||
producer.Dispose(); | |||
} | |||
public async Task ProduceAsync(string terminalNo, byte[] data) | |||
{ | |||
if (disposed) return; | |||
await producer.ProduceAsync(TopicName, new Message<string, byte[]> | |||
{ | |||
Key = terminalNo, | |||
Value = data | |||
}); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
producer.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808MsgReplyProducer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -10,8 +10,9 @@ using System.Threading.Tasks; | |||
namespace JT808.DotNetty.Kafka | |||
{ | |||
public class JT808SessionConsumer : IJT808SessionConsumer | |||
public sealed class JT808SessionConsumer : IJT808SessionConsumer | |||
{ | |||
private bool disposed = false; | |||
public CancellationTokenSource Cts { get; private set; } = new CancellationTokenSource(); | |||
private readonly IConsumer<string, string> consumer; | |||
@@ -35,6 +36,7 @@ namespace JT808.DotNetty.Kafka | |||
{ | |||
while (!Cts.IsCancellationRequested) | |||
{ | |||
if (disposed) return; | |||
try | |||
{ | |||
//如果不指定分区,根据kafka的机制会从多个分区中拉取数据 | |||
@@ -42,9 +44,9 @@ namespace JT808.DotNetty.Kafka | |||
var data = consumer.Consume(Cts.Token); | |||
if (logger.IsEnabled(LogLevel.Debug)) | |||
{ | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Message.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
} | |||
callback((data.Key, data.Value)); | |||
callback((data.Message.Key, data.Message.Value)); | |||
} | |||
catch (ConsumeException ex) | |||
{ | |||
@@ -69,13 +71,32 @@ namespace JT808.DotNetty.Kafka | |||
public void Unsubscribe() | |||
{ | |||
if (disposed) return; | |||
consumer.Unsubscribe(); | |||
Cts.Cancel(); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
Cts.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808SessionConsumer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -8,8 +8,9 @@ using System.Threading.Tasks; | |||
namespace JT808.DotNetty.Kafka | |||
{ | |||
public class JT808SessionProducer : IJT808SessionProducer | |||
public sealed class JT808SessionProducer : IJT808SessionProducer | |||
{ | |||
private bool disposed = false; | |||
public string TopicName { get; } | |||
private readonly IProducer<string, string> producer; | |||
@@ -20,18 +21,35 @@ namespace JT808.DotNetty.Kafka | |||
TopicName = producerConfigAccessor.Value.TopicName; | |||
} | |||
public void Dispose() | |||
{ | |||
producer.Dispose(); | |||
} | |||
public async Task ProduceAsync(string notice,string terminalNo) | |||
{ | |||
if (disposed) return; | |||
await producer.ProduceAsync(TopicName, new Message<string, string> | |||
{ | |||
Key = notice, | |||
Value = terminalNo | |||
}); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
producer.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808SessionProducer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -30,13 +30,13 @@ | |||
</ItemGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Google.Protobuf" Version="3.11.4" /> | |||
<PackageReference Include="Grpc.Core" Version="2.27.0" /> | |||
<PackageReference Include="Grpc.Tools" Version="2.27.0"> | |||
<PackageReference Include="Grpc.Core" Version="2.28.1" /> | |||
<PackageReference Include="Grpc.Tools" Version="2.28.1"> | |||
<PrivateAssets>all</PrivateAssets> | |||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | |||
</PackageReference> | |||
<PackageReference Include="JT808" Version="2.2.8" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.2" /> | |||
<PackageReference Include="JT808" Version="2.2.10" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="..\..\LICENSE" Pack="true" PackagePath="" /> | |||
@@ -12,18 +12,18 @@ | |||
</ItemGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.2" /> | |||
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.2" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\..\JT808.Gateway.Client\JT808.Gateway.Client.csproj" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="..\..\LICENSE" Pack="true" PackagePath="" /> | |||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="wwwroot\echarts.min.js"> | |||
@@ -6,10 +6,10 @@ | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.9.10" /> | |||
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.1" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.8" /> | |||
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.2" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -22,12 +22,12 @@ | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="JT808" Version="2.2.8" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.2" /> | |||
<PackageReference Include="System.IO.Pipelines" Version="4.7.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.2" /> | |||
<PackageReference Include="JT808" Version="2.2.10" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.3" /> | |||
<PackageReference Include="System.IO.Pipelines" Version="4.7.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="..\..\LICENSE" Pack="true" PackagePath="" /> | |||
@@ -20,12 +20,12 @@ | |||
<Version>$(JT808GatewayPackageVersion)</Version> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Confluent.Kafka" Version="1.3.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Options" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Confluent.Kafka" Version="1.4.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Options" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -11,8 +11,9 @@ using System.Threading.Tasks; | |||
namespace JT808.Gateway.Kafka | |||
{ | |||
public class JT808MsgConsumer : IJT808MsgConsumer | |||
public sealed class JT808MsgConsumer : IJT808MsgConsumer | |||
{ | |||
private bool disposed = false; | |||
public CancellationTokenSource Cts { get; private set; } = new CancellationTokenSource(); | |||
private readonly IConsumer<string, byte[]> consumer; | |||
@@ -36,6 +37,7 @@ namespace JT808.Gateway.Kafka | |||
{ | |||
while (!Cts.IsCancellationRequested) | |||
{ | |||
if (disposed) return; | |||
try | |||
{ | |||
//如果不指定分区,根据kafka的机制会从多个分区中拉取数据 | |||
@@ -43,9 +45,9 @@ namespace JT808.Gateway.Kafka | |||
var data = consumer.Consume(Cts.Token); | |||
if (logger.IsEnabled(LogLevel.Debug)) | |||
{ | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Message.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
} | |||
callback((data.Key, data.Value)); | |||
callback((data.Message.Key, data.Message.Value)); | |||
} | |||
catch (ConsumeException ex) | |||
{ | |||
@@ -62,21 +64,37 @@ namespace JT808.Gateway.Kafka | |||
} | |||
}, Cts.Token); | |||
} | |||
public void Subscribe() | |||
{ | |||
consumer.Subscribe(TopicName); | |||
} | |||
public void Unsubscribe() | |||
{ | |||
if (disposed) return; | |||
consumer.Unsubscribe(); | |||
Cts.Cancel(); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
Cts.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808MsgConsumer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -9,8 +9,9 @@ using System.Threading.Tasks; | |||
namespace JT808.Gateway.Kafka | |||
{ | |||
public class JT808MsgProducer : IJT808MsgProducer | |||
public sealed class JT808MsgProducer : IJT808MsgProducer | |||
{ | |||
private bool disposed = false; | |||
public string TopicName { get; } | |||
private readonly IProducer<string, byte[]> producer; | |||
@@ -21,18 +22,34 @@ namespace JT808.Gateway.Kafka | |||
TopicName = producerConfigAccessor.Value.TopicName; | |||
} | |||
public void Dispose() | |||
{ | |||
producer.Dispose(); | |||
} | |||
public async ValueTask ProduceAsync(string terminalNo, byte[] data) | |||
{ | |||
if (disposed) return; | |||
await producer.ProduceAsync(TopicName, new Message<string, byte[]> | |||
{ | |||
Key = terminalNo, | |||
Value = data | |||
}); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
producer.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808MsgProducer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -11,8 +11,9 @@ using System.Threading.Tasks; | |||
namespace JT808.Gateway.Kafka | |||
{ | |||
public class JT808MsgReplyConsumer : IJT808MsgReplyConsumer | |||
public sealed class JT808MsgReplyConsumer : IJT808MsgReplyConsumer | |||
{ | |||
private bool disposed = false; | |||
public CancellationTokenSource Cts { get; private set; } = new CancellationTokenSource(); | |||
private readonly IConsumer<string, byte[]> consumer; | |||
@@ -36,6 +37,7 @@ namespace JT808.Gateway.Kafka | |||
{ | |||
while (!Cts.IsCancellationRequested) | |||
{ | |||
if (disposed) return; | |||
try | |||
{ | |||
//如果不指定分区,根据kafka的机制会从多个分区中拉取数据 | |||
@@ -43,9 +45,9 @@ namespace JT808.Gateway.Kafka | |||
var data = consumer.Consume(Cts.Token); | |||
if (logger.IsEnabled(LogLevel.Debug)) | |||
{ | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Message.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
} | |||
callback((data.Key, data.Value)); | |||
callback((data.Message.Key, data.Message.Value)); | |||
} | |||
catch (ConsumeException ex) | |||
{ | |||
@@ -70,13 +72,32 @@ namespace JT808.Gateway.Kafka | |||
public void Unsubscribe() | |||
{ | |||
if (disposed) return; | |||
consumer.Unsubscribe(); | |||
Cts.Cancel(); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
Cts.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808MsgReplyConsumer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -9,8 +9,9 @@ using System.Threading.Tasks; | |||
namespace JJT808.Gateway.Kafka | |||
{ | |||
public class JT808MsgReplyProducer : IJT808MsgReplyProducer | |||
public sealed class JT808MsgReplyProducer : IJT808MsgReplyProducer | |||
{ | |||
private bool disposed = false; | |||
public string TopicName { get;} | |||
private IProducer<string, byte[]> producer; | |||
@@ -21,18 +22,35 @@ namespace JJT808.Gateway.Kafka | |||
TopicName = producerConfigAccessor.Value.TopicName; | |||
} | |||
public void Dispose() | |||
{ | |||
producer.Dispose(); | |||
} | |||
public async ValueTask ProduceAsync(string terminalNo, byte[] data) | |||
{ | |||
if (disposed) return; | |||
await producer.ProduceAsync(TopicName, new Message<string, byte[]> | |||
{ | |||
Key = terminalNo, | |||
Value = data | |||
}); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
producer.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808MsgReplyProducer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -11,8 +11,9 @@ using System.Threading.Tasks; | |||
namespace JT808.Gateway.Kafka | |||
{ | |||
public class JT808SessionConsumer : IJT808SessionConsumer | |||
public sealed class JT808SessionConsumer : IJT808SessionConsumer | |||
{ | |||
private bool disposed = false; | |||
public CancellationTokenSource Cts { get; private set; } = new CancellationTokenSource(); | |||
private readonly IConsumer<string, string> consumer; | |||
@@ -36,6 +37,7 @@ namespace JT808.Gateway.Kafka | |||
{ | |||
while (!Cts.IsCancellationRequested) | |||
{ | |||
if (disposed) return; | |||
try | |||
{ | |||
//如果不指定分区,根据kafka的机制会从多个分区中拉取数据 | |||
@@ -43,9 +45,9 @@ namespace JT808.Gateway.Kafka | |||
var data = consumer.Consume(Cts.Token); | |||
if (logger.IsEnabled(LogLevel.Debug)) | |||
{ | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
logger.LogDebug($"Topic: {data.Topic} Key: {data.Message.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}"); | |||
} | |||
callback((data.Key, data.Value)); | |||
callback((data.Message.Key, data.Message.Value)); | |||
} | |||
catch (ConsumeException ex) | |||
{ | |||
@@ -70,13 +72,32 @@ namespace JT808.Gateway.Kafka | |||
public void Unsubscribe() | |||
{ | |||
if (disposed) return; | |||
consumer.Unsubscribe(); | |||
Cts.Cancel(); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
Cts.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808SessionConsumer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
consumer.Close(); | |||
consumer.Dispose(); | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -9,8 +9,9 @@ using System.Threading.Tasks; | |||
namespace JT808.Gateway.Kafka | |||
{ | |||
public class JT808SessionProducer : IJT808SessionProducer | |||
public sealed class JT808SessionProducer : IJT808SessionProducer | |||
{ | |||
private bool disposed = false; | |||
public string TopicName { get; } | |||
private readonly IProducer<string, string> producer; | |||
@@ -21,18 +22,35 @@ namespace JT808.Gateway.Kafka | |||
TopicName = producerConfigAccessor.Value.TopicName; | |||
} | |||
public void Dispose() | |||
{ | |||
producer.Dispose(); | |||
} | |||
public async ValueTask ProduceAsync(string notice,string terminalNo) | |||
{ | |||
if (disposed) return; | |||
await producer.ProduceAsync(TopicName, new Message<string, string> | |||
{ | |||
Key = notice, | |||
Value = terminalNo | |||
}); | |||
} | |||
private void Dispose(bool disposing) | |||
{ | |||
if (disposed) return; | |||
if (disposing) | |||
{ | |||
producer.Dispose(); | |||
} | |||
disposed = true; | |||
} | |||
~JT808SessionProducer() | |||
{ | |||
Dispose(false); | |||
} | |||
public void Dispose() | |||
{ | |||
//必须为true | |||
Dispose(true); | |||
//通知垃圾回收机制不再调用终结器(析构器) | |||
GC.SuppressFinalize(this); | |||
} | |||
} | |||
} |
@@ -22,7 +22,7 @@ | |||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||
@@ -21,7 +21,7 @@ | |||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||
@@ -22,7 +22,7 @@ | |||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||
@@ -22,7 +22,7 @@ | |||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.3" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||
@@ -7,10 +7,10 @@ | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.9.10" /> | |||
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.1" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.8" /> | |||
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.2" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -6,10 +6,10 @@ | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.9.10" /> | |||
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.1" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.8" /> | |||
<PackageReference Include="NLog.Extensions.Logging" Version="1.6.2" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -7,15 +7,15 @@ | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" /> | |||
<PackageReference Include="System.IO.Pipelines" Version="4.7.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.0" /> | |||
<PackageReference Include="System.IO.Pipelines" Version="4.7.1" /> | |||
<PackageReference Include="xunit" Version="2.4.1" /> | |||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"> | |||
<PrivateAssets>all</PrivateAssets> | |||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | |||
</PackageReference> | |||
<PackageReference Include="coverlet.collector" Version="1.2.0"> | |||
<PackageReference Include="coverlet.collector" Version="1.2.1"> | |||
<PrivateAssets>all</PrivateAssets> | |||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | |||
</PackageReference> | |||
@@ -21,9 +21,9 @@ | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Options" Version="3.1.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.2" /> | |||
<PackageReference Include="System.IO.Pipelines" Version="4.7.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Options" Version="3.1.3" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.3" /> | |||
<PackageReference Include="System.IO.Pipelines" Version="4.7.1" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||