public async Task <Acknowledgement> DispatchAsync <TMessage, TAsyncConsumer>(TMessage message, RetryMessageContext retryMessageContext) where TMessage : class where TAsyncConsumer : class, IConsumeAsync <TMessage> { Stopwatch stopwatch = Stopwatch.StartNew(); Dictionary <string, long> stepDic = new Dictionary <string, long>(); using (var scope = _serviceProvider.CreateScope()) { var consumer = scope.ServiceProvider.GetService <IConsumeAsync <TMessage> >(); if (consumer == null) { _logger.LogWarning($"类型{typeof(TAsyncConsumer).Name} 找不到实现"); return(new Ack()); } try { stepDic.Add("创建handler", stopwatch.ElapsedMilliseconds); var unitOfWorkAttr = consumer.GetType().GetMethod(nameof(IConsumeAsync <TMessage> .ConsumeAsync)).GetCustomAttribute <UnitOfWorkAttribute>(); stepDic.Add("获取UnitOfWorkAttribute", stopwatch.ElapsedMilliseconds); IUnitOfWork unifOfWork = null; if (unitOfWorkAttr != null) { unifOfWork = scope.ServiceProvider.GetService <IUnitOfWork>(); if (unitOfWorkAttr.IsTransactional) { unifOfWork.Begin(unitOfWorkAttr.IsolationLevel); } } stepDic.Add("开启工作单元", stopwatch.ElapsedMilliseconds); await consumer.ConsumeAsync(message).ConfigureAwait(false); stepDic.Add("执行handler", stopwatch.ElapsedMilliseconds); if (unifOfWork != null) { await unifOfWork.CompleteAsync(); } stepDic.Add("提交工作单元", stopwatch.ElapsedMilliseconds); } catch (Exception ex) { if (_needAckExceptionTypes.Contains(ex.GetType())) { return(new Ack()); } if (retryMessageContext.RetryInfo.NumberOfRetries < _retryCount - 1) { var timespan = _rertyIntervalFunc.Invoke(retryMessageContext.RetryInfo.NumberOfRetries); _logger.LogError(ex, $"message:{Newtonsoft.Json.JsonConvert.SerializeObject(message)},类型{typeof(TAsyncConsumer).Name}消息处理发生了异常,当前重试次数{retryMessageContext.RetryInfo.NumberOfRetries},将在{timespan.TotalSeconds}秒后重试"); return(Retry.In(timespan)); } else { _logger.LogError(ex, $"message:{Newtonsoft.Json.JsonConvert.SerializeObject(message)},类型{typeof(TAsyncConsumer).Name}消息处理失败,重试次数{retryMessageContext.RetryInfo.NumberOfRetries},消息不再重试"); return(new Ack()); } } } if (stopwatch.ElapsedMilliseconds > _logForMinExecutionDuration && _logger.IsEnabled(LogLevel.Information)) { var log = new { MessageType = typeof(TMessage).Name, RetryTimes = retryMessageContext.RetryInfo.NumberOfRetries, Context = message, Step = stepDic }; var json = Newtonsoft.Json.JsonConvert.SerializeObject(log); stopwatch.Stop(); _logger.LogInformation($"{json} LastStep:{stopwatch.ElapsedMilliseconds}"); } return(new Ack()); }
private static async Task <Acknowledgement> ServerValuesAsync(EmailLowPriority message, RetryMessageContext ctx) { var aMessage = message; var aCtx = ctx; await File.ReadAllTextAsync("rawrabbit.json"); Console.WriteLine("---------------------------------------------"); Console.WriteLine("Before Retry --------------------------------"); return(Retry.In(TimeSpan.FromSeconds(10))); }