private void StopStreamListenerChildActor(string fixtureId)
        {
            IActorRef streamListenerActor = Context.Child(StreamListenerActor.GetName(fixtureId));

            if (!streamListenerActor.IsNobody())
            {
                Context.Stop(streamListenerActor);
            }
        }
        private void RestartStreamListenerMsgHandler(RestartStreamListenerMsg msg)
        {
            _logger.Info($"Restarting {Context.Self.Path.Name}");

            _shouldSendProcessSportsMessage = true;
            IActorRef streamListenerActor = Context.Child(StreamListenerActor.GetName(msg.FixtureId));

            streamListenerActor.Tell(new StopStreamingMsg());
        }
Example #3
0
        //this is used to ensure we don't get blocked in Busy state
        //so we process self scheduled message at predefined interval to check/update the actor state and flags
        private void CheckStreamListenerBuilderActorStateMsgHandler(CheckStreamListenerBuilderActorStateMsg msg)
        {
            List <string> fixtureIdList = _creationInProgressFixtureIdSet.ToList();

            foreach (var fixtureId in fixtureIdList)
            {
                var streamListenerActorName = StreamListenerActor.GetName(fixtureId);
                var streamListenerActorRef  = _streamListenerManagerActorContext.Child(streamListenerActorName);
                if (streamListenerActorRef.IsNobody())
                {
                    _logger.Debug(
                        $"CheckStreamListenerBuilderActorStateMsgHandler" +
                        $" - fixtureId={fixtureId}" +
                        $" - StreamListenerActor instance doesn't exist. Going to remove it from the internal state.");
                    RemoveFixtureFromSet(fixtureId);
                }
                else
                {
                    StreamListenerState?streamListenerActorState;
                    try
                    {
                        streamListenerActorState = streamListenerActorRef
                                                   .Ask <StreamListenerState>(
                            new GetStreamListenerActorStateMsg(),
                            TimeSpan.FromSeconds(30))
                                                   .Result;
                    }
                    catch (Exception)
                    {
                        //if we haven't heard back from StreamListenerActor then we can't identify it's state
                        streamListenerActorState = null;
                    }

                    if (streamListenerActorState.HasValue &&
                        streamListenerActorState.Value != StreamListenerState.Initializing)
                    {
                        RemoveFixtureFromSet(fixtureId);
                    }

                    _logger.Debug(
                        $"CheckStreamListenerBuilderActorStateMsgHandler" +
                        $" - fixtureId={fixtureId}" +
                        $" - streamListenerActorState={streamListenerActorState?.ToString() ?? "null"}" +
                        $" - StreamListenerActor instance has already been created");
                }
            }

            CheckActiveState();

            _logger.Debug(
                $"CheckStreamListenerBuilderActorStateMsgHandler completed" +
                $" - _creationInProgressFixtureIdSetCount={_creationInProgressFixtureIdSet.Count} items");
        }
        private void StreamConnectedMsgHandler(StreamConnectedMsg msg)
        {
            IActorRef streamListenerActor = Context.Child(StreamListenerActor.GetName(msg.FixtureId));

            Context.Watch(streamListenerActor);

            _streamListenerBuilderActorRef.Tell(new StreamListenerCreationCompletedMsg
            {
                FixtureId     = msg.FixtureId,
                FixtureStatus = msg.FixtureStatus
            });
        }
Example #5
0
        private void BuildStreamListenerActorInstance(object msg, IResourceFacade resource)
        {
            var streamListenerActorName = StreamListenerActor.GetName(resource.Id);

            if (_streamListenerManagerActorContext.Child(streamListenerActorName).IsNobody())
            {
                if (_creationInProgressFixtureIdSet.Count + 1 > _settings.FixtureCreationConcurrency)
                {
                    _logger.Warn(
                        $"BuildStreamListenerActorInstance - {resource}" +
                        $" - {msg.GetType().Name}" +
                        $" - fixture creation concurrency limit of {_settings.FixtureCreationConcurrency} has been reached" +
                        $" - Moving to Busy State" +
                        $" - _creationInProgressFixtureIdSetCount={_creationInProgressFixtureIdSet.Count} items");
                    Become(Busy);
                    Self.Tell(msg);
                }
                else
                {
                    _logger.Debug(
                        $"BuildStreamListenerActorInstance - {resource} with MatchStatus={resource.MatchStatus}" +
                        $" - {msg.GetType().Name}" +
                        $" - _creationInProgressFixtureIdSetCount={_creationInProgressFixtureIdSet.Count} items" +
                        $" - Going to create the Stream Listener Actor Instance");

                    _streamListenerManagerActorContext.ActorOf(Props.Create(() =>
                                                                            new StreamListenerActor(
                                                                                _settings,
                                                                                _adapterPlugin,
                                                                                resource,
                                                                                _stateManager,
                                                                                _suspensionManager,
                                                                                _streamHealthCheckValidation,
                                                                                _fixtureValidation)),
                                                               streamListenerActorName);

                    if (!_creationInProgressFixtureIdSet.Contains(resource.Id))
                    {
                        _creationInProgressFixtureIdSet.Add(resource.Id);
                    }
                }
            }
            else
            {
                _logger.Debug(
                    $"BuildStreamListenerActorInstance - {resource}" +
                    $" - {msg.GetType().Name}" +
                    $" - StreamListenerActor instance not created as existing instance has been found");
            }
        }
        private void FaultControllerActorOnErrorOcured(SdkErrorMessage sdkErrorArgs)
        {
            if (sdkErrorArgs.ShouldSuspend)
            {
                _logger.Warn($"SDK Error occured, all Fixtures will be suspended {sdkErrorArgs.ErrorMessage}");

                var streamListeners = _streamListeners.Values.SelectMany(_ => _.Keys);

                foreach (var sl in streamListeners)
                {
                    IActorRef streamListenerActor = Context.Child(StreamListenerActor.GetName(sl));
                    streamListenerActor.Tell(new SuspendMessage(SuspensionReason.SDK_ERROR));
                }
            }
        }
        private void ProcessResourceMsgHandler(ProcessResourceMsg msg)
        {
            _logger.Info(
                $"ProcessResourceMsgHandler for {msg.Resource} Epoch={msg.Resource.Content?.MatchStatus}{(msg.Resource.IsMatchOver ? $" isMatchOver=true": "")}");


            if (msg.Resource.Content == null)
            {
                _logger.Info($"ProcessResourceMsgHandler for {msg.Resource} content=NULL terminating");
                return;
            }

            IActorRef streamListenerActor = Context.Child(StreamListenerActor.GetName(msg.Resource.Id));

            if (streamListenerActor.IsNobody())
            {
                var fixtureState = GetFixtureState(msg.Resource);
                if (fixtureState != null && fixtureState.Sequence > msg.Resource.Content.Sequence)
                {
                    _logger.Info($"ProcessResourceMsgHandler for {msg.Resource} message is too old: messageSequence={msg.Resource.Content.Sequence} stateSequence={fixtureState.Sequence} terminating");
                    return;
                }

                _logger.Info(
                    $"Stream listener for {msg.Resource} doesn't exist. Going to trigger creation.");
                _streamListenerBuilderActorRef.Tell(new CreateStreamListenerMsg {
                    Resource = msg.Resource
                });
            }
            else
            {
                _logger.Info(
                    $"Stream listener for {msg.Resource} already exists. Going to trigger stream health check.");
                streamListenerActor.Tell(new StreamHealthCheckMsg {
                    Resource = msg.Resource, Time = DateTime.Now
                });
            }
        }
        private void ProcessResourceMsgHandler(ProcessResourceMsg msg)
        {
            _logger.Info(
                $"ProcessResourceMsgHandler for {msg.Resource} Epoch={msg.Resource.Content.MatchStatus}");
            IActorRef streamListenerActor = Context.Child(StreamListenerActor.GetName(msg.Resource.Id));

            if (streamListenerActor.IsNobody())
            {
                _logger.Info(
                    $"Stream listener for {msg.Resource} doesn't exist. Going to trigger creation.");
                _streamListenerBuilderActorRef.Tell(new CreateStreamListenerMsg {
                    Resource = msg.Resource
                });
            }
            else
            {
                _logger.Info(
                    $"Stream listener for {msg.Resource} already exists. Going to trigger stream health check.");
                streamListenerActor.Tell(new StreamHealthCheckMsg {
                    Resource = msg.Resource
                });
            }
        }
        private void ClearFixtureStateMsgHandler(ClearFixtureStateMsg msg)
        {
            IActorRef streamListenerActor = Context.Child(StreamListenerActor.GetName(msg.FixtureId));

            streamListenerActor.Tell(msg);
        }
        private void RetrieveAndProcessSnapshotMsgHandler(RetrieveAndProcessSnapshotMsg msg)
        {
            IActorRef streamListenerActor = Context.Child(StreamListenerActor.GetName(msg.FixtureId));

            streamListenerActor.Tell(msg);
        }