async Task HandleApplicationMessageAsync(ProcessingApplicationMessage processingMessage, IApplicationMessageHandler current, BlockingCollection <IApplicationMessageHandler> queue) { var applicationMessage = processingMessage.ApplicationMessage; var applicationMessageType = applicationMessage.GetType(); var handlerType = current.GetType(); var handlerMethod = handlerType.GetTypeInfo().GetMethod("HandleAsync", new[] { applicationMessageType }); var result = await Policy .Handle <Exception>() .OrResult <AsyncExecutedResult>(r => !r.Succeeded) .WaitAndRetryForeverAsync(retryAttempt => TimeSpan.FromSeconds(Math.Pow(1, retryAttempt)), (delegateResult, retryCount, retryAttempt) => logger.LogError(delegateResult.Exception ?? delegateResult.Result.Exception, $"应用消息处理器执行失败。 [ApplicationMessageType = {applicationMessageType}, ApplicationMessageId = {applicationMessage.Id}, ApplicationMessageHandlerType = {handlerType}, RetryCount = {retryCount}, RetryAttempt = {retryAttempt}]")) .ExecuteAsync(() => (Task <AsyncExecutedResult>)handlerMethod.Invoke(current, new object[] { applicationMessage })); if (result.Succeeded) { logger.LogDebug($"应用消息处理器执行成功。 [ApplicationMessageType = {applicationMessageType}, ApplicationMessageId = {applicationMessage.Id}, ApplicationMessageHandlerType = {handlerType}]"); if (!queue.IsCompleted && queue.TryTake(out var next) && next != null) { await HandleApplicationMessageAsync(processingMessage, next, queue); } else { await processingMessage.OnQueueProcessedAsync(); } }
public void Enqueue(ProcessingApplicationMessage processingApplicationMessage) { lock (syncLock) { processingApplicationMessage.Queue = this; queue.TryAdd(processingApplicationMessage); } lastActiveOn = DateTime.UtcNow; TryStart(); }