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); }
/// <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); }