public async Task ProfileBatches(IBatchProfilingContext batchProfilingContext)
        {
            Guard.ArgumentNotNull(batchProfilingContext, nameof(batchProfilingContext));

            batchProfilingContext.InitialiseItems(1, _options.BatchSize);

            IProducerConsumer producerConsumer = _producerConsumerFactory.CreateProducerConsumer(ProduceBatchProfileRequests,
                                                                                                 ProfileBatchRequests,
                                                                                                 10,
                                                                                                 _options.ConsumerCount,
                                                                                                 _logger);

            await producerConsumer.Run(batchProfilingContext);
        }
        private async Task IndexSpecifications <TSourceItem>(IEnumerable <TSourceItem> specifications)
        {
            IEnumerable <SpecificationIndex> searchIndices = GetSearchIndices(specifications);

            PagedContext <SpecificationIndex> context = new PagedContext <SpecificationIndex>(searchIndices);

            IProducerConsumer producerConsumer = _producerConsumerFactory.CreateProducerConsumer(ProduceSpecificationIndices,
                                                                                                 IndexSpecifications,
                                                                                                 20,
                                                                                                 1,
                                                                                                 _logger);

            await producerConsumer.Run(context);
        }
        public async Task ImportData(string specificationId,
                                     string fundingStreamId,
                                     SchemaContext schemaContext)
        {
            ISqlImportContext importContext = await _sqlImportContextBuilder.CreateImportContext(specificationId, fundingStreamId, schemaContext);

            IProducerConsumer producerConsumer = _producerConsumerFactory.CreateProducerConsumer(ProducePublishedProviders,
                                                                                                 PopulateDataTables,
                                                                                                 7,
                                                                                                 5,
                                                                                                 _logger);

            await producerConsumer.Run(importContext);

            await RunBulkImports(importContext);
        }
        public async Task <IActionResult> ProcessProfileAllocationBatchRequest(ProfileBatchRequest profileBatchRequest)
        {
            Guard.ArgumentNotNull(profileBatchRequest, nameof(ProfileBatchRequest));

            ValidationResult validationResult = await _batchRequestValidation.ValidateAsync(profileBatchRequest);

            if (!validationResult.IsValid)
            {
                return(validationResult.AsBadRequest());
            }

            try
            {
                FundingStreamPeriodProfilePattern profilePattern = await GetProfilePattern(profileBatchRequest);

                if (profilePattern == null)
                {
                    _logger.Error("Unable to find profile pattern for FundingStream = {fundingStreamId}, FundingPeriodId={FundingPeriodId}, FundingLineCode={FundingLineCode}, ProfilePatternKey={ProfilePatternKey}, ProviderType={ProviderType}, ProviderSubType={ProviderSubType}",
                                  profileBatchRequest.FundingStreamId,
                                  profileBatchRequest.FundingPeriodId,
                                  profileBatchRequest.FundingLineCode,
                                  profileBatchRequest.ProfilePatternKey,
                                  profileBatchRequest.ProviderType,
                                  profileBatchRequest.ProviderSubType);
                }

                BatchProfileRequestContext batchProfileRequestContext = new BatchProfileRequestContext(profilePattern,
                                                                                                       profileBatchRequest,
                                                                                                       5);

                IProducerConsumer producerConsumer = _producerConsumerFactory.CreateProducerConsumer(ProduceProviderFundingValues,
                                                                                                     ProfileProviderFundingValues,
                                                                                                     10,
                                                                                                     10,
                                                                                                     _logger);

                await producerConsumer.Run(batchProfileRequestContext);

                return(new OkObjectResult(batchProfileRequestContext.Responses.ToArray()));
            }
            catch (Exception ex)
            {
                LogError(ex, profileBatchRequest);

                throw;
            }
        }