重构:重命名核心组件并增强查询功能
主要更改: 1. 核心重命名 - Seqlog -> LogHub (更准确地反映其作为日志中枢的角色) - NewSeqlog() -> NewLogHub() - LogCursor -> ProcessCursor (更准确地反映其用于处理场景) - seqlog_manager.go -> loghub.go (文件名与结构体名对应) 2. TopicProcessor.Reset 增强 - 如果正在运行且没有待处理的日志,会自动停止后重置 - 如果有待处理的日志,返回详细错误(显示已处理/总记录数) - 简化了 LogHub.ResetTopic,移除显式 Stop 调用 3. 新增查询方法 - TopicProcessor.QueryFromFirst(count) - 从第一条记录向索引递增方向查询 - TopicProcessor.QueryFromLast(count) - 从最后一条记录向索引递减方向查询 - LogHub.QueryFromFirst(topic, count) - LogHub.QueryFromLast(topic, count) 4. 测试覆盖 - 添加 query_test.go - QueryFromProcessing 测试 - 添加 TestQueryFromFirstAndLast - TopicProcessor 查询测试 - 添加 TestLogHubQueryFromFirstAndLast - LogHub 查询测试 - 添加 TestTopicResetWithPendingRecords - Reset 增强功能测试 5. 示例代码 - 添加 example/get_record/ - 演示 QueryFromProcessing 用法 - 更新所有示例以使用 LogHub 和新 API 所有测试通过 ✅ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
74
example/get_record/main.go
Normal file
74
example/get_record/main.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"code.tczkiot.com/seqlog"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 创建 Seqlog 实例
|
||||
mgr := seqlog.NewLogHub("./logs", nil, nil)
|
||||
|
||||
// 注册 topic handler
|
||||
processedCount := 0
|
||||
err := mgr.RegisterHandler("app", func(record *seqlog.Record) error {
|
||||
processedCount++
|
||||
fmt.Printf("处理记录 #%d: %s\n", processedCount, string(record.Data))
|
||||
time.Sleep(100 * time.Millisecond) // 模拟处理耗时
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// 写入一些记录
|
||||
fmt.Println("=== 写入记录 ===")
|
||||
for i := 0; i < 10; i++ {
|
||||
data := fmt.Sprintf("日志消息 #%d", i)
|
||||
offset, err := mgr.Write("app", []byte(data))
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Printf("写入: offset=%d, data=%s\n", offset, data)
|
||||
}
|
||||
|
||||
// 启动处理
|
||||
fmt.Println("\n=== 启动日志处理 ===")
|
||||
err = mgr.Start()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// 等待一段时间让处理器处理一些记录
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
|
||||
// 查询当前处理窗口的记录
|
||||
fmt.Println("\n=== 查询当前处理窗口记录 ===")
|
||||
records, err := mgr.QueryFromProcessing("app", 5)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Printf("从处理窗口开始位置查询到 %d 条记录:\n", len(records))
|
||||
for _, rec := range records {
|
||||
fmt.Printf(" [索引 %d] %s - 状态: %s\n", rec.Index, string(rec.Record.Data), rec.Status)
|
||||
}
|
||||
|
||||
// 查询更多记录
|
||||
fmt.Println("\n=== 查询后续记录 ===")
|
||||
moreRecords, err := mgr.QueryFromProcessing("app", 10)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Printf("查询到 %d 条记录:\n", len(moreRecords))
|
||||
for _, rec := range moreRecords {
|
||||
fmt.Printf(" [索引 %d] %s - 状态: %s\n", rec.Index, string(rec.Record.Data), rec.Status)
|
||||
}
|
||||
|
||||
// 清理
|
||||
mgr.Stop()
|
||||
fmt.Println("\n=== 示例完成 ===")
|
||||
}
|
||||
Reference in New Issue
Block a user