コード例 #1
0
        private void ReceiveTradeValuationResult(HandlerResponse pvRes)
        {
            var requestId = new Guid(pvRes.RequestId);

            // ignore requests if we are not running
            if (GetState() != BasicServerState.Running)
            {
                return;
            }

            _outstandingRequests.Locked(requests =>
            {
                InternalTradeRevalRequest request;
                if (requests.TryGetValue(requestId, out request))
                {
                    // exists
                    request.LatestResult = pvRes;
                }
                else
                {
                    // not found
                    request             = new InternalTradeRevalRequest(requestId, pvRes);
                    requests[requestId] = request;
                }
            });

            // dispatch worker request
            _workerEventQueue.Dispatch(null);
        }
コード例 #2
0
        private void ReceiveTradeValuationRequest(ICoreItem pvReqItem)
        {
            DateTimeOffset created   = pvReqItem.Created;
            var            pvReq     = (TradeValuationRequest)pvReqItem.Data;
            var            requestId = new Guid(pvReq.RequestId);

            // ignore requests if we are not running
            // ignore requests not processed by this server instance
            if ((GetState() != BasicServerState.Running) ||
                ((requestId.GetHashCode() % ServerFarmSize) != ServerInstance))
            {
                return;
            }

            var newRequest = new InternalTradeRevalRequest(requestId, created, pvReq);
            InternalTradeRevalRequest oldRequest = null;

            _outstandingRequests.Locked(requests =>
            {
                if (requests.TryGetValue(requestId, out oldRequest))
                {
                    // exists
                    newRequest.LatestResult = oldRequest.LatestResult;
                }
                requests[requestId] = newRequest;
            });
            if (oldRequest == null)
            {
                var response = new HandlerResponse
                {
                    RequestId   = pvReq.RequestId,
                    RequesterId = pvReq.RequesterId ?? new UserIdentity {
                        Name = IntClient.Target.ClientInfo.Name, DisplayName = "Unknown"
                    },
                    //RequesterData = pvReq.TradeId,
                    Status = RequestStatusEnum.Received
                };
                _workContext.Cache.SaveObject(response);
            }

            // dispatch worker request
            _workerEventQueue.Dispatch(null);
        }
コード例 #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;
                    InternalTradeRevalRequest activeRequest        = null;
                    DateTimeOffset            oldestRequestCreated = DateTimeOffset.MaxValue;
                    _outstandingRequests.Locked(requests =>
                    {
                        foreach (InternalTradeRevalRequest 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
                        TradeValuationRequest request = activeRequest.Request;
                        try
                        {
                            // run the valuation workflow
                            using (var workflow = new WFCalculateTradeValuation())
                            {
                                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.TradeId,
                                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);
            }
        }