xmachinery
项目地址
介绍
xmachinery 是github.com/RichardKnop/machinery 的扩展包,添加定时任务管理API,扩展支持广播任务
核心代码
定时任务管理
func (server *XServer) registerScheduledTask(task ScheduledTask) error {
//检查cron表达式
schedule, err := secondsParser.Parse(task.Spec)
if err != nil {
return err
}
//移除旧任务
server.removeScheduledTask(task.Id)
//包装任务函数
f := func() {
//抢占任务锁
err := server.machineryLock.LockWithRetries(utils.GetLockName(task.TaskCode, task.Spec), schedule.Next(time.Now()).UnixNano()-1)
if err != nil {
return
}
//创建任务签名
signature := task.Signature()
//发送任务
_, err = server.SendTask(signature)
if err != nil {
log.ERROR.Printf("scheduled task failed. task id is: %s. task name is: %s. error is %s", task.Id, task.TaskCode, err.Error())
}
}
//添加定时任务
entryId, err := server.scheduler.AddFunc(task.Spec, f)
newTask := NewScheduledTask(task.Id, task.TaskCode, task.Spec, task.TaskQueue, task.Args...)
newTask.entryId = entryId
//存储定时任务信息
server.registeredScheduledTasks[task.Id] = newTask
return err
}
广播任务broker
func (b *BrokerBroadcast) nextBroadCastTask(queue string) (result []byte, err error) {
//默认拉取消息间隔为1000ms
pollPeriodMilliseconds := 1000
if b.GetConfig().Redis != nil {
configuredPollPeriod := b.GetConfig().Redis.NormalTasksPollPeriod
if configuredPollPeriod > 0 {
pollPeriodMilliseconds = configuredPollPeriod
}
}
pollPeriod := time.Duration(pollPeri