优化部分存在的问题
This commit is contained in:
+26
-18
@@ -70,7 +70,11 @@ func InitCluster(ctx context.Context, red redis.UniversalClient, keyPrefix strin
|
|||||||
|
|
||||||
ctx, cancel := context.WithCancel(ctx)
|
ctx, cancel := context.WithCancel(ctx)
|
||||||
|
|
||||||
U, _ := uuid.NewV7()
|
U, err := uuid.NewV7()
|
||||||
|
if err != nil {
|
||||||
|
op.logger.Errorf(ctx, "InitCluster uuid.NewV7 err:%v, using fallback", err)
|
||||||
|
U = uuid.New()
|
||||||
|
}
|
||||||
|
|
||||||
clu := &Cluster{
|
clu := &Cluster{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
@@ -204,7 +208,7 @@ func (l *Cluster) startDaemon() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *Cluster) cleanExecuteInfoLoop() {
|
func (l *Cluster) cleanExecuteInfoLoop() {
|
||||||
l.wg.Done()
|
defer l.wg.Done()
|
||||||
|
|
||||||
ticker := time.NewTicker(time.Minute * 5)
|
ticker := time.NewTicker(time.Minute * 5)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
@@ -224,10 +228,11 @@ func (l *Cluster) cleanExecuteInfoLoop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 清除过期任务
|
// 清除过期任务
|
||||||
func (l *Cluster) cleanExecuteInfo() error {
|
func (l *Cluster) cleanExecuteInfo() {
|
||||||
// 移除执行信息
|
// 移除执行信息
|
||||||
l.redis.ZRemRangeByScore(l.ctx, l.executeInfoKey, "0", strconv.FormatInt(time.Now().Add(-15*time.Minute).UnixMilli(), 10)).Err()
|
if err := l.redis.ZRemRangeByScore(l.ctx, l.executeInfoKey, "0", strconv.FormatInt(time.Now().Add(-15*time.Minute).UnixMilli(), 10)).Err(); err != nil {
|
||||||
return nil
|
l.logger.Errorf(l.ctx, "cleanExecuteInfo ZRemRangeByScore err:%v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// scheduleTasks 调度任务(只有leader执行)
|
// scheduleTasks 调度任务(只有leader执行)
|
||||||
@@ -449,7 +454,11 @@ func (l *Cluster) calculateNextTimes() {
|
|||||||
|
|
||||||
// 根据内部注册的任务列表计算下一次执行的时间
|
// 根据内部注册的任务列表计算下一次执行的时间
|
||||||
l.workerList.Range(func(key, value interface{}) bool {
|
l.workerList.Range(func(key, value interface{}) bool {
|
||||||
val := value.(timerStr)
|
val, ok := value.(timerStr)
|
||||||
|
if !ok {
|
||||||
|
l.logger.Errorf(l.ctx, "Cluster calculateNextTimes invalid type in workerList for key:%v", key)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
nextTime, err := GetNextTime(time.Now().In(l.location), *val.JobData)
|
nextTime, err := GetNextTime(time.Now().In(l.location), *val.JobData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -539,7 +548,7 @@ func (c *Cluster) executeTasks() {
|
|||||||
case <-c.ctx.Done():
|
case <-c.ctx.Done():
|
||||||
return
|
return
|
||||||
case c.workerChan <- struct{}{}:
|
case c.workerChan <- struct{}{}:
|
||||||
func() {
|
go func() {
|
||||||
defer func() {
|
defer func() {
|
||||||
<-c.workerChan
|
<-c.workerChan
|
||||||
}()
|
}()
|
||||||
@@ -553,7 +562,6 @@ func (c *Cluster) executeTasks() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
if err != redis.Nil {
|
if err != redis.Nil {
|
||||||
c.logger.Errorf(c.ctx, "Failed to pop task: %v", err)
|
c.logger.Errorf(c.ctx, "Failed to pop task: %v", err)
|
||||||
// Redis 异常,休眠一会儿
|
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -561,22 +569,16 @@ func (c *Cluster) executeTasks() {
|
|||||||
|
|
||||||
if len(taskID) < 2 {
|
if len(taskID) < 2 {
|
||||||
c.logger.Errorf(c.ctx, "Invalid BLPop result: %v", taskID)
|
c.logger.Errorf(c.ctx, "Invalid BLPop result: %v", taskID)
|
||||||
// 数据异常,继续下一个
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
go c.processTask(taskID[1])
|
c.processTask(taskID[1])
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReJobData struct {
|
|
||||||
TaskId string
|
|
||||||
Times int
|
|
||||||
}
|
|
||||||
|
|
||||||
// 执行任务
|
// 执行任务
|
||||||
func (l *Cluster) processTask(taskId string) {
|
func (l *Cluster) processTask(taskId string) {
|
||||||
|
|
||||||
@@ -585,7 +587,11 @@ func (l *Cluster) processTask(taskId string) {
|
|||||||
ctx, cancel := context.WithTimeout(l.ctx, l.timeout)
|
ctx, cancel := context.WithTimeout(l.ctx, l.timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
u, _ := uuid.NewV7()
|
u, err := uuid.NewV7()
|
||||||
|
if err != nil {
|
||||||
|
l.logger.Errorf(ctx, "processTask uuid.NewV7 err:%v, using fallback", err)
|
||||||
|
u = uuid.New()
|
||||||
|
}
|
||||||
|
|
||||||
ctx = context.WithValue(ctx, "trace_id", u.String())
|
ctx = context.WithValue(ctx, "trace_id", u.String())
|
||||||
|
|
||||||
@@ -593,10 +599,12 @@ func (l *Cluster) processTask(taskId string) {
|
|||||||
|
|
||||||
// 上报执行情况
|
// 上报执行情况
|
||||||
executeVal := fmt.Sprintf("tid:%s|insId:%s|uuid:%s|time:%s", taskId, l.instanceId, u.String(), begin.Format(time.RFC3339Nano))
|
executeVal := fmt.Sprintf("tid:%s|insId:%s|uuid:%s|time:%s", taskId, l.instanceId, u.String(), begin.Format(time.RFC3339Nano))
|
||||||
l.redis.ZAdd(ctx, l.executeInfoKey, redis.Z{
|
if err := l.redis.ZAdd(ctx, l.executeInfoKey, redis.Z{
|
||||||
Score: float64(begin.UnixMilli()),
|
Score: float64(begin.UnixMilli()),
|
||||||
Member: executeVal,
|
Member: executeVal,
|
||||||
})
|
}).Err(); err != nil {
|
||||||
|
l.logger.Errorf(ctx, "processTask ZAdd executeInfo err:%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
val, ok := l.workerList.Load(taskId)
|
val, ok := l.workerList.Load(taskId)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|||||||
@@ -150,7 +150,9 @@ func (l *HeartBeat) cleanHeartbeat(cleanSelf bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 移除心跳
|
// 移除心跳
|
||||||
l.redis.ZRemRangeByScore(l.ctx, l.heartbeatKey, "0", strconv.FormatInt(time.Now().Add(-15*time.Second).UnixMilli(), 10)).Err()
|
if err := l.redis.ZRemRangeByScore(l.ctx, l.heartbeatKey, "0", strconv.FormatInt(time.Now().Add(-15*time.Second).UnixMilli(), 10)).Err(); err != nil {
|
||||||
|
l.logger.Errorf(l.ctx, "cleanHeartbeat ZRemRangeByScore err:%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,10 @@ type Options struct {
|
|||||||
|
|
||||||
func defaultOptions() Options {
|
func defaultOptions() Options {
|
||||||
|
|
||||||
u, _ := uuid.NewV7()
|
u, err := uuid.NewV7()
|
||||||
|
if err != nil {
|
||||||
|
u = uuid.New()
|
||||||
|
}
|
||||||
|
|
||||||
return Options{
|
return Options{
|
||||||
logger: logger.NewLogger(),
|
logger: logger.NewLogger(),
|
||||||
|
|||||||
+9
-6
@@ -111,8 +111,11 @@ func (l *Leader) getLeaderLock() error {
|
|||||||
l.logger.Errorf(l.ctx, "getLeaderLock err:%+v", err)
|
l.logger.Errorf(l.ctx, "getLeaderLock err:%+v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if b, _ := lock.Lock(); !b {
|
if b, err := lock.Lock(); !b || err != nil {
|
||||||
// 加锁失败 非Reader
|
// 加锁失败 非Leader
|
||||||
|
if err != nil {
|
||||||
|
l.logger.Errorf(l.ctx, "getLeaderLock lock.Lock err:%+v", err)
|
||||||
|
}
|
||||||
l.leaderLock.Lock()
|
l.leaderLock.Lock()
|
||||||
l.isLeader = false
|
l.isLeader = false
|
||||||
l.leaderLock.Unlock()
|
l.leaderLock.Unlock()
|
||||||
@@ -152,10 +155,10 @@ func (l *Leader) getLeaderLock() error {
|
|||||||
// 等待超时退出
|
// 等待超时退出
|
||||||
<-lock.GetCtx().Done()
|
<-lock.GetCtx().Done()
|
||||||
|
|
||||||
// 已过期
|
// 锁已过期,重置leader状态
|
||||||
// l.leaderLock.Lock()
|
l.leaderLock.Lock()
|
||||||
// l.isLeader = false
|
l.isLeader = false
|
||||||
// l.leaderLock.Unlock()
|
l.leaderLock.Unlock()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -15,7 +15,10 @@ type Options struct {
|
|||||||
|
|
||||||
func defaultOptions() Options {
|
func defaultOptions() Options {
|
||||||
|
|
||||||
u, _ := uuid.NewV7()
|
u, err := uuid.NewV7()
|
||||||
|
if err != nil {
|
||||||
|
u = uuid.New()
|
||||||
|
}
|
||||||
|
|
||||||
return Options{
|
return Options{
|
||||||
logger: logger.NewLogger(),
|
logger: logger.NewLogger(),
|
||||||
|
|||||||
+3
-41
@@ -240,56 +240,18 @@ func calculateNextCronTime(t time.Time, job JobData) (*time.Time, error) {
|
|||||||
return nil, ErrCronParser
|
return nil, ErrCronParser
|
||||||
}
|
}
|
||||||
|
|
||||||
s := *job.CronSchedule
|
next := job.CronSchedule.Next(t)
|
||||||
|
|
||||||
next := s.Next(t)
|
|
||||||
return &next, nil
|
return &next, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetCronSche(CronExpression string, cronParser *cron.Parser) (*cron.Schedule, error) {
|
func GetCronSche(CronExpression string, cronParser *cron.Parser) (cron.Schedule, error) {
|
||||||
if CronExpression == "" {
|
if CronExpression == "" {
|
||||||
return nil, ErrCronExpression
|
return nil, ErrCronExpression
|
||||||
}
|
}
|
||||||
if cronParser == nil {
|
if cronParser == nil {
|
||||||
return nil, ErrCronParser
|
return nil, ErrCronParser
|
||||||
}
|
}
|
||||||
sche, err := cronParser.Parse(CronExpression)
|
return cronParser.Parse(CronExpression)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &sche, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否本周期可以运行
|
|
||||||
// 检查是否本周期可以运行(已弃用,使用新的时间比较逻辑)
|
|
||||||
// 保留此函数用于向后兼容,但建议使用新的时间计算逻辑
|
|
||||||
func canRun(t time.Time, job JobData) bool {
|
|
||||||
targetTime := time.Date(t.Year(), t.Month(), t.Day(), job.Hour, job.Minute, job.Second, 0, t.Location())
|
|
||||||
|
|
||||||
switch job.JobType {
|
|
||||||
case JobTypeEveryMonth:
|
|
||||||
// 对于月任务,需要比较日期
|
|
||||||
targetTime = time.Date(t.Year(), t.Month(), job.Day, job.Hour, job.Minute, job.Second, 0, t.Location())
|
|
||||||
return !targetTime.Before(t)
|
|
||||||
case JobTypeEveryWeek:
|
|
||||||
// 对于周任务,需要比较星期
|
|
||||||
currentWeekday := t.Weekday()
|
|
||||||
if currentWeekday < job.Weekday {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if currentWeekday == job.Weekday {
|
|
||||||
return targetTime.After(t) || targetTime.Equal(t)
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
case JobTypeEveryDay:
|
|
||||||
return targetTime.After(t) || targetTime.Equal(t)
|
|
||||||
case JobTypeEveryHour:
|
|
||||||
hourTarget := time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), job.Minute, job.Second, 0, t.Location())
|
|
||||||
return hourTarget.After(t) || hourTarget.Equal(t)
|
|
||||||
case JobTypeEveryMinute:
|
|
||||||
minuteTarget := time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), job.Second, 0, t.Location())
|
|
||||||
return minuteTarget.After(t) || minuteTarget.Equal(t)
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -108,7 +108,11 @@ func InitOnce(ctx context.Context, re redis.UniversalClient, keyPrefix string, c
|
|||||||
|
|
||||||
ctx, cancel := context.WithCancel(ctx)
|
ctx, cancel := context.WithCancel(ctx)
|
||||||
|
|
||||||
u, _ := uuid.NewV7()
|
u, err := uuid.NewV7()
|
||||||
|
if err != nil {
|
||||||
|
op.logger.Errorf(ctx, "InitOnce uuid.NewV7 err:%v, using fallback", err)
|
||||||
|
u = uuid.New()
|
||||||
|
}
|
||||||
|
|
||||||
wo := &Once{
|
wo := &Once{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
@@ -233,7 +237,7 @@ func (l *Once) startDaemon() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *Once) cleanExecuteInfoLoop() {
|
func (l *Once) cleanExecuteInfoLoop() {
|
||||||
l.wg.Done()
|
defer l.wg.Done()
|
||||||
|
|
||||||
ticker := time.NewTicker(time.Minute * 5)
|
ticker := time.NewTicker(time.Minute * 5)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
@@ -253,10 +257,11 @@ func (l *Once) cleanExecuteInfoLoop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 清除过期任务
|
// 清除过期任务
|
||||||
func (l *Once) cleanExecuteInfo() error {
|
func (l *Once) cleanExecuteInfo() {
|
||||||
// 移除执行信息
|
// 移除执行信息
|
||||||
l.redis.ZRemRangeByScore(l.ctx, l.executeInfoKey, "0", strconv.FormatInt(time.Now().Add(-15*time.Minute).UnixMilli(), 10)).Err()
|
if err := l.redis.ZRemRangeByScore(l.ctx, l.executeInfoKey, "0", strconv.FormatInt(time.Now().Add(-15*time.Minute).UnixMilli(), 10)).Err(); err != nil {
|
||||||
return nil
|
l.logger.Errorf(l.ctx, "cleanExecuteInfo ZRemRangeByScore err:%v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 任务调度 领导
|
// 任务调度 领导
|
||||||
@@ -302,7 +307,7 @@ func (l *Once) executeTasks() {
|
|||||||
case <-l.ctx.Done():
|
case <-l.ctx.Done():
|
||||||
return
|
return
|
||||||
case l.workerChan <- struct{}{}:
|
case l.workerChan <- struct{}{}:
|
||||||
func() {
|
go func() {
|
||||||
defer func() {
|
defer func() {
|
||||||
<-l.workerChan
|
<-l.workerChan
|
||||||
}()
|
}()
|
||||||
@@ -316,7 +321,6 @@ func (l *Once) executeTasks() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
if err != redis.Nil {
|
if err != redis.Nil {
|
||||||
l.logger.Errorf(l.ctx, "Failed to pop task: %v", err)
|
l.logger.Errorf(l.ctx, "Failed to pop task: %v", err)
|
||||||
// Redis 异常,休眠一会儿再重试
|
|
||||||
time.Sleep(time.Second * 5)
|
time.Sleep(time.Second * 5)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -324,11 +328,10 @@ func (l *Once) executeTasks() {
|
|||||||
|
|
||||||
if len(keys) < 2 {
|
if len(keys) < 2 {
|
||||||
l.logger.Errorf(l.ctx, "Invalid task data: %v", keys)
|
l.logger.Errorf(l.ctx, "Invalid task data: %v", keys)
|
||||||
// 数据异常,继续下一个
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 处理任务
|
// 处理任务
|
||||||
go l.processTask(keys[1])
|
l.processTask(keys[1])
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -409,7 +412,11 @@ func (w *Once) save(ctx context.Context, jobType jobType, taskType OnceTaskType,
|
|||||||
RunCount: runCount,
|
RunCount: runCount,
|
||||||
JobType: jobType,
|
JobType: jobType,
|
||||||
}
|
}
|
||||||
b, _ := json.Marshal(ed)
|
b, err := json.Marshal(ed)
|
||||||
|
if err != nil {
|
||||||
|
w.logger.Errorf(ctx, "save json.Marshal err:%v taskType:%v taskId:%v", err, taskType, taskId)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// 使用事务确保原子性
|
// 使用事务确保原子性
|
||||||
pipe := w.redis.TxPipeline()
|
pipe := w.redis.TxPipeline()
|
||||||
@@ -424,7 +431,7 @@ func (w *Once) save(ctx context.Context, jobType jobType, taskType OnceTaskType,
|
|||||||
Score: float64(nextTime.UnixMilli()),
|
Score: float64(nextTime.UnixMilli()),
|
||||||
Member: redisKey,
|
Member: redisKey,
|
||||||
})
|
})
|
||||||
_, err := pipe.Exec(w.ctx)
|
_, err = pipe.Exec(w.ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.logger.Errorf(w.ctx, "save task failed:%v taskType:%v taskId:%v attachData:%v retryCount:%v", err, taskType, taskId, attachData, runCount)
|
w.logger.Errorf(w.ctx, "save task failed:%v taskType:%v taskId:%v attachData:%v retryCount:%v", err, taskType, taskId, attachData, runCount)
|
||||||
return err
|
return err
|
||||||
@@ -509,8 +516,21 @@ func (w *Once) Delete(taskType OnceTaskType, taskId string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取任务
|
// 获取任务
|
||||||
func (l *Once) Get(taskType OnceTaskType, taskId string) {
|
func (l *Once) Get(taskType OnceTaskType, taskId string) (any, error) {
|
||||||
//
|
redisKey := l.buildRedisKey(taskType, taskId)
|
||||||
|
dataKey := fmt.Sprintf("timer:{%s}:once_data:%s", l.keyPrefix, redisKey)
|
||||||
|
str, err := l.redis.Get(l.ctx, dataKey).Result()
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, redis.Nil) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var ed extendData
|
||||||
|
if err := json.Unmarshal([]byte(str), &ed); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ed.Data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 批量获取任务
|
// 批量获取任务
|
||||||
@@ -551,7 +571,11 @@ func (l *Once) processTask(key string) {
|
|||||||
ctx, cancel := context.WithTimeout(l.ctx, l.timeout)
|
ctx, cancel := context.WithTimeout(l.ctx, l.timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
u, _ := uuid.NewV7()
|
u, err := uuid.NewV7()
|
||||||
|
if err != nil {
|
||||||
|
l.logger.Errorf(ctx, "processTask uuid.NewV7 err:%v, using fallback", err)
|
||||||
|
u = uuid.New()
|
||||||
|
}
|
||||||
|
|
||||||
ctx = context.WithValue(ctx, "trace_id", u.String())
|
ctx = context.WithValue(ctx, "trace_id", u.String())
|
||||||
|
|
||||||
@@ -577,10 +601,12 @@ func (l *Once) processTask(key string) {
|
|||||||
|
|
||||||
// 上报执行情况
|
// 上报执行情况
|
||||||
executeVal := fmt.Sprintf("tid:%s|insId:%s|uuid:%s|time:%s", key, l.instanceId, u.String(), begin.Format(time.RFC3339Nano))
|
executeVal := fmt.Sprintf("tid:%s|insId:%s|uuid:%s|time:%s", key, l.instanceId, u.String(), begin.Format(time.RFC3339Nano))
|
||||||
l.redis.ZAdd(ctx, l.executeInfoKey, redis.Z{
|
if err := l.redis.ZAdd(ctx, l.executeInfoKey, redis.Z{
|
||||||
Score: float64(begin.UnixMilli()),
|
Score: float64(begin.UnixMilli()),
|
||||||
Member: executeVal,
|
Member: executeVal,
|
||||||
})
|
}).Err(); err != nil {
|
||||||
|
l.logger.Errorf(ctx, "processTask ZAdd executeInfo err:%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
@@ -597,7 +623,10 @@ func (l *Once) processTask(key string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ed := extendData{}
|
ed := extendData{}
|
||||||
json.Unmarshal([]byte(str), &ed)
|
if err := json.Unmarshal([]byte(str), &ed); err != nil {
|
||||||
|
l.logger.Errorf(ctx, "processTask json.Unmarshal err:%v key:%s", err, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
resp := l.worker.Worker(ctx, taskType, taskId, ed.Data)
|
resp := l.worker.Worker(ctx, taskType, taskId, ed.Data)
|
||||||
l.logger.Infof(ctx, "processTask exec key:%s resp:%+v data:%s", key, resp, str)
|
l.logger.Infof(ctx, "processTask exec key:%s resp:%+v data:%s", key, resp, str)
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ func WithMaxRetryCount(count int) Option {
|
|||||||
func WithMaxWorkers(count int) Option {
|
func WithMaxWorkers(count int) Option {
|
||||||
return func(o *Options) {
|
return func(o *Options) {
|
||||||
if count < 0 {
|
if count < 0 {
|
||||||
count = 10
|
count = 100
|
||||||
}
|
}
|
||||||
o.maxWorkers = count
|
o.maxWorkers = count
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-2
@@ -18,7 +18,10 @@ type Options struct {
|
|||||||
|
|
||||||
func defaultOptions() Options {
|
func defaultOptions() Options {
|
||||||
|
|
||||||
u, _ := uuid.NewV7()
|
u, err := uuid.NewV7()
|
||||||
|
if err != nil {
|
||||||
|
u = uuid.New()
|
||||||
|
}
|
||||||
|
|
||||||
return Options{
|
return Options{
|
||||||
getInterval: time.Second * 2,
|
getInterval: time.Second * 2,
|
||||||
@@ -47,7 +50,10 @@ func WithLogger(log logger.Logger) Option {
|
|||||||
|
|
||||||
// 更新周期
|
// 更新周期
|
||||||
func WithUpdateInterval(d time.Duration) Option {
|
func WithUpdateInterval(d time.Duration) Option {
|
||||||
if d.Abs() < time.Second {
|
if d <= 0 {
|
||||||
|
d = time.Second * 5
|
||||||
|
}
|
||||||
|
if d < time.Second {
|
||||||
d = time.Second * 5
|
d = time.Second * 5
|
||||||
}
|
}
|
||||||
return func(o *Options) {
|
return func(o *Options) {
|
||||||
|
|||||||
@@ -182,7 +182,10 @@ func (p *Priority) setPriority() (string, error) {
|
|||||||
|
|
||||||
// 解析结果
|
// 解析结果
|
||||||
if resultMap, ok := result.([]interface{}); ok && len(resultMap) == 1 {
|
if resultMap, ok := result.([]interface{}); ok && len(resultMap) == 1 {
|
||||||
resultStr := resultMap[0].(string)
|
resultStr, ok := resultMap[0].(string)
|
||||||
|
if !ok {
|
||||||
|
return "", fmt.Errorf("script unexpected result type: %T", resultMap[0])
|
||||||
|
}
|
||||||
return resultStr, nil
|
return resultStr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ type JobData struct {
|
|||||||
Minute int // 每小时的第几分钟
|
Minute int // 每小时的第几分钟
|
||||||
Second int // 每分钟的第几秒
|
Second int // 每分钟的第几秒
|
||||||
CronExpression string // cron表达式
|
CronExpression string // cron表达式
|
||||||
CronSchedule *cron.Schedule // cron表达式解析后的数据
|
CronSchedule cron.Schedule // cron表达式解析后的数据
|
||||||
}
|
}
|
||||||
|
|
||||||
// 定义各个回调函数
|
// 定义各个回调函数
|
||||||
|
|||||||
Reference in New Issue
Block a user