Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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);
     }
 }