/// <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; } }
/// <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; }
/// <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; } } }