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