Beispiel #1
0
        /// <summary>
        /// Handles a completed (or failed) request.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnRequestResult(object sender, RequestResultState e)
        {
            Request request = sender as Request;

            if (request != null)
            {
                request.Result -= OnRequestResult;

                if (e == RequestResultState.Success)
                {
                    System.Diagnostics.Debug.WriteLine("Resolver.OnRequestResult(): Request with ID " + request.RequestId + " was successful");

                    if (ActionsResolved != null)
                    {
                        ResolvedActionsEventArgs eventArgs = new ResolvedActionsEventArgs();
                        eventArgs.ResolvedActions = request.ResolvedActions;
                        eventArgs.RequestID = request.RequestId;
                        eventArgs.BeaconEventType = request.BeaconEventArgs.EventType;
                        
                        if (request.BeaconEventArgs != null && request.BeaconEventArgs.Beacon != null)
                        {
                            eventArgs.BeaconPid = request.BeaconEventArgs.Beacon.Pid;
                        }

                        ActionsResolved(this, eventArgs);
                    }
                }
                else if (e == RequestResultState.Failed)
                {
                    System.Diagnostics.Debug.WriteLine("Resolver.OnRequestResult(): Request with ID " + request.RequestId + " failed");

                    if (FailedToResolveActions != null)
                    {
                        FailedToResolveActions(this, request.ErrorMessage);
                    }
                }

                request = null;        
            }
        }
Beispiel #2
0
        /// <summary>
        /// Called when this request has been handled. Notifies any listeners
        /// of the result.
        /// </summary>
        /// <param name="resultState">The request result.</param>
        public void NotifyResult(RequestResultState resultState)
        {
            ResultState = resultState;

            if (Result != null)
            {
                Result(this, ResultState);
            }
        }
        /// <summary>
        /// Sets the request result and removes it from the queue.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="resultState"></param>
        /// <returns>True, if the request was successfully removed from the queue.</returns>
        private bool OnRequestServed(Request request, RequestResultState resultState)
        {
            bool wasRemoved = false;

            if (request != null)
            {
                lock (_listLocker)
                {
                    wasRemoved = _requestList.Remove(request);
                    request.NotifyResult(resultState);

                    if (_requestList.Count == 0 && _serveRequestTimer != null)
                    {
                        _serveRequestTimer.Dispose();
                        _serveRequestTimer = null;
                    }
                    if (QueueCountChanged != null)
                    {
                        QueueCountChanged(this, _requestList.Count);
                    }
                }
            }

            return wasRemoved;
        }
Beispiel #4
0
        /// <summary>
        /// Called when this request has been handled. Notifies any listeners
        /// of the result.
        /// </summary>
        /// <param name="resultState">The request result.</param>
        public void NotifyResult(RequestResultState resultState)
        {
            ResultState = resultState;

            Result?.Invoke(this, ResultState);
        }
        /// <summary>
        /// Called when this request has been handled. Notifies any listeners
        /// of the result.
        /// </summary>
        /// <param name="resultState">The request result.</param>
        public void NotifyResult(RequestResultState resultState)
        {
            ResultState = resultState;

            Result?.Invoke(this, ResultState);
        }
        private async Task Resolve(Request request)
        {
            Logger.Trace("take next request " + request?.RequestId + " " + request?.BeaconEventArgs.EventType);
            if (request == null)
            {
                FailedToResolveActions?.Invoke(this, "request is null");
                return;
            }
            request.TryCount++;

            if (request.BeaconEventArgs.EventType == BeaconEventType.Unknown)
            {
                request.BeaconEventArgs.EventType = BeaconManager.ResolveBeaconState(request.BeaconEventArgs.Beacon);
            }
            Logger.Trace("request resolved " + request.BeaconEventArgs.EventType);

            if (request.BeaconEventArgs.EventType == BeaconEventType.None)
            {
                return;
            }

            if (request.BeaconEventArgs.EventType == BeaconEventType.Enter && EventHistory != null)
            {
                await EventHistory.SaveBeaconEventAsync(request.BeaconEventArgs, request.BeaconEventArgs.Location);
            }


            RequestResultState requestResult = RequestResultState.Failed;

            try
            {
                Logger.Debug("LayoutManager.InternalExecuteRequestAsync(): Request ID is " + request.RequestId);

                if (request.BeaconEventArgs?.Beacon != null && await ServiceManager.LayoutManager.VerifyLayoutAsync() && ServiceManager.LayoutManager.Layout != null)
                {
                    request.ResolvedActions = ServiceManager.LayoutManager.Layout.GetResolvedActionsForPidAndEvent(request);

                    foreach (ResolvedAction resolvedAction in request.ResolvedActions)
                    {
                        if (resolvedAction != null && resolvedAction.BeaconAction != null)
                        {
                            resolvedAction.BeaconAction.Id = request.RequestId;
                        }
                    }

                    requestResult = RequestResultState.Success;
                }
            }
            catch (ArgumentNullException ex)
            {
                request.ErrorMessage = ex.Message;
                requestResult        = RequestResultState.Failed;
            }
            catch (Exception ex)
            {
                request.ErrorMessage = ex.Message;
                requestResult        = RequestResultState.Failed;
            }
            Logger.Debug("request result " + request.RequestId + " " + requestResult);

            switch (requestResult)
            {
            case RequestResultState.Failed:
            {
                if (request.TryCount >= request.MaxNumberOfRetries)
                {
                    Logger.Info("OnRequestServed: Request with ID " + request.RequestId + " failed");

                    FailedToResolveActions?.Invoke(this, request.ErrorMessage);
                }
                else
                {
                    int numberOfTriesLeft = request.MaxNumberOfRetries - request.TryCount;

                    Logger.Debug("RequestQueue.ServeNextRequestAsync(): Request with ID "
                                 + request.RequestId + " failed, will try "
                                 + numberOfTriesLeft + " more " + (numberOfTriesLeft > 1 ? "times" : "time"));

                    await Resolve(request);
                }

                break;
            }

            case RequestResultState.Success:
            {
                if (ActionsResolved != null)
                {
                    ResolvedActionsEventArgs eventArgs = new ResolvedActionsEventArgs();
                    eventArgs.ResolvedActions = request.ResolvedActions;
                    eventArgs.RequestId       = request.RequestId;
                    eventArgs.BeaconEventType = request.BeaconEventArgs.EventType;
                    eventArgs.Location        = await ServiceManager.LocationService.GetGeoHashedLocation();

                    if (request.BeaconEventArgs != null && request.BeaconEventArgs.Beacon != null)
                    {
                        eventArgs.BeaconPid = request.BeaconEventArgs.Beacon.Pid;
                    }

                    ActionsResolved(this, eventArgs);
                }
                break;
            }
            }
        }