Exemplo n.º 1
0
        private async Task <BmllStatusMinuteBarResult> BlockUntilBmllWorkIsDone(
            IReadOnlyCollection <MinuteBarRequestKeyDto> keys)
        {
            this._logger.LogInformation($"{nameof(BmllDataRequestsApiManager)} BlockUntilBmllWorkIsDone active");

            var policyWrap = this._policyFactory.PolicyTimeoutGeneric <BmllStatusMinuteBarResult>(
                TimeSpan.FromMinutes(30),
                i => i == BmllStatusMinuteBarResult.InProgress,
                9,
                TimeSpan.FromMinutes(1));

            var minuteBarResult = BmllStatusMinuteBarResult.InProgress;
            var request         = new GetMinuteBarRequestStatusesRequest {
                Keys = keys?.ToList()
            };

            await policyWrap.ExecuteAsync(
                async() =>
            {
                minuteBarResult = await this._timeBarRepository.StatusMinuteBarsAsync(request);

                return(minuteBarResult);
            });

            this._logger.LogInformation($"{nameof(BmllDataRequestsApiManager)} BlockUntilBmllWorkIsDone completed");

            return(minuteBarResult);
        }
Exemplo n.º 2
0
        /// <summary>
        /// The status minute bars async.
        /// </summary>
        /// <param name="statusCommand">
        /// The status command.
        /// </param>
        /// <returns>
        /// The <see cref="Task"/>.
        /// </returns>
        public async Task <BmllStatusMinuteBarResult> StatusMinuteBarsAsync(GetMinuteBarRequestStatusesRequest statusCommand)
        {
            if (statusCommand == null || statusCommand.Keys == null || !statusCommand.Keys.Any())
            {
                this.logger.LogError(
                    "BmllTimeBarApiRepository StatusMinuteBars was passed 0 keys to request. Returning early with success.");
                return(BmllStatusMinuteBarResult.Completed);
            }

            this.logger.LogInformation(
                $"BmllTimeBarApiRepository StatusMinuteBars received {statusCommand.Keys.Count} keys to query BMLL for");

            try
            {
                using (var httpClient =
                           this.httpClientFactory.GenericHttpClient(this.apiClientConfiguration.BmllServiceUrl))
                {
                    var json   = JsonConvert.SerializeObject(statusCommand);
                    var policy = this.policyFactory.PolicyTimeoutGeneric <HttpResponseMessage>(
                        TimeSpan.FromMinutes(30),
                        i => !i.IsSuccessStatusCode,
                        3,
                        TimeSpan.FromMinutes(1));

                    HttpResponseMessage response = null;
                    await policy.ExecuteAsync(
                        async() =>
                    {
                        response = await httpClient.PostAsync(
                            StatusRoute,
                            new StringContent(json, Encoding.UTF8, "application/json"));
                        this.logger.LogInformation(
                            "StatusMinuteBars policy received post response or timed out");
                        return(response);
                    });

                    if (response == null || !response.IsSuccessStatusCode)
                    {
                        this.logger.LogError(
                            $"BmllTimeBarApiRepository StatusMinuteBars Unsuccessful bmll time bar api repository GET request. {response?.StatusCode}");
                        return(BmllStatusMinuteBarResult.InProgress);
                    }

                    var jsonResponse = await response.Content.ReadAsStringAsync();

                    var deserialisedResponse =
                        JsonConvert.DeserializeObject <GetMinuteBarRequestStatusesResponse>(jsonResponse);

                    if (deserialisedResponse == null)
                    {
                        this.logger.LogError(
                            "BmllTimeBarApiRepository StatusMinuteBars was unable to deserialise the response");
                        return(BmllStatusMinuteBarResult.InProgress);
                    }

                    this.logger.LogInformation(
                        "BmllTimeBarApiRepository StatusMinuteBars returning deserialised GET response");

                    var acceptedRequests = new[]
                    {
                        MinuteBarRequestStatus.Completed, MinuteBarRequestStatus.Failed,
                        MinuteBarRequestStatus.NotFound,
                        MinuteBarRequestStatus
                        .Requeued        // agreed with test team to ignore requeuing until we do further work on the BMLL service
                    };

                    var completed = deserialisedResponse.Statuses.All(i => acceptedRequests.Contains(i.Status));

                    if (!completed)
                    {
                        return(BmllStatusMinuteBarResult.InProgress);
                    }

                    if (deserialisedResponse.Statuses.Any(i => i.Status == MinuteBarRequestStatus.Failed))
                    {
                        return(BmllStatusMinuteBarResult.CompletedWithFailures);
                    }

                    return(BmllStatusMinuteBarResult.Completed);
                }
            }
            catch (Exception e)
            {
                this.logger?.LogError(e, "BmllTimeBarApiRepository StatusMinuteBars encountered an exception");
            }

            this.logger.LogInformation(
                $"BmllTimeBarApiRepository StatusMinuteBars completed request for {statusCommand.Keys.Count} keys to query BMLL for");

            return(BmllStatusMinuteBarResult.InProgress);
        }