/// <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);
                }
            }
        }
Exemplo n.º 2
0
        /// <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);
        }