/// <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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
            }
        }
Example #4
0
        protected override void OnCloseCallback()
        {
            WFCalculatePortfolioStressValuation workflow = _activeWorkflow;

            workflow?.Cancel("Server shutdown");
        }