/// <summary>
        /// Processes and dispatches the provided <see cref="FeedMessage" /> instance
        /// </summary>
        /// <param name="message">A <see cref="FeedMessage" /> instance to be processed</param>
        /// <param name="interest">A <see cref="MessageInterest"/> specifying the interest of the associated session</param>
        /// <param name="rawMessage">A raw message received from the feed</param>
        public void ProcessMessage(FeedMessage message, MessageInterest interest, byte[] rawMessage)
        {
            Guard.Argument(message, nameof(message)).NotNull();
            Guard.Argument(interest, nameof(interest)).NotNull();

            if (message.IsEventRelated)
            {
                _sportEventStatusCache.AddEventIdForTimelineIgnore(message.EventURN, message.ProducerId, message.GetType());
            }

            // process odds_change
            var oddsChange = message as odds_change;

            if (oddsChange?.sport_event_status != null)
            {
                var status = _mapperFactory.CreateMapper(oddsChange.sport_event_status).Map();
                _cacheManager.SaveDto(oddsChange.EventURN, status, CultureInfo.CurrentCulture, DtoType.SportEventStatus, null);
            }

            var betStop = message as bet_stop;

            if (betStop != null)
            {
                // draw event is still removed
                RemoveCacheItem(betStop.EventURN, removeEvent: false, removeSportEventStatus: true);
            }

            var betSettlement = message as bet_settlement;

            if (betSettlement != null)
            {
                // draw event is still removed
                RemoveCacheItem(betSettlement.EventURN, removeEvent: false, removeSportEventStatus: false);
            }

            // process fixtureChange
            var fixtureChange = message as fixture_change;

            if (fixtureChange != null)
            {
                RemoveCacheItem(fixtureChange.EventURN, removeEvent: true, removeSportEventStatus: true);
                _sportEventCache.AddFixtureTimestamp(fixtureChange.EventURN);

                if (fixtureChange.EventURN.TypeGroup == ResourceTypeGroup.TOURNAMENT)
                {
                    HandleTournamentFixtureChange(fixtureChange.EventURN);
                }

                if (_feedMessageHandler.StopProcessingFixtureChange(fixtureChange))
                {
                    // fixtureChange was already dispatched (via another session)
                    return;
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Processes and dispatches the provided <see cref="FeedMessage" /> instance
        /// </summary>
        /// <param name="message">A <see cref="FeedMessage" /> instance to be processed</param>
        /// <param name="interest">A <see cref="MessageInterest"/> specifying the interest of the associated session</param>
        /// <param name="rawMessage">A raw message received from the feed</param>
        public void ProcessMessage(FeedMessage message, MessageInterest interest, byte[] rawMessage)
        {
            Guard.Argument(message, nameof(message)).NotNull();
            Guard.Argument(interest, nameof(interest)).NotNull();

            // process odds_change
            var oddsChange = message as odds_change;

            if (oddsChange?.sport_event_status != null)
            {
                var status = _mapperFactory.CreateMapper(oddsChange.sport_event_status).Map();
                _cacheManager.SaveDto(oddsChange.EventURN, status, CultureInfo.CurrentCulture, DtoType.SportEventStatus, null);
            }

            var betStop = message as bet_stop;

            if (betStop != null)
            {
                // draw event is still removed
                RemoveCacheItem(betStop.EventURN, removeEvent: false, removeSportEventStatus: true);
            }

            var betSettlement = message as bet_settlement;

            if (betSettlement != null)
            {
                // draw event is still removed
                RemoveCacheItem(betSettlement.EventURN, removeEvent: false, removeSportEventStatus: false);
            }

            // process fixtureChange
            var fixtureChange = message as fixture_change;

            if (fixtureChange != null)
            {
                RemoveCacheItem(fixtureChange.EventURN, removeEvent: true, removeSportEventStatus: true);
                _sportEventCache.AddFixtureTimestamp(fixtureChange.EventURN);

                if (fixtureChange.EventURN.TypeGroup == ResourceTypeGroup.TOURNAMENT)
                {
                    HandleTournamentFixtureChange(fixtureChange.EventURN);
                }

                if (_feedMessageHandler.StopProcessingFixtureChange(fixtureChange))
                {
                    // fixtureChange was already dispatched (via another session)
                    return;
                }
                //ExecutionLog.LogDebug($"{ProcessorId}: processing fixtureChange for id={fixtureChange.EventId}, producer={fixtureChange.ProducerId} and timestamp={fixtureChange.GeneratedAt}.");
            }

            RaiseOnMessageProcessedEvent(new FeedMessageReceivedEventArgs(message, interest, rawMessage));
        }