mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
为`gcfg`添加配置文件变更自定义回调,实现了`WatcherAdapter`接口,以下是`AdapterFile`的用法
test.yaml
```
b: "b"
```
```
package main
import (
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcfg"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
ctx := gctx.New()
file, _ := gcfg.NewAdapterFile("test.yaml")
file.Data(ctx)
file.AddWatcher("test", func() {
value := file.MustGet(ctx, "b")
fmt.Println(value.String())
})
server := g.Server()
server.Run()
}
```
使用`g`和默认配置文件
```
file := g.Cfg().GetAdapter().(*gcfg.AdapterFile)
file.AddWatcher("test", func() {
})
file := g.Cfg().GetAdapter().(*gcfg.AdapterFile)
file.RemoveWatcher("test")
```
注意:由于`gf`的`AdapterFile`使用的监听到文件变化删除缓存下一次重新初始化的懒加载方案,所有除了默认加载的`config.xxx`文件外,自定义的配置文件像`test.yaml`之类的都需要在`AddWatcher`前主动读取一次数据进行初始化监听(
`g.Cfg("test").Data(ctx)`)
---------
Co-authored-by: hailaz <739476267@qq.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Hunk Zhu <hunk@joy999.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
// If a copy of the MIT was not distributed with this file,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
package gcfg_test
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/gogf/gf/v2/os/gcfg"
|
|
"github.com/gogf/gf/v2/test/gtest"
|
|
)
|
|
|
|
func TestWatcherRegistry_Basic(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
registry := gcfg.NewWatcherRegistry()
|
|
|
|
// Test Add and GetNames
|
|
var (
|
|
wg sync.WaitGroup
|
|
called bool
|
|
)
|
|
wg.Add(1)
|
|
registry.Add("test-watcher", func(ctx context.Context) {
|
|
defer wg.Done()
|
|
called = true
|
|
})
|
|
|
|
names := registry.GetNames()
|
|
t.AssertEQ(len(names), 1)
|
|
t.AssertEQ(names[0], "test-watcher")
|
|
|
|
// Test Notify
|
|
registry.Notify(context.Background())
|
|
wg.Wait()
|
|
t.AssertEQ(called, true)
|
|
|
|
// Test Remove
|
|
registry.Remove("test-watcher")
|
|
names = registry.GetNames()
|
|
t.AssertEQ(len(names), 0)
|
|
})
|
|
}
|
|
|
|
func TestWatcherRegistry_MultipleWatchers(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
registry := gcfg.NewWatcherRegistry()
|
|
|
|
var (
|
|
wg sync.WaitGroup
|
|
count1, count2, count3 int
|
|
)
|
|
wg.Add(3)
|
|
registry.Add("watcher1", func(ctx context.Context) {
|
|
defer wg.Done()
|
|
count1++
|
|
})
|
|
registry.Add("watcher2", func(ctx context.Context) {
|
|
defer wg.Done()
|
|
count2++
|
|
})
|
|
registry.Add("watcher3", func(ctx context.Context) {
|
|
defer wg.Done()
|
|
count3++
|
|
})
|
|
|
|
names := registry.GetNames()
|
|
t.AssertEQ(len(names), 3)
|
|
|
|
registry.Notify(context.Background())
|
|
wg.Wait()
|
|
t.AssertEQ(count1, 1)
|
|
t.AssertEQ(count2, 1)
|
|
t.AssertEQ(count3, 1)
|
|
|
|
// Remove one watcher
|
|
registry.Remove("watcher2")
|
|
names = registry.GetNames()
|
|
t.AssertEQ(len(names), 2)
|
|
})
|
|
}
|