|
|
|
@ -2,6 +2,7 @@ |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Text; |
|
|
|
using System.Threading; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using CoreAgent.Domain.Interfaces.Network; |
|
|
|
using CoreAgent.ProtocolClient.Models; |
|
|
|
@ -12,43 +13,84 @@ using Microsoft.Extensions.Logging; |
|
|
|
|
|
|
|
namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
{ |
|
|
|
public class NetworkProtocolLogObserver : IProtocolLogObserver |
|
|
|
|
|
|
|
|
|
|
|
public class NetworkProtocolLogObserver : IProtocolLogObserver, IDisposable |
|
|
|
{ |
|
|
|
private readonly ILogger<NetworkProtocolLogObserver> _logger; |
|
|
|
private readonly IMessageChannelManager _ChannelManager; |
|
|
|
private readonly ICellularNetworkContext _context; |
|
|
|
public NetworkProtocolLogObserver(ILogger<NetworkProtocolLogObserver> logger, IMessageChannelManager channelManager, ICellularNetworkContext context) |
|
|
|
private readonly object _lock = new object(); |
|
|
|
private bool _disposed = false; |
|
|
|
|
|
|
|
public NetworkProtocolLogObserver( |
|
|
|
ILogger<NetworkProtocolLogObserver> logger, |
|
|
|
IMessageChannelManager channelManager, |
|
|
|
ICellularNetworkContext context) |
|
|
|
{ |
|
|
|
this._logger = logger; |
|
|
|
this._ChannelManager = channelManager; |
|
|
|
this._logger = logger ?? throw new ArgumentNullException(nameof(logger)); |
|
|
|
this._ChannelManager = channelManager ?? throw new ArgumentNullException(nameof(channelManager)); |
|
|
|
this._context = context ?? throw new ArgumentNullException(nameof(context)); |
|
|
|
|
|
|
|
_logger.LogInformation("NetworkProtocolLogObserver初始化完成"); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 处理接收到的协议日志
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="logDetails">协议日志详情</param>
|
|
|
|
public void OnProtocolLogsReceived(IEnumerable<TransferProtocolLog> logDetails) |
|
|
|
{ |
|
|
|
var startTime = DateTime.UtcNow; |
|
|
|
|
|
|
|
// 空值检查
|
|
|
|
if (_disposed) |
|
|
|
{ |
|
|
|
_logger.LogWarning("NetworkProtocolLogObserver已释放,跳过日志处理"); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (logDetails == null) |
|
|
|
{ |
|
|
|
_logger.LogWarning("接收到的协议日志为空"); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 转换为列表以避免多次枚举
|
|
|
|
var logList = logDetails.ToList(); |
|
|
|
var logCount = logList.Count; |
|
|
|
|
|
|
|
// 空集合检查
|
|
|
|
if (logCount == 0) |
|
|
|
{ |
|
|
|
_logger.LogDebug("接收到的协议日志集合为空,跳过处理"); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// 使用锁保护整个处理过程,确保线程安全
|
|
|
|
lock (_lock) |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
ProcessLogsInternal(logList, logCount); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
|
_logger.LogError(ex, "协议日志处理过程中发生异常,数量: {LogCount}", logCount); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 内部日志处理方法
|
|
|
|
/// </summary>
|
|
|
|
private void ProcessLogsInternal(List<TransferProtocolLog> logList, int logCount) |
|
|
|
{ |
|
|
|
var startTime = DateTime.UtcNow; |
|
|
|
|
|
|
|
_logger.LogDebug("开始处理协议日志,数量: {LogCount}", logCount); |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
_logger.LogDebug("开始处理协议日志,数量: {LogCount}", logCount); |
|
|
|
string RuntimeCode = _context.GetNeConfigKey(); |
|
|
|
// 获取运行时配置键(外层已有锁保护)
|
|
|
|
string runtimeCode = _context.GetNeConfigKey(); |
|
|
|
|
|
|
|
// 将 CoreAgent.ProtocolClient 的 TransferProtocolLog 转换为 WebSocket 传输层的 MessageTransferProtocolLog
|
|
|
|
var webSocketLogs = logList.Select(log => new MessageTransferProtocolLog |
|
|
|
{ |
|
|
|
@ -65,10 +107,11 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
Info = log.Info, |
|
|
|
Message = log.Message, |
|
|
|
DeviceCode = _context.DeviceCode, |
|
|
|
RuntimeCode = RuntimeCode, |
|
|
|
|
|
|
|
RuntimeCode = runtimeCode, |
|
|
|
}); |
|
|
|
|
|
|
|
ProtocolMessage message = new ProtocolMessage(webSocketLogs.ToArray()); |
|
|
|
|
|
|
|
// 尝试写入通道并跟踪结果
|
|
|
|
var writeSuccess = _ChannelManager.SendChannel.TryWrite(message); |
|
|
|
var processingTime = DateTime.UtcNow - startTime; |
|
|
|
@ -76,12 +119,12 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
if (writeSuccess) |
|
|
|
{ |
|
|
|
_logger.LogDebug("运行编码{RuntimeCode} 协议日志处理成功,数量: {LogCount}, 处理时间: {ProcessingTime}ms", |
|
|
|
RuntimeCode, logCount, processingTime.TotalMilliseconds); |
|
|
|
runtimeCode, logCount, processingTime.TotalMilliseconds); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_logger.LogWarning("运行编码{RuntimeCode} 协议日志写入通道失败,数量: {LogCount}, 处理时间: {ProcessingTime}ms, 通道可能已满或已关闭", |
|
|
|
RuntimeCode, logCount, processingTime.TotalMilliseconds); |
|
|
|
runtimeCode, logCount, processingTime.TotalMilliseconds); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
@ -89,7 +132,35 @@ namespace CoreAgent.Infrastructure.Services.Network |
|
|
|
var processingTime = DateTime.UtcNow - startTime; |
|
|
|
_logger.LogError(ex, "协议日志处理异常,数量: {LogCount}, 处理时间: {ProcessingTime}ms", |
|
|
|
logCount, processingTime.TotalMilliseconds); |
|
|
|
throw; // 重新抛出异常,让上层处理
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 释放资源
|
|
|
|
/// </summary>
|
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
Dispose(true); |
|
|
|
GC.SuppressFinalize(this); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 释放资源
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="disposing">是否正在释放托管资源</param>
|
|
|
|
protected virtual void Dispose(bool disposing) |
|
|
|
{ |
|
|
|
if (_disposed) return; |
|
|
|
|
|
|
|
if (disposing) |
|
|
|
{ |
|
|
|
_logger.LogInformation("NetworkProtocolLogObserver资源已释放"); |
|
|
|
} |
|
|
|
|
|
|
|
_disposed = true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |