public void InvokeOneway(RemotingRequest request) { EnsureClientStatus(); request.Type = RemotingRequestType.Oneway; _clientSocket.QueueMessage(RemotingUtils.BuildRequestMessage(request)); }
public void InvokeWithCallback(RemotingRequest request) { EnsureClientStatus(); request.Type = RemotingRequestType.Callback; _clientSocket.QueueMessage(RemotingUtils.BuildRequestMessage(request)); }
public SocketRequestHandlerContext(ITcpConnection connection, Action <byte[]> sendReplyAction) { Connection = connection; SendRemotingResponse = remotingResponse => { sendReplyAction(RemotingUtils.BuildResponseMessage(remotingResponse)); }; }
public Task <RemotingResponse> InvokeAsync(RemotingRequest request, int timeoutMillis) { EnsureClientStatus(); request.Type = RemotingRequestType.Async; var taskCompletionSource = new TaskCompletionSource <RemotingResponse>(); var responseFuture = new ResponseFuture(request, timeoutMillis, taskCompletionSource); if (!_responseFutureDict.TryAdd(request.Sequence, responseFuture)) { throw new ResponseFutureAddFailedException(request.Sequence); } _clientSocket.QueueMessage(RemotingUtils.BuildRequestMessage(request)); return(taskCompletionSource.Task); }
private void HandleRemotingRequest(ITcpConnection connection, byte[] message, Action <byte[]> sendReplyAction) { if (_isShuttingdown) { return; } var remotingRequest = RemotingUtils.ParseRequest(message); var requestHandlerContext = new SocketRequestHandlerContext(connection, sendReplyAction); IRequestHandler requestHandler; if (!_requestHandlerDict.TryGetValue(remotingRequest.Code, out requestHandler)) { var errorMessage = string.Format("No request handler found for remoting request:{0}", remotingRequest); _logger.Error(errorMessage); if (remotingRequest.Type != RemotingRequestType.Oneway) { requestHandlerContext.SendRemotingResponse(new RemotingResponse(remotingRequest.Code, -1, remotingRequest.Type, Encoding.UTF8.GetBytes(errorMessage), remotingRequest.Sequence)); } return; } try { var remotingResponse = requestHandler.HandleRequest(requestHandlerContext, remotingRequest); if (remotingRequest.Type != RemotingRequestType.Oneway && remotingResponse != null) { requestHandlerContext.SendRemotingResponse(remotingResponse); } } catch (Exception ex) { var errorMessage = string.Format("Unknown exception raised when handling remoting request:{0}.", remotingRequest); _logger.Error(errorMessage, ex); if (remotingRequest.Type != RemotingRequestType.Oneway) { requestHandlerContext.SendRemotingResponse(new RemotingResponse(remotingRequest.Code, -1, remotingRequest.Type, Encoding.UTF8.GetBytes(ex.Message), remotingRequest.Sequence)); } } }
private void HandleReplyMessage(ITcpConnection connection, byte[] message) { if (message == null) { return; } var remotingResponse = RemotingUtils.ParseResponse(message); if (remotingResponse.Type == RemotingRequestType.Callback) { IResponseHandler responseHandler; if (_responseHandlerDict.TryGetValue(remotingResponse.RequestCode, out responseHandler)) { responseHandler.HandleResponse(remotingResponse); } else { _logger.ErrorFormat("No response handler found for remoting response:{0}", remotingResponse); } } else if (remotingResponse.Type == RemotingRequestType.Async) { ResponseFuture responseFuture; if (_responseFutureDict.TryRemove(remotingResponse.Sequence, out responseFuture)) { if (responseFuture.SetResponse(remotingResponse)) { if (_logger.IsDebugEnabled) { _logger.DebugFormat("Remoting response back, request code:{0}, requect sequence:{1}, time spent:{2}", responseFuture.Request.Code, responseFuture.Request.Sequence, (DateTime.Now - responseFuture.BeginTime).TotalMilliseconds); } } else { _logger.ErrorFormat("Set remoting response failed, response:" + remotingResponse); } } } }