Beispiel #1
0
        private async Task SendAllInternalAsync(long maxSize, int maxRetry)
        {
            _loggerService.StartMethod();

            try
            {
                List <EventLog> eventLogList = await _eventLogRepository.GetLogsAsync(maxSize);

                if (eventLogList.Count == 0)
                {
                    _loggerService.Info($"Event-logs not found.");
                    return;
                }

                IDictionary <string, SendEventLogState> eventStateDict = new Dictionary <string, SendEventLogState>();
                foreach (var eventType in EventType.All)
                {
                    eventStateDict[eventType.ToString()] = _sendEventLogStateRepository.GetSendEventLogState(eventType);
                }

                foreach (var eventLog in eventLogList)
                {
                    if (eventStateDict[eventLog.GetEventType()] != SendEventLogState.Enable)
                    {
                        eventLog.HasConsent = false;
                    }
                }

                string          idempotencyKey = Guid.NewGuid().ToString();
                List <EventLog> agreedEventLogList
                    = eventLogList.Where(eventLog => eventLog.HasConsent).ToList();

                if (agreedEventLogList.Count == 0)
                {
                    _loggerService.Info($"Agreed event-logs not found.");
                    return;
                }

                PolicyResult <bool> policyResult = await Policy
                                                   .HandleResult <bool>(result => !result)
                                                   .WaitAndRetryAsync(maxRetry, retryAttempt => {
                    double delay = Math.Pow(2, retryAttempt - 1);
                    _loggerService.Warning($"Event log send failed. retryAttempt:{retryAttempt} delay:{delay}sec");
                    return(TimeSpan.FromSeconds(delay));
                })
                                                   .ExecuteAndCaptureAsync(() => SendAsync(idempotencyKey, agreedEventLogList));

                if (policyResult.Outcome == OutcomeType.Failure)
                {
                    _loggerService.Error("Event log send failed all.");
                    return;
                }

                _loggerService.Info($"Event log send successful.");

                _loggerService.Info($"Clean up...");
                foreach (var eventLog in eventLogList)
                {
                    await _eventLogRepository.RemoveAsync(eventLog);
                }

                _loggerService.Info($"Done.");
            }
            finally
            {
                _loggerService.EndMethod();
            }
        }