Пример #1
0
        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();
        }