规范并补充日志内容
This commit is contained in:
@@ -1,25 +1,26 @@
|
||||
using Google.Protobuf;
|
||||
using Ayay.SerilogLogs;
|
||||
using Google.Protobuf;
|
||||
using Grpc.Net.Client;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Serilog;
|
||||
using SHH.Contracts.Grpc;
|
||||
|
||||
namespace SHH.CameraService;
|
||||
|
||||
/// <summary>
|
||||
/// gRPC 视频流发送工作者
|
||||
/// 职责:监听特定的 StreamTarget 队列,建立 gRPC 客户端流并持续推送图片
|
||||
/// gRpc 视频流发送工作者
|
||||
/// 职责:监听特定的 StreamTarget 队列,建立 gRpc 客户端流并持续推送图片
|
||||
/// </summary>
|
||||
public class GrpcSenderWorker : BackgroundService
|
||||
{
|
||||
private readonly StreamTarget _target;
|
||||
private readonly ILogger<GrpcSenderWorker> _logger;
|
||||
private static ILogger _gRpcLog = Log.ForContext("SourceContext", LogModules.gRpc);
|
||||
|
||||
private readonly StreamTarget _target;
|
||||
private readonly string _grpcUrl;
|
||||
|
||||
public GrpcSenderWorker(StreamTarget target, ILogger<GrpcSenderWorker> logger)
|
||||
public GrpcSenderWorker(StreamTarget target)
|
||||
{
|
||||
_target = target;
|
||||
_logger = logger;
|
||||
|
||||
// 自动适配地址:将配置的 tcp://localhost:9001 转换为 http://localhost:9001
|
||||
// 并且严格使用你验证成功的 localhost
|
||||
@@ -28,7 +29,7 @@ public class GrpcSenderWorker : BackgroundService
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
_logger.LogInformation($"[gRPC Worker] 启动。目标: {_target.Config.Name}, 地址: {_grpcUrl}");
|
||||
_gRpcLog.Information($"[gRpc] 视频流发送业务启动, 目标: {_target.Config.Name}, 地址: {_grpcUrl}");
|
||||
|
||||
while (!stoppingToken.IsCancellationRequested)
|
||||
{
|
||||
@@ -41,10 +42,10 @@ public class GrpcSenderWorker : BackgroundService
|
||||
// 2. 开启客户端流 (UploadVideoStream 是在 proto 中定义的)
|
||||
using var call = client.UploadVideoStream(cancellationToken: stoppingToken);
|
||||
|
||||
_logger.LogInformation($"[gRPC Worker] 已开启视频推送流: {_target.Config.Name}");
|
||||
_gRpcLog.Information($"[gRpc] 已开启视频推送流, 目标: {_target.Config.Name}, 地址: {_grpcUrl}");
|
||||
|
||||
// 3. 核心搬运循环:从内存队列 (Channel) 读取数据
|
||||
await foreach (var payload in _target.Channel.Reader.ReadAllAsync(stoppingToken))
|
||||
// 3. 核心搬运循环:从内存队列 (Channel) 读取数据
|
||||
await foreach (var payload in _target.Channel.Reader.ReadAllAsync(stoppingToken))
|
||||
{
|
||||
// 【畅通保障】检查数据时效性:丢弃超过 1 秒的积压帧
|
||||
var delay = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - payload.CaptureTimestamp;
|
||||
@@ -53,7 +54,7 @@ public class GrpcSenderWorker : BackgroundService
|
||||
continue;
|
||||
}
|
||||
|
||||
// 将业务 DTO 转换为 gRPC 原生 Request
|
||||
// 将业务 DTO 转换为 gRpc 原生 Request
|
||||
var request = new VideoFrameRequest
|
||||
{
|
||||
CameraId = payload.CameraId ?? "0",
|
||||
@@ -63,7 +64,7 @@ public class GrpcSenderWorker : BackgroundService
|
||||
HasOriginalImage = payload.HasOriginalImage,
|
||||
HasTargetImage = payload.HasTargetImage,
|
||||
|
||||
// ★ 核心:将 byte[] 转换为 gRPC 的 ByteString (高性能)
|
||||
// ★ 核心:将 byte[] 转换为 gRpc 的 ByteString (高性能)
|
||||
OriginalImageBytes = payload.OriginalImageBytes != null
|
||||
? ByteString.CopyFrom(payload.OriginalImageBytes)
|
||||
: ByteString.Empty,
|
||||
@@ -94,9 +95,9 @@ public class GrpcSenderWorker : BackgroundService
|
||||
catch (OperationCanceledException) { break; }
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError($"[gRPC Worker] 推送链路异常,5秒后重连: {ex.Message}");
|
||||
_gRpcLog.Warning($"[gRpc] 视频推送流链路异常, 目标: {_target.Config.Name}, 地址: {_grpcUrl}, 5秒后重连: {ex.Message}.");
|
||||
await Task.Delay(5000, stoppingToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user