public Task<RemotingResponse> InvokeAsync(RemotingRequest request, int timeoutMillis = 5000) { EnsureClientStatus(); var taskCompletionSource = new TaskCompletionSource<RemotingResponse>(); var responseFuture = new ResponseFuture(request, timeoutMillis, taskCompletionSource); if (!_responseFutureDict.TryAdd(request.Sequence, responseFuture)) { throw new ResponseFutureAddFailedException(request.Sequence); } _tcpClient.SendAsync(RemotingUtil.BuildRequestMessage(request)); return taskCompletionSource.Task; }
public Task <RemotingResponse> InvokeAsync(RemotingRequest request, int timeoutMillis = 5000) { EnsureClientStatus(); var taskCompletionSource = new TaskCompletionSource <RemotingResponse>(); var responseFuture = new ResponseFuture(request, timeoutMillis, taskCompletionSource); if (!_responseFutureDict.TryAdd(request.Sequence, responseFuture)) { throw new ResponseFutureAddFailedException(request.Sequence); } _tcpClient.SendAsync(RemotingUtil.BuildRequestMessage(request)); return(taskCompletionSource.Task); }
public Task<RemotingResponse> InvokeAsync(RemotingRequest request, int timeoutMillis) { var message = RemotingUtil.BuildRequestMessage(request); var taskCompletionSource = new TaskCompletionSource<RemotingResponse>(); var responseFuture = new ResponseFuture(request, timeoutMillis, taskCompletionSource); if (!_responseFutureDict.TryAdd(request.Sequence, responseFuture)) { throw new Exception(string.Format("Try to add response future failed. request sequence:{0}", request.Sequence)); } try { _clientSocket.SendMessage(message, sendResult => SendMessageCallback(responseFuture, request, _address, sendResult)); } catch (Exception ex) { throw new RemotingSendRequestException(_address, request, ex); } return taskCompletionSource.Task; }
public RemotingResponse InvokeSync(RemotingRequest request, int timeoutMillis) { var message = RemotingUtil.BuildRequestMessage(request); var taskCompletionSource = new TaskCompletionSource<RemotingResponse>(); var responseFuture = new ResponseFuture(request, timeoutMillis, taskCompletionSource); var response = default(RemotingResponse); if (!_responseFutureDict.TryAdd(request.Sequence, responseFuture)) { throw new Exception(string.Format("Try to add response future failed. request sequence:{0}", request.Sequence)); } try { _clientSocket.SendMessage(message, sendResult => SendMessageCallback(responseFuture, request, _address, sendResult)); response = taskCompletionSource.Task.WaitResult<RemotingResponse>(timeoutMillis); } catch (Exception ex) { throw new RemotingSendRequestException(_address, request, ex); } if (response == null) { if (responseFuture.SendRequestSuccess) { throw new RemotingTimeoutException(_address, request, timeoutMillis); } else { throw new RemotingSendRequestException(_address, request, responseFuture.SendException); } } return response; }
private void SendMessageCallback(ResponseFuture responseFuture, RemotingRequest request, string address, SendResult sendResult) { responseFuture.SendRequestSuccess = sendResult.Success; responseFuture.SendException = sendResult.Exception; if (!sendResult.Success) { responseFuture.CompleteRequestTask(null); _responseFutureDict.Remove(request.Sequence); _logger.ErrorFormat("Send request {0} to channel <{1}> failed, exception:{2}", request, address, sendResult.Exception); } }