private async Task <List <TimeSpan> > Execute() { List <TimeSpan> nextExecuteDelays = new List <TimeSpan>(); //记录每个任务的下次执行时间,取最小的等待 if (_taskExecutor.GetTaskCount() > _options.Backlog) { _logger.LogWarning($"Aix.ScheduleTask定时任务积压太多超过{_options.Backlog}条定时任务待处理"); await Task.Delay(TimeSpan.FromSeconds(5)); return(nextExecuteDelays); } var now = DateTimeUtils.GetTimeStamp(); var taskList = await _aixScheduleTaskRepository.QueryAllEnabled(PreReadSecond * 1000 + now); //拉取即将到期的任务 提前{PreReadSecond}秒 //逐个处理 foreach (var task in taskList) { _scheduleTaskLifetime.ScheduleTaskStopping.ThrowIfCancellationRequested(); var Schedule = CrontabHelper.ParseCron(_logger, task); if (task.LastExecuteTime == 0) { task.LastExecuteTime = now; //任务第一次执行时,从当前时间开始 } var nextExecuteTimeSpan = CrontabHelper.GetNextDueTime(Schedule, DateTimeUtils.TimeStampToDateTime(task.LastExecuteTime), DateTimeUtils.TimeStampToDateTime(now)); if (nextExecuteTimeSpan <= TimeSpan.Zero) //时间到了,开始执行任务 { if (nextExecuteTimeSpan >= TimeSpan.FromSeconds(0 - PreReadSecond)) //排除过期太久的,(服务停了好久,再启动这些就不执行了) { await _scheduleTaskExecutor.Trigger(task, TimeSpan.Zero); // } now = DateTimeUtils.GetTimeStamp(); task.LastExecuteTime = now; //计算下一次执行时间 nextExecuteTimeSpan = CrontabHelper.GetNextDueTime(Schedule, DateTimeUtils.TimeStampToDateTime(task.LastExecuteTime), DateTimeUtils.TimeStampToDateTime(now)); task.NextExecuteTime = now + (long)nextExecuteTimeSpan.TotalMilliseconds; task.ModifyTime = DateTime.Now; await _aixScheduleTaskRepository.UpdateAsync(task); } if (task.NextExecuteTime == 0) //只有第一次且未执行时更新下即可 { task.NextExecuteTime = now + (long)nextExecuteTimeSpan.TotalMilliseconds; task.ModifyTime = DateTime.Now; await _aixScheduleTaskRepository.UpdateAsync(task); } nextExecuteDelays.Add(nextExecuteTimeSpan); } return(nextExecuteDelays); }
public async Task Execute(BackgroundProcessContext context) { if (_taskExecutor.GetTaskCount() > _options.TaskExecutorMaxTaskCount) //队列任务积压超过1000就不要再拉取了,不然也处理不过来 { await TaskEx.DelayNoException(TimeSpan.FromMilliseconds(_options.ConsumePullIntervalMillisecond), context.CancellationToken); return; } //// >:读取未分配给其他消费者的消息(未被拉去的) 0-0或id: 读取pending 中的消息 var list = await _database.StreamReadGroupAsync(_topic, _groupName, _consumerName, ">", BatchCount); if (list.Length == 0) { await TaskEx.DelayNoException(TimeSpan.FromMilliseconds(_options.ConsumePullIntervalMillisecond), context.CancellationToken); return; } await ProcessList(list, true); }