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  }