public async Task Execute(string messageId, string messageBody)
        {
            this._logger.LogInformation(
                $"{nameof(DataRequestSubscriber)} about to process a message with id of {messageId}");

            var opCtx = this._systemProcessContext.CreateAndStartOperationContext();
            ISystemProcessOperationThirdPartyDataRequestContext dataCtx = null;

            try
            {
                var request = this._serialiser.Deserialise(messageBody);
                dataCtx = opCtx.CreateAndStartDataRequestContext(messageId, request.SystemProcessOperationId);

                if (!this.ValidateDataRequest(request.SystemProcessOperationId))
                {
                    this._logger.LogError(
                        $"{nameof(DataRequestSubscriber)} received a null or empty system process operation id. Exiting");
                    return;
                }

                await this._dataRequestManager.Handle(request.SystemProcessOperationId, dataCtx);
            }
            catch (Exception e)
            {
                dataCtx?.EventError(e.Message);
            }
            finally
            {
                dataCtx?.EndEvent();
                opCtx.EndEvent();

                this._logger.LogInformation(
                    $"{nameof(DataRequestSubscriber)} completed processing a message with id of {messageId}");
            }
        }
 public void Setup()
 {
     _tickPriceHistoryServiceClientFactory = A.Fake <ITickPriceHistoryServiceClientFactory>();
     _refinitivTickPriceHistoryApiConfig   = A.Fake <IRefinitivTickPriceHistoryApiConfig>();
     _requestContext = A.Fake <ISystemProcessOperationThirdPartyDataRequestContext>();
     _logger         = A.Fake <ILogger <IRefinitivDataSynchroniser> >();
 }
 public void Setup()
 {
     this._dataRequestManager = A.Fake <IBmllDataRequestManager>();
     this._filter             = new BmllDataRequestFilter();
     this._requestContext     = A.Fake <ISystemProcessOperationThirdPartyDataRequestContext>();
     this._logger             = A.Fake <ILogger <BmllDataSynchroniser> >();
 }
 public void TearDown()
 {
     _tickPriceHistoryServiceClientFactory = null;
     _refinitivTickPriceHistoryApiConfig   = null;
     _requestContext = null;
     _logger         = null;
 }
        public void Setup()
        {
            this._dataRequestsManager = A.Fake <IFactsetDataRequestsManager>();

            this._requestFilter = A.Fake <IFactsetDataRequestFilter>();
            A.CallTo(() => this._requestFilter.ValidAssetType(A <MarketDataRequest> .Ignored)).Returns(true);

            this._requestContext = A.Fake <ISystemProcessOperationThirdPartyDataRequestContext>();
            this._logger         = A.Fake <ILogger <FactsetDataSynchroniser> >();
        }
예제 #6
0
        public async Task Handle(string systemProcessOperationId, ISystemProcessOperationThirdPartyDataRequestContext dataRequestContext, IReadOnlyCollection <MarketDataRequest> marketDataRequests)
        {
            if (marketDataRequests == null || !marketDataRequests.Any())
            {
                this._logger.LogError($"{nameof(RefinitivDataSynchroniser)} Handle received a null or empty market data request collection");
                return;
            }

            var maxToDate   = marketDataRequests.Select(a => a.UniverseEventTimeTo).Max();
            var minFromDate = marketDataRequests.Select(a => a.UniverseEventTimeFrom).Min();

            if (maxToDate != null && minFromDate != null)
            {
                var request = new GetEodPricingRequest
                {
                    StartUtc   = minFromDate.Value.ToUniversalTime().ToTimestamp(),
                    EndUtc     = maxToDate.Value.ToUniversalTime().ToTimestamp(),
                    PollPeriod = _refinitivTickPriceHistoryApiConfig.RefinitivTickPriceHistoryApiPollingSeconds,
                    TimeOut    = new Duration()
                    {
                        Seconds = _refinitivTickPriceHistoryApiConfig.RefinitivTickPriceHistoryApiTimeOutDurationSeconds
                    },
                };

                var ids = marketDataRequests.Select(req => new SecurityIdentifiers()
                {
                    Ric   = req.Identifiers.Ric,
                    Cusip = req.Identifiers.Cusip,
                    Isin  = req.Identifiers.Isin,
                    Sedol = req.Identifiers.Sedol
                });

                request.Identifiers.AddRange(ids);

                if (request.Identifiers.All(s => s.Ric == null))
                {
                    this._logger.LogError($"{nameof(RefinitivDataSynchroniser)} Handle received a request that didn't have a RIC");
                    return;
                }

                this._logger.LogInformation($"{nameof(RefinitivDataSynchroniser)} Making request for the date range of {request.StartUtc} - {request.EndUtc} using the following RIC identifiers: " +
                                            $"{string.Join(" ", request.Identifiers.Select(s => s.Ric).ToArray())}");

                var tickPriceHistoryServiceClient = _tickPriceHistoryServiceClientFactory.Create();
                await tickPriceHistoryServiceClient.GetEodPricingAsync(request);

                this._logger.LogInformation($"{nameof(RefinitivDataSynchroniser)} Request returned for the date range of {request.StartUtc} - {request.EndUtc} using the following RIC identifiers: " +
                                            $"{string.Join(" ", request.Identifiers.Select(s => s.Ric).ToArray())}");
            }
            else
            {
                this._logger.LogError($"{nameof(RefinitivDataSynchroniser)} Handle received a request collection with no dates");
                return;
            }
        }
 public void Setup()
 {
     this._bmllSynchroniser          = A.Fake <IBmllDataSynchroniser>();
     this._factsetSynchroniser       = A.Fake <IFactsetDataSynchroniser>();
     this._markitSynchroniser        = A.Fake <IMarkitDataSynchroniser>();
     this._dataRequestContext        = A.Fake <ISystemProcessOperationThirdPartyDataRequestContext>();
     this._scheduleRulePublisher     = A.Fake <IScheduleRulePublisher>();
     this._repository                = A.Fake <IRuleRunDataRequestRepository>();
     this._refinitivDataSynchroniser = A.Fake <IRefinitivDataSynchroniser>();
     this._logger = A.Fake <ILogger <DataRequestManager> >();
 }
        public async Task Handle(
            string systemProcessOperationId,
            ISystemProcessOperationThirdPartyDataRequestContext dataRequestContext,
            IReadOnlyCollection <MarketDataRequest> marketDataRequests)
        {
            this._logger.LogInformation($"{nameof(MarkitDataSynchroniser)} Handle processing request");

            this._logger.LogInformation($"{nameof(MarkitDataSynchroniser)} Handle completed processing request");

            await Task.CompletedTask;
        }
        public async Task Handle(
            string systemProcessOperationId,
            ISystemProcessOperationThirdPartyDataRequestContext dataRequestContext,
            IReadOnlyCollection <MarketDataRequest> marketDataRequests)
        {
            this._logger.LogInformation(
                $"{nameof(BmllDataSynchroniser)} Handle began processing a request for {nameof(systemProcessOperationId)} {systemProcessOperationId}");

            if (string.IsNullOrWhiteSpace(systemProcessOperationId))
            {
                this._logger?.LogError(
                    $"{nameof(BmllDataSynchroniser)} Handle received a null or empty system process operation id returning");
                return;
            }

            if (dataRequestContext == null)
            {
                this._logger?.LogError(
                    $"{nameof(BmllDataSynchroniser)} Handle received a null data request context returning");
                return;
            }

            if (marketDataRequests == null || !marketDataRequests.Any())
            {
                this._logger?.LogError(
                    $"{nameof(BmllDataSynchroniser)} Handle received a null or empty market data requests collection");
                return;
            }

            var filteredMarketDataRequests = marketDataRequests.Where(this._filter.ValidAssetType).ToList();

            if (!filteredMarketDataRequests.Any())
            {
                this._logger?.LogInformation(
                    $"{nameof(BmllDataSynchroniser)} Handle received a null or empty market data requests collection");
                return;
            }

            await this._requestManager.Submit(systemProcessOperationId, filteredMarketDataRequests);

            this._logger.LogInformation($"{nameof(BmllDataSynchroniser)} Handle completed processing a request");
        }
        public async Task Handle(
            string systemProcessOperationId,
            ISystemProcessOperationThirdPartyDataRequestContext dataRequestContext,
            IReadOnlyCollection <MarketDataRequest> marketDataRequests)
        {
            if (string.IsNullOrWhiteSpace(systemProcessOperationId))
            {
                this._logger.LogError(
                    $"{nameof(FactsetDataSynchroniser)} Handle received a null or empty system process operation id");
                return;
            }

            if (dataRequestContext == null)
            {
                this._logger.LogError($"{nameof(FactsetDataSynchroniser)} Handle received a null data request context");
                return;
            }

            if (marketDataRequests == null || !marketDataRequests.Any())
            {
                this._logger.LogError(
                    $"{nameof(FactsetDataSynchroniser)} Handle received a null or empty market data request collection");
                return;
            }

            var filteredMarketDataRequests = marketDataRequests.Where(this._requestFilter.ValidAssetType).ToList();

            if (!filteredMarketDataRequests.Any())
            {
                this._logger.LogInformation(
                    $"{nameof(FactsetDataSynchroniser)} Handle received market data requests but none passed the data request filter (equity CFI)");
                return;
            }

            await this._factsetDataRequestsManager.Submit(filteredMarketDataRequests, systemProcessOperationId);
        }
        public async Task Handle(
            string systemProcessOperationId,
            ISystemProcessOperationThirdPartyDataRequestContext dataRequestContext)
        {
            if (string.IsNullOrWhiteSpace(systemProcessOperationId))
            {
                this._logger.LogError(
                    $"{nameof(DataRequestManager)} asked to handle a systemProcessOperationId that had a null or empty id");
                dataRequestContext.EventError("DataRequestManager systemProcessOperationId was null");
                return;
            }

            this._logger.LogInformation(
                $"{nameof(DataRequestManager)} handling request with id {systemProcessOperationId}");

            var dataRequests =
                await this._dataRequestRepository.DataRequestsForSystemOperation(systemProcessOperationId);

            dataRequests = dataRequests ?? new List <MarketDataRequest>();
            this._logger.LogInformation(
                $"handling request with id {systemProcessOperationId} had {dataRequests.Count} data requests to process across all data sources");

            try
            {
                // Equity handling
                var factsetData = dataRequests.Where(
                    _ => _.DataSource == DataSource.Factset || _.DataSource == DataSource.Any ||
                    _.DataSource == DataSource.AnyInterday).ToList();
                this._logger.LogInformation(
                    $"handling request with id {systemProcessOperationId} had {factsetData.Count} factset data requests to process");
                if (factsetData.Any())
                {
                    await this._factsetSynchroniser.Handle(systemProcessOperationId, dataRequestContext, factsetData);
                }

                var bmllData = dataRequests.Where(
                    _ => _.DataSource == DataSource.Bmll || _.DataSource == DataSource.Any ||
                    _.DataSource == DataSource.AnyIntraday).ToList();
                this._logger.LogInformation(
                    $"handling request with id {systemProcessOperationId} had {bmllData.Count} bmll data requests to process");
                if (bmllData.Any())
                {
                    await this._bmllSynchroniser.Handle(systemProcessOperationId, dataRequestContext, bmllData);
                }

                // Fixed income handling
                var refinitivInterdayData = dataRequests.Where(_ => _.DataSource == DataSource.RefinitivInterday).ToList();

                this._logger.LogInformation($"handling request with id {systemProcessOperationId} had {refinitivInterdayData.Count} refinitiv data requests to process");

                if (refinitivInterdayData.Any())
                {
                    await this._refinitivDataSynchroniser.Handle(systemProcessOperationId, dataRequestContext, refinitivInterdayData);
                }

                var markitData = dataRequests.Where(
                    _ => _.DataSource == DataSource.Markit || _.DataSource == DataSource.Any ||
                    _.DataSource == DataSource.AnyInterday ||
                    _.DataSource == DataSource.AnyIntraday).ToList();
                this._logger.LogInformation(
                    $"handling request with id {systemProcessOperationId} had {markitData.Count} markit data requests to process");
                if (markitData.Any())
                {
                    await this._markitSynchroniser.Handle(systemProcessOperationId, dataRequestContext, markitData);
                }
            }
            finally
            {
                if (dataRequests != null && dataRequests.Any())
                {
                    await this._rulePublisher.RescheduleRuleRun(systemProcessOperationId, dataRequests);
                }

                this._logger.LogInformation(
                    $"{nameof(DataRequestManager)} completed handling request with id {systemProcessOperationId}");
            }
        }