/// <summary> /// 加入延迟队列重试 /// </summary> /// <param name="data"></param> private void ExecuteErrorToDelayTask(RabbitMessageBusData data) { if (data.ErrorCount < _options.MaxErrorReTryCount) { var delay = TimeSpan.FromSeconds(GetDelaySecond(data.ErrorCount)); data.ErrorCount++; data.ErrorGroupId = _groupId; data.ExecuteTimeStamp = DateUtils.GetTimeStamp(DateTime.Now.Add(delay)); var delayData = _options.Serializer.Serialize(data); if (delay > TimeSpan.Zero) { _producer.ProduceDelayAsync(data.Type, delayData, delay); } else //立即重试的情况 { _producer.ErrorReProduceAsync(data.Type, data.ErrorGroupId, delayData); } } }
/// <summary> /// 延迟任务消费处理 三种情况: 1=任务到期进去即时任务,2=任务没有到期 继续进入延迟队列。3=任务到期,是失败重试的任务需要进入单个队列 /// </summary> /// <param name="data"></param> private Task Handler(byte[] data) { var delayMessage = _options.Serializer.Deserialize <RabbitMessageBusData>(data); var delayTime = TimeSpan.FromMilliseconds(delayMessage.ExecuteTimeStamp - DateUtils.GetTimeStamp(DateTime.Now)); if (delayTime > TimeSpan.Zero) {//继续延迟 _producer.ProduceDelayAsync(delayMessage.Type, data, delayTime); } else {//即时任务 if (delayMessage.ErrorCount <= 0) { _producer.ProduceAsync(delayMessage.Type, data); } else //由于错误,需要重试的任务 { _producer.ErrorReProduceAsync(delayMessage.Type, delayMessage.ErrorGroupId, data); } } return(Task.CompletedTask); }