github.com/zly-app/zapp@v1.3.3/config/watch_example/example_provider/provider.go (about) 1 package example_provider 2 3 import ( 4 "fmt" 5 "sync" 6 "time" 7 8 "github.com/zly-app/zapp/core" 9 ) 10 11 // 示例提供者 12 type ExampleProvider struct { 13 app core.IApp 14 data map[string]map[string][]byte // 表示组下的key的数据 15 mx sync.Mutex 16 } 17 18 // 实现必须的函数 19 func (t *ExampleProvider) Inject(a ...interface{}) {} 20 21 // 实现必须的函数 22 func (t *ExampleProvider) Start() error { return nil } 23 24 // 实现必须的函数 25 func (t *ExampleProvider) Close() error { return nil } 26 27 func NewExamplePlugin(app core.IApp) *ExampleProvider { 28 p := &ExampleProvider{ 29 app: app, 30 data: make(map[string]map[string][]byte), 31 } 32 33 // 下面的代码是填充一些默认数据 34 data := map[string]map[string][]byte{ 35 "group_name": { 36 "key_name": []byte("1"), 37 "generic_key": []byte(`{"a":1}`), 38 }, 39 } 40 p.data = data 41 // 上面的代码是填充一些默认数据 42 43 return p 44 } 45 46 // 获取 47 func (t *ExampleProvider) Get(groupName, keyName string) ([]byte, error) { 48 t.mx.Lock() 49 defer t.mx.Unlock() 50 51 g, ok := t.data[groupName] 52 if !ok { 53 return nil, fmt.Errorf("not found group: %s", groupName) 54 } 55 56 data, ok := g[keyName] 57 if !ok { 58 return nil, fmt.Errorf("not found key: %s.%s", groupName, keyName) 59 } 60 61 return data, nil 62 } 63 64 // 设置 65 func (t *ExampleProvider) Set(groupName, keyName string, data []byte) error { 66 t.mx.Lock() 67 defer t.mx.Unlock() 68 69 g, ok := t.data[groupName] 70 if !ok { 71 g = make(map[string][]byte) 72 t.data[groupName] = g 73 } 74 75 g[keyName] = data 76 return nil 77 } 78 79 // watch 80 func (t *ExampleProvider) Watch(groupName, keyName string, 81 callback core.ConfigWatchProviderCallback) error { 82 go func(groupName, keyName string, callback core.ConfigWatchProviderCallback) { 83 i := 1 84 for { 85 i++ 86 time.Sleep(time.Second * 1) 87 t.mx.Lock() 88 oldData := t.getData(groupName, keyName) 89 newData := []byte(fmt.Sprintf(`{"a":%d}`, i)) 90 t.data[groupName][keyName] = newData 91 t.mx.Unlock() 92 callback(groupName, keyName, oldData, newData) 93 } 94 }(groupName, keyName, callback) 95 return nil 96 } 97 98 func (t *ExampleProvider) getData(groupName, keyName string) []byte { 99 g, ok := t.data[groupName] 100 if !ok { 101 return nil 102 } 103 return g[keyName] 104 }