vRp.CD2g_test/configuration/config.go

74 lines
1.7 KiB
Go

package configuration
import (
"github.com/kercylan98/minotaur/utils/log"
"github.com/kercylan98/minotaur/utils/timer"
"time"
)
const (
tickerLoadRefresh = "_tickerLoadRefresh"
)
var (
cTicker *timer.Ticker
cInterval time.Duration
cLoader []Loader
)
// Init 配置初始化
// - 在初始化后会立即加载配置
func Init(loader ...Loader) {
cLoader = loader
Load()
Refresh()
}
// Load 加载配置
// - 加载后并不会刷新线上配置,需要执行 Refresh 函数对线上配置进行刷新
func Load() {
defer func() {
if err := recover(); err != nil {
log.Error("Config", log.String("Action", "Load"), log.Err(err.(error)))
}
}()
for _, loader := range cLoader {
loader.Load()
}
}
// Refresh 刷新配置
func Refresh() {
defer func() {
if err := recover(); err != nil {
log.Error("Config", log.String("Action", "Refresh"), log.Err(err.(error)))
}
OnConfigRefreshEvent()
}()
for _, loader := range cLoader {
loader.Refresh()
}
}
// WithTickerLoad 通过定时器加载配置
// - 通过定时器加载配置后,会自动刷新线上配置
// - 调用该函数后不会立即刷新,而是在 interval 后加载并刷新一次配置,之后每隔 interval 加载并刷新一次配置
func WithTickerLoad(ticker *timer.Ticker, interval time.Duration) {
if ticker != cTicker && cTicker != nil {
cTicker.StopTimer(tickerLoadRefresh)
}
cTicker = ticker
cInterval = interval
cTicker.Loop(tickerLoadRefresh, cInterval, cInterval, timer.Forever, func() {
Load()
Refresh()
})
}
// StopTickerLoad 停止通过定时器加载配置
func StopTickerLoad() {
if cTicker != nil {
cTicker.StopTimer(tickerLoadRefresh)
}
}