监听数据变化
Go Cursor SDK 提供了 Watcher 功能,可以实时监听 Cursor IDE 数据的变化,并在数据更新时触发回调函数。
启用 Watcher
基本配置
go
config := &cursor.ClientConfig{
EnableWatcher: true,
LogLevel: cursor.LogLevelInfo,
}
client, err := cursor.NewCursorClient(config)
if err != nil {
log.Fatal(err)
}
defer client.Close()监听事件
监听会话变化
go
watcher := client.Watcher()
// 监听会话变化
watcher.WatchSessions(func(event cursor.WatchEvent) {
fmt.Printf("会话事件:%s - %s\n", event.Type, event.Action)
fmt.Printf("会话 ID:%s\n", event.ID)
})监听 Composer 变化
go
// 监听 Composer 变化
watcher.WatchComposers(func(event cursor.WatchEvent) {
fmt.Printf("Composer 事件:%s - %s\n", event.Type, event.Action)
fmt.Printf("Composer ID:%s\n", event.ID)
})监听统计数据变化
go
// 监听统计数据变化
watcher.WatchStats(func(event cursor.WatchEvent) {
fmt.Printf("统计数据更新:%s\n", event.Action)
})监听配置变化
go
// 监听配置变化
watcher.WatchConfig(func(event cursor.WatchEvent) {
fmt.Printf("配置更新:%s\n", event.Action)
})启动和停止监听
启动监听
go
// 启动 Watcher
if err := watcher.Start(); err != nil {
log.Fatal(err)
}
fmt.Println("Watcher 已启动,正在监听数据变化...")停止监听
go
// 停止 Watcher
watcher.Stop()
fmt.Println("Watcher 已停止")事件类型
WatchEvent 结构
go
type WatchEvent struct {
Type string // 事件类型:session, composer, stats, config
Action string // 操作类型:create, update, delete
ID string // 资源 ID
Timestamp time.Time // 事件时间
Data interface{} // 事件数据
}事件操作类型
create:创建新记录update:更新现有记录delete:删除记录
实际示例
完整的监听示例
go
package main
import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
cursor "github.com/vibe-coding-labs/go-cursor-sdk"
)
func main() {
// 创建配置
config := &cursor.ClientConfig{
EnableWatcher: true,
LogLevel: cursor.LogLevelInfo,
}
// 创建客户端
client, err := cursor.NewCursorClient(config)
if err != nil {
log.Fatal(err)
}
defer client.Close()
// 获取 Watcher
watcher := client.Watcher()
// 监听会话变化
watcher.WatchSessions(func(event cursor.WatchEvent) {
fmt.Printf("[会话] %s - %s (ID: %s)\n",
event.Action, event.Type, event.ID)
})
// 监听 Composer 变化
watcher.WatchComposers(func(event cursor.WatchEvent) {
fmt.Printf("[Composer] %s - %s (ID: %s)\n",
event.Action, event.Type, event.ID)
})
// 监听统计数据变化
watcher.WatchStats(func(event cursor.WatchEvent) {
fmt.Printf("[统计] %s\n", event.Action)
})
// 启动监听
if err := watcher.Start(); err != nil {
log.Fatal(err)
}
fmt.Println("正在监听数据变化,按 Ctrl+C 退出...")
// 等待中断信号
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
<-sigChan
// 停止监听
watcher.Stop()
fmt.Println("已停止监听")
}结合缓存使用
go
// 监听数据变化,自动清除缓存
watcher := client.Watcher()
watcher.WatchSessions(func(event cursor.WatchEvent) {
// 会话变化时清除缓存
client.Cache().ClearSessions()
fmt.Println("会话缓存已清除")
})
watcher.WatchComposers(func(event cursor.WatchEvent) {
// Composer 变化时清除缓存
client.Cache().ClearComposers()
fmt.Println("Composer 缓存已清除")
})
if err := watcher.Start(); err != nil {
log.Fatal(err)
}实时数据同步
go
// 监听数据变化,实时同步到外部系统
watcher := client.Watcher()
watcher.WatchSessions(func(event cursor.WatchEvent) {
switch event.Action {
case "create":
// 同步新会话到外部系统
syncNewSession(event.ID)
case "update":
// 更新外部系统中的会话
updateSession(event.ID)
case "delete":
// 从外部系统删除会话
deleteSession(event.ID)
}
})
if err := watcher.Start(); err != nil {
log.Fatal(err)
}性能考虑
监听频率
Watcher 使用文件系统监听机制,性能开销较小:
- 不会轮询数据库
- 只在文件变化时触发事件
- 支持批量处理事件
回调函数
- 回调函数应该快速执行
- 避免在回调中执行耗时操作
- 考虑使用 goroutine 处理复杂逻辑
go
watcher.WatchSessions(func(event cursor.WatchEvent) {
// 使用 goroutine 处理耗时操作
go func() {
// 复杂的处理逻辑
processEvent(event)
}()
})错误处理
go
watcher := client.Watcher()
// 设置错误处理器
watcher.OnError(func(err error) {
log.Printf("Watcher 错误:%v\n", err)
})
if err := watcher.Start(); err != nil {
log.Fatal(err)
}