using Dpz.Core.MessageQueue.Abstractions;
using Dpz.Core.MessageQueue.Models;
using Dpz.Core.Public.ViewModel.Messages;
using Dpz.Core.Service.RepositoryService;
namespace Dpz.Core.Web.Jobs.MessageHandlers;
/// <summary>
/// 增加弹幕计数消息处理器
/// 更新视频的弹幕数量并刷新缓存
/// </summary>
public class AddDanmakuCountHandler(
IVideoService videoService,
IBarrageService barrageService,
ILogger<AddDanmakuCountHandler> logger
) : IMessageHandler<AddDanmakuCountMessage>
{
public async Task<MessageHandlerResult> HandleAsync(
AddDanmakuCountMessage message,
CancellationToken cancellationToken
)
{
try
{
// 获取最新弹幕数量
var count = await barrageService.GetGroupBarrageCountAsync(message.DanmakuGroup);
// 更新数据库和缓存
await videoService.UpdateDanmakuCountAsync(
message.DanmakuGroup,
count,
cancellationToken
);
logger.LogInformation(
"弹幕计数更新成功: DanmakuGroup={DanmakuGroup}, Count={Count}",
message.DanmakuGroup,
count
);
return MessageHandlerResult.Ok();
}
catch (Exception ex)
{
logger.LogError(
ex,
"弹幕计数更新失败: DanmakuGroup={DanmakuGroup}",
message.DanmakuGroup
);
return MessageHandlerResult.Fail($"弹幕计数更新失败: {ex.Message}");
}
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
代码解释
这是一个 消息处理器(Message Handler) 类,用于处理弹幕计数更新的业务逻辑。
📋 类概述
类名: AddDanmakuCountHandler
用途: 当有新弹幕添加时,更新对应视频的弹幕总数并刷新缓存
🏗️ 架构特点
1. 依赖注入(Primary Constructor)
public class AddDanmakuCountHandler(
IVideoService videoService,
IBarrageService barrageService,
ILogger<AddDanmakuCountHandler> logger
)
使用 C# 12 的主构造函数特性,注入三个依赖:
IVideoService: 视频服务,用于更新视频信息IBarrageService: 弹幕服务,用于获取弹幕统计数据ILogger: 日志记录器
2. 实现接口
: IMessageHandler<AddDanmakuCountMessage>
实现了泛型消息处理器接口,专门处理 AddDanmakuCountMessage 类型的消息
🔄 核心处理流程
HandleAsync 方法执行步骤:
获取最新弹幕数量
var count = await barrageService.GetGroupBarrageCountAsync(message.DanmakuGroup);根据弹幕分组 ID 查询该分组的弹幕总数
更新数据库和缓存
await videoService.UpdateDanmakuCountAsync( message.DanmakuGroup, count, cancellationToken );将最新的弹幕数量同步到数据库并更新缓存
记录成功日志
logger.LogInformation( "弹幕计数更新成功: DanmakuGroup={DanmakuGroup}, Count={Count}", message.DanmakuGroup, count );返回处理结果
- 成功:
MessageHandlerResult.Ok() - 失败:
MessageHandlerResult.Fail(错误信息)
- 成功:
⚠️ 异常处理
使用 try-catch 捕获所有异常:
- 记录详细错误日志
- 返回失败结果,包含错误消息
- 保证消息处理的健壮性
🎯 应用场景
典型的异步消息队列处理模式,适用于:
- 弹幕数量实时统计
- 避免频繁数据库写入
- 解耦弹幕发送和计数更新逻辑
- 提高系统响应性能
💡 设计优势
✅ 职责单一
✅ 异步处理
✅ 完善的日志记录
✅ 结构化异常处理
✅ 支持取消操作(CancellationToken)
AI 正在分析代码…
评论加载中...