/// <summary> /// /// </summary> /// <param name="request"></param> private static HandlerResponse ExecuteTradeValuation(PortfolioValuationRequest request) { // create and execute workflow HandlerResponse result; IWorkContext context = new WorkContext(UTE.Logger, Engine.Cache, "UnitTest"); using (var workflow = new WFCalculatePortfolioStressValuation()) { workflow.Initialise(context); WorkflowOutput <HandlerResponse> output = workflow.Execute(request); result = output.Result; WorkflowHelper.ThrowErrors(output.Errors); } return(result); }
private void ReceiveCancellationRequest(ICoreItem item) { //DateTimeOffset created = item.Created; var cancelRequest = (CancellationRequest)item.Data; var requestId = new Guid(cancelRequest.RequestId); // ignore requests if we are not running if (GetState() != BasicServerState.Running) { return; } // get current request and cancel it InternalPortfRevalRequest internalRequest = null; _outstandingRequests.Locked(requests => { if (!requests.TryGetValue(requestId, out internalRequest)) { return; // does not exist or is not ours - just exit } internalRequest.Cancellation = cancelRequest; internalRequest.LatestResult.Status = RequestStatusEnum.Cancelled; }); WFCalculatePortfolioStressValuation workflow = internalRequest.Workflow; workflow?.Cancel(cancelRequest.CancelReason); var response = new HandlerResponse { RequestId = internalRequest.RequestId.ToString(), RequesterId = internalRequest.Request.RequesterId ?? new UserIdentity { Name = IntClient.Target.ClientInfo.Name, DisplayName = "Unknown" }, //RequesterData = internalRequest.Request.PortfolioId, Status = internalRequest.LatestResult.Status }; _workContext.Cache.SaveObject(response); // dispatch worker request _workerEventQueue.Dispatch(null); }
private void DequeueWorkerRequests(object notUsed) { // throttle callbacks to once per timer period DateTime dtNow = DateTime.Now; if ((dtNow - _lastManagedAt) < _requestManagerPeriod) { return; } _lastManagedAt = dtNow; try { // processing algorithm // - find oldest unprocessed (status==received) request and process it bool workToDo = true; while (workToDo && (GetState() == BasicServerState.Running)) { workToDo = false; InternalPortfRevalRequest activeRequest = null; DateTimeOffset oldestRequestCreated = DateTimeOffset.MaxValue; _outstandingRequests.Locked(requests => { foreach (InternalPortfRevalRequest request in requests.Values) { if ((request.LatestResult.Status == RequestStatusEnum.Received) && (request.Created < oldestRequestCreated) && (request.Request != null)) { activeRequest = request; oldestRequestCreated = request.Created; } } if (activeRequest != null) { // we have found a request to process workToDo = true; } }); if (activeRequest != null) { // process request PortfolioValuationRequest request = activeRequest.Request; try { // run the valuation worflow using (var workflow = new WFCalculatePortfolioStressValuation()) { workflow.Initialise(_workContext); activeRequest.Workflow = workflow; _activeWorkflow = workflow; try { WorkflowOutput <HandlerResponse> output = workflow.Execute(request); WorkflowHelper.LogErrors(Logger, output.Errors); } finally { activeRequest.Workflow = null; _activeWorkflow = null; } } } catch (Exception innerExcp) { Logger.Log(innerExcp); // publish 'faulted' result var response = new HandlerResponse { RequestId = request.RequestId, RequesterId = request.RequesterId, //RequesterData = request.PortfolioId, Status = RequestStatusEnum.Faulted, FaultDetail = new ExceptionDetail(innerExcp) }; _workContext.Cache.SaveObject(response); } } } // while there is work to do } catch (Exception outerExcp) { // deserialisation error? Logger.Log(outerExcp); } }
protected override void OnCloseCallback() { WFCalculatePortfolioStressValuation workflow = _activeWorkflow; workflow?.Cancel("Server shutdown"); }