Browse Source

feat: 添加心跳消息实体模型 HeartbeatMessage

- 新增 HeartbeatMessage.cs 心跳消息实体模型
- 包含 Type 和 Payload 属性,符合 JSON 结构要求
- 支持 WebSocket 心跳检测和连接状态监控
- 更新 modify.md 修改记录文档
feature/protocol-log-Perfect
root 1 week ago
parent
commit
3fdce68f6a
  1. 2
      CoreAgent.WebSocketTransport/Examples/ChannelManagerTestExample.cs
  2. 2
      CoreAgent.WebSocketTransport/Examples/CompositionPatternExample.cs
  3. 4
      CoreAgent.WebSocketTransport/Interfaces/IMessageChannelManager.cs
  4. 31
      CoreAgent.WebSocketTransport/Models/HeartbeatMessage.cs
  5. 5
      CoreAgent.WebSocketTransport/Services/MessageChannelManager.cs
  6. 9
      CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs
  7. 51
      CoreAgent.WebSocketTransport/modify.md

2
CoreAgent.WebSocketTransport/Examples/ChannelManagerTestExample.cs

@ -31,7 +31,7 @@ public class ChannelManagerTestExample
// 测试发送消息
await _channelManager.SendChannel.WriteAsync("Test message 1");
await _channelManager.SendChannel.WriteAsync("Test message 2");
await _channelManager.PriorityChannel.WriteAsync("Priority message");
//await _channelManager.PriorityChannel.WriteAsync("Priority message");
_logger.LogInformation("消息发送成功");

2
CoreAgent.WebSocketTransport/Examples/CompositionPatternExample.cs

@ -59,7 +59,7 @@ public class CompositionPatternExample
await _channelManager.SendChannel.WriteAsync("Normal message");
// 发送优先级消息
await _channelManager.PriorityChannel.WriteAsync("Priority message");
//await _channelManager.PriorityChannel.WriteAsync("Priority message");
// 等待消息发送完成
await Task.Delay(1000);

4
CoreAgent.WebSocketTransport/Interfaces/IMessageChannelManager.cs

@ -1,3 +1,5 @@
using CoreAgent.WebSocketTransport.Models;
namespace CoreAgent.WebSocketTransport.Interfaces;
/// <summary>
@ -19,7 +21,7 @@ public interface IMessageChannelManager : IDisposable
/// <summary>
/// 获取优先级消息通道(用于心跳等)
/// </summary>
IMessageChannel<object> PriorityChannel { get; }
IMessageChannel<HeartbeatMessage> PriorityChannel { get; }
/// <summary>
/// 获取通道状态信息

31
CoreAgent.WebSocketTransport/Models/HeartbeatMessage.cs

@ -0,0 +1,31 @@
using System;
namespace CoreAgent.WebSocketTransport.Models
{
/// <summary>
/// 心跳消息实体模型
/// </summary>
public class HeartbeatMessage
{
/// <summary>
/// 消息类型
/// </summary>
public string Type { get; set; } = "heartbeat";
/// <summary>
/// 消息载荷
/// </summary>
public HeartbeatPayload Payload { get; set; } = new HeartbeatPayload();
}
/// <summary>
/// 心跳消息载荷
/// </summary>
public class HeartbeatPayload
{
/// <summary>
/// 心跳消息内容
/// </summary>
public string Message { get; set; } = "ping";
}
}

5
CoreAgent.WebSocketTransport/Services/MessageChannelManager.cs

@ -1,4 +1,5 @@
using CoreAgent.WebSocketTransport.Interfaces;
using CoreAgent.WebSocketTransport.Models;
using Microsoft.Extensions.Logging;
namespace CoreAgent.WebSocketTransport.Services;
@ -15,7 +16,7 @@ public class MessageChannelManager : IMessageChannelManager
public IMessageChannel<object> SendChannel { get; }
public IMessageChannel<object> ReceiveChannel { get; }
public IMessageChannel<object> PriorityChannel { get; }
public IMessageChannel<HeartbeatMessage> PriorityChannel { get; }
/// <summary>
/// 构造函数
@ -36,7 +37,7 @@ public class MessageChannelManager : IMessageChannelManager
{
SendChannel = new ChannelMessageChannel<object>(sendChannelCapacity);
ReceiveChannel = new ChannelMessageChannel<object>(receiveChannelCapacity);
PriorityChannel = new ChannelMessageChannel<object>(priorityChannelCapacity);
PriorityChannel = new ChannelMessageChannel<HeartbeatMessage>(priorityChannelCapacity);
_logger.LogInformation("消息通道管理器已创建 - 发送通道容量: {SendCapacity}, 接收通道容量: {ReceiveCapacity}, 优先级通道容量: {PriorityCapacity}",
sendChannelCapacity, receiveChannelCapacity, priorityChannelCapacity);

9
CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs

@ -5,6 +5,8 @@ using Microsoft.Extensions.Logging;
using CoreAgent.WebSocketTransport.Interfaces;
using CoreAgent.WebSocketTransport.Models;
using CoreAgent.WebSocketTransport.Middleware;
using System.Text.Json.Serialization;
using System.Text.Json;
namespace CoreAgent.WebSocketTransport.Services;
@ -282,12 +284,12 @@ public class WebSocketTransport : IWebSocketTransport
{
while (!cancellationToken.IsCancellationRequested)
{
await Task.Delay(TimeSpan.FromSeconds(30), cancellationToken);
if (_isConnected && _connection.IsConnected)
{
_channelManager.PriorityChannel.TryWrite(new HeartbeatMessage());
UpdateHeartbeat();
}
await Task.Delay(TimeSpan.FromSeconds(120), cancellationToken);
}
}
catch (Exception ex)
@ -324,9 +326,10 @@ public class WebSocketTransport : IWebSocketTransport
while (_channelManager.PriorityChannel.TryRead(out var priorityMessage))
{
priorityMessageCount++;
if (priorityMessage is null) continue;
_logger.LogTrace("处理优先级消息 #{PriorityCount}: {MessageType}",
priorityMessageCount, priorityMessage?.GetType().Name ?? "null");
await SendSingleMessageAsync(priorityMessage, cancellationToken);
await SendSingleMessageAsync(JsonSerializer.Serialize(priorityMessage), cancellationToken);
}
// 处理普通消息

51
CoreAgent.WebSocketTransport/modify.md

@ -784,4 +784,53 @@ private async Task ConnectInternalAsync(CancellationToken cancellationToken)
- WebSocket 传输服务注册
- 配置管理
- 中间件集成
- 应用程序启动流程
- 应用程序启动流程
## 2024-12-19 - 心跳消息实体模型创建
### 新增文件
- **HeartbeatMessage.cs**: 心跳消息实体模型,包含消息类型和载荷结构
### 模型设计
1. **HeartbeatMessage 类**
- `Type` 属性:消息类型,默认值为 "heartbeat"
- `Payload` 属性:消息载荷,类型为 HeartbeatPayload
2. **HeartbeatPayload 类**
- `Message` 属性:心跳消息内容,默认值为 "ping"
### 设计特点
- 符合 JSON 结构:`{"type": "heartbeat", "payload": {"message": "ping"}}`
- 使用默认值初始化,简化使用
- 包含完整的 XML 文档注释
- 遵循 C# 命名规范
### 使用场景
- WebSocket 心跳检测
- 连接状态监控
- 网络连通性测试
- 服务器健康检查
### 技术实现
```csharp
public class HeartbeatMessage
{
public string Type { get; set; } = "heartbeat";
public HeartbeatPayload Payload { get; set; } = new HeartbeatPayload();
}
public class HeartbeatPayload
{
public string Message { get; set; } = "ping";
}
```
### 序列化结果
```json
{
"type": "heartbeat",
"payload": {
"message": "ping"
}
}
```
Loading…
Cancel
Save