修复配置更新任务解析失败问题
This commit is contained in:
@@ -1,9 +1,13 @@
|
|||||||
package events
|
package events
|
||||||
|
|
||||||
import "github.com/hibiken/asynq"
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/hibiken/asynq"
|
||||||
|
)
|
||||||
|
|
||||||
const FlushGateway = "gateway:flush"
|
const FlushGateway = "gateway:flush"
|
||||||
|
|
||||||
func NewFlushGateway() *asynq.Task {
|
func NewFlushGateway(ttl time.Duration) *asynq.Task {
|
||||||
return asynq.NewTask(FlushGateway, nil)
|
return asynq.NewTask(FlushGateway, nil, asynq.MaxRetry(0), asynq.Unique(ttl))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,8 +59,14 @@ func HandleRemoveChannel(_ context.Context, task *asynq.Task) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func HandleFlushGateway(_ context.Context, task *asynq.Task) (err error) {
|
func HandleFlushGateway(_ context.Context, task *asynq.Task) error {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
defer func() {
|
||||||
|
duration := time.Since(start)
|
||||||
|
if duration > time.Second {
|
||||||
|
slog.Warn("更新代理后备配置耗时过长", "time", duration.String())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// 获取所有网关:配置组
|
// 获取所有网关:配置组
|
||||||
proxies, err := s.Proxy.AllProxies(m.ProxyTypeBaiYin, true)
|
proxies, err := s.Proxy.AllProxies(m.ProxyTypeBaiYin, true)
|
||||||
@@ -82,12 +88,16 @@ func HandleFlushGateway(_ context.Context, task *asynq.Task) (err error) {
|
|||||||
// 获取之前的后备配置
|
// 获取之前的后备配置
|
||||||
remotes := map[string]int{}
|
remotes := map[string]int{}
|
||||||
if proxy.Meta != nil {
|
if proxy.Meta != nil {
|
||||||
meta, ok := proxy.Meta.Data().([]g.AutoConfig)
|
meta, ok := proxy.Meta.Data().([]any)
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("解析网关数据失败")
|
return fmt.Errorf("解析网关数据失败: %T", proxy.Meta.Data())
|
||||||
}
|
}
|
||||||
for _, m := range meta {
|
for _, rawM := range meta {
|
||||||
remotes[fmt.Sprintf("%s:%s:%s", m.Isp, m.Province, m.City)] = m.Count
|
m, ok := rawM.(map[string]any)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("解析网关数据失败: %T", rawM)
|
||||||
|
}
|
||||||
|
remotes[fmt.Sprintf("%s:%s:%s", m["isp"], m["province"], m["city"])] = int(m["count"].(float64))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,6 +152,5 @@ func HandleFlushGateway(_ context.Context, task *asynq.Task) (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
slog.Debug("更新代理后备配置", "time", time.Since(start).String())
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ func RunSchedule(ctx context.Context) error {
|
|||||||
Location: time.Local,
|
Location: time.Local,
|
||||||
})
|
})
|
||||||
|
|
||||||
scheduler.Register("* * * * *", events.NewFlushGateway())
|
scheduler.Register("@every 5s", events.NewFlushGateway(5*time.Second))
|
||||||
|
|
||||||
// 停止服务
|
// 停止服务
|
||||||
go func() {
|
go func() {
|
||||||
@@ -99,7 +99,11 @@ func RunSchedule(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RunTask(ctx context.Context) error {
|
func RunTask(ctx context.Context) error {
|
||||||
var server = asynq.NewServerFromRedisClient(base.Redis, asynq.Config{})
|
var server = asynq.NewServerFromRedisClient(base.Redis, asynq.Config{
|
||||||
|
ErrorHandler: asynq.ErrorHandlerFunc(func(ctx context.Context, task *asynq.Task, err error) {
|
||||||
|
slog.Error("任务执行失败", "task", task.Type(), "error", err)
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
var mux = asynq.NewServeMux()
|
var mux = asynq.NewServeMux()
|
||||||
mux.HandleFunc(events.RemoveChannel, tasks.HandleRemoveChannel)
|
mux.HandleFunc(events.RemoveChannel, tasks.HandleRemoveChannel)
|
||||||
|
|||||||
Reference in New Issue
Block a user