public override void Close()
        {
            this.ClientChannel.CloseAsync().GetAwaiter().GetResult();

            this._requestBufferTransport?.Dispose();
            this._responseBufferTransport?.Dispose();

            this._requestBufferTransport  = null;
            this._responseBufferTransport = null;
        }
 public Object Invoke(
     IRequestChannel channel,
     TChannelBufferInputTransport inputTransport,
     TChannelBufferOutputTransport outputTransport,
     TProtocol inputProtocol,
     TProtocol outputProtocol,
     int sequenceId,
     ClientContextChain contextChain,
     params object[] args)
 {
     return(InnerInvoke(channel, inputTransport, outputTransport, inputProtocol, outputProtocol, sequenceId, contextChain, args));
 }
        public TNiftyClientChannelTransport(Type clientType, INiftyClientChannel channel)
        {
            Guard.ArgumentNotNull(clientType, nameof(clientType));
            this._clientClass = clientType;
            this._channel     = channel;

            this._methodNameToOneWay     = new Dictionary <string, bool>();
            this._requestBufferTransport = new TChannelBufferOutputTransport();
            //think: Unpooled 0 是否不需要释放资源?
            this._responseBufferTransport = new TChannelBufferInputTransport(Unpooled.Buffer(0, 0));
            this._queuedResponses         = new ConcurrentQueue <ResponseListener>();
        }
Exemple #4
0
        public Fake(string clientDescription, ThriftClientMetadata clientMetadata, IRequestChannel channel,
                    IEnumerable <ThriftClientEventHandler> immutableList)
        {
            this.Channel            = channel;
            this._clientMetadata    = clientMetadata;
            this._clientDescription = clientDescription;
            this.methodHandlers     = clientMetadata.MethodHandlers;
            this.eventHandlers      = immutableList;

            this._inputTransport  = new TChannelBufferInputTransport();
            this._outputTransport = new TChannelBufferOutputTransport();

            var transportPair = TTransportPair.FromSeparateTransports(this._inputTransport, this._outputTransport);
            var protocolPair  = channel.ProtocolFactory.GetProtocolPair(transportPair);

            this.InputProtocol  = protocolPair.InputProtocol;
            this.OutputProtocol = protocolPair.OutputProtocol;
        }
Exemple #5
0
        private void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    this._inputTransport?.Dispose();
                    this._outputTransport?.Dispose();
                    this.InputProtocol?.Dispose();
                    this._outputTransport?.Dispose();

                    this._inputTransport  = null;
                    this._outputTransport = null;
                    this.InputProtocol    = null;
                    this.OutputProtocol   = null;
                }
                _disposed = true;
            }
        }
 private object InnerInvoke(IRequestChannel channel, TChannelBufferInputTransport inputTransport,
                            TChannelBufferOutputTransport outputTransport, TProtocol inputProtocol, TProtocol outputProtocol, int sequenceId,
                            ClientContextChain contextChain, object[] args)
 {
     if (_invokeAsynchronously)
     {
         // This method declares a Future return value: run it asynchronously
         return(AsynchronousInvoke(channel, inputTransport, outputTransport, inputProtocol, outputProtocol, sequenceId,
                                   contextChain, args));
     }
     else
     {
         try
         {
             // This method declares an immediate return value: run it synchronously
             return(SynchronousInvoke(channel, inputTransport, outputTransport, inputProtocol, outputProtocol,
                                      sequenceId, contextChain, args));
         }
         finally
         {
             contextChain.Done();
         }
     }
 }
        public Task AsynchronousInvoke(
            IRequestChannel channel,
            TChannelBufferInputTransport inputTransport,
            TChannelBufferOutputTransport outputTransport,
            TProtocol inputProtocol,
            TProtocol outputProtocol,
            int sequenceId,
            ClientContextChain contextChain,
            Object[] args)
        {
            //Mark: 微软没有提供 TaskCompletionSource 的非泛型类型,只能使用动态类型处理。
            TaskCompletionSourceEx future;

            if (_successCodec.Type != ThriftType.Void)
            {
                future = new TaskCompletionSourceEx(_successCodec.Type.CSharpType);
            }
            else
            {
                future = new TaskCompletionSourceEx(typeof(Object));
            }
            var requestContext = RequestContexts.GetCurrentContext();

            contextChain.PreWrite(args);
            outputTransport.ResetOutputBuffer();
            WriteArguments(outputProtocol, sequenceId, args);
            IByteBuffer requestBuffer = outputTransport.OutputBuffer.Copy();

            contextChain.PostWrite(args);

            requestBuffer.Retain();
            channel.SendAsynchronousRequest(requestBuffer, false,
                                            new RequestListener(
                                                onRequestSent: reqs =>
            {
                reqs.Release();
                if (this._oneway)
                {
                    try
                    {
                        ForceDoneChain(contextChain);
                        future.TrySetResult(null);
                    }
                    catch (Exception e)
                    {
                        ForceDoneChain(contextChain);
                        future.TrySetException(e);
                    }
                }
            },
                                                onResponseReceive: message =>
            {
                IRequestContext oldRequestContext = RequestContexts.GetCurrentContext();
                RequestContexts.SetCurrentContext(requestContext);
                try
                {
                    contextChain.PreRead();
                    inputTransport.SetInputBuffer(message);
                    WaitForResponse(inputProtocol, sequenceId);
                    Object results = ReadResponse(inputProtocol);
                    contextChain.PostRead(results);
                    ForceDoneChain(contextChain);
                    future.TrySetResult(results);
                }
                catch (Exception e)
                {
                    var wrapException = ThriftClientManager.WrapTException(e);
                    contextChain.PostReadException(e);
                    ForceDoneChain(contextChain);
                    future.TrySetException(wrapException);
                }
                finally
                {
                    RequestContexts.SetCurrentContext(oldRequestContext);
                }
            },
                                                onChannelError: e =>
            {
                if (requestBuffer.ReferenceCount > 0)
                {
                    requestBuffer.Release();
                }

                IRequestContext oldRequestContext = RequestContexts.GetCurrentContext();
                RequestContexts.SetCurrentContext(requestContext);
                try
                {
                    contextChain.PreReadException(e);
                    ForceDoneChain(contextChain);

                    var wrappedException = ThriftClientManager.WrapTException(e);
                    future.TrySetException(wrappedException);
                }
                finally
                {
                    RequestContexts.SetCurrentContext(oldRequestContext);
                }
            }
                                                ));
            return(future.Task);
        }
        private Object SynchronousInvoke(
            IRequestChannel channel,
            TChannelBufferInputTransport inputTransport,
            TChannelBufferOutputTransport outputTransport,
            TProtocol inputProtocol,
            TProtocol outputProtocol,
            int sequenceId,
            ClientContextChain contextChain,
            Object[] args)
        {
            Object results = null;

            // write request
            contextChain.PreWrite(args);
            outputTransport.ResetOutputBuffer();
            WriteArguments(outputProtocol, sequenceId, args);
            // Don't need to copy the output buffer for sync case

            IByteBuffer requestBuffer = outputTransport.OutputBuffer;

            contextChain.PostWrite(args);

            if (!this._oneway)
            {
                IByteBuffer responseBuffer;
                try
                {
                    responseBuffer = SyncClientHelpers.SendSynchronousTwoWayMessage(channel, requestBuffer);
                }
                catch (Exception e)
                {
                    contextChain.PreReadException(e);
                    throw;
                }
                finally
                {
                    requestBuffer.Release();
                }

                // read results
                contextChain.PreRead();
                try
                {
                    inputTransport.SetInputBuffer(responseBuffer);
                    WaitForResponse(inputProtocol, sequenceId);
                    results = ReadResponse(inputProtocol);
                    contextChain.PostRead(results);
                }
                catch (Exception e)
                {
                    contextChain.PostReadException(e);
                    throw;
                }
            }
            else
            {
                try
                {
                    SyncClientHelpers.SendSynchronousOneWayMessage(channel, requestBuffer);
                }
                catch (Exception)
                {
                    throw;
                }
            }

            return(results);
        }