Package io.grpc.netty

Class NettyClientTransport

java.lang.Object
io.grpc.netty.NettyClientTransport
All Implemented Interfaces:
ClientTransport, ConnectionClientTransport, ManagedClientTransport, InternalInstrumented<InternalChannelz.SocketStats>, InternalWithLogId

class NettyClientTransport extends Object implements ConnectionClientTransport
A Netty-based ConnectionClientTransport implementation.
  • Field Details

    • logId

      private final InternalLogId logId
    • channelOptions

      private final Map<io.netty.channel.ChannelOption<?>,?> channelOptions
    • remoteAddress

      private final SocketAddress remoteAddress
    • channelFactory

      private final io.netty.channel.ChannelFactory<? extends io.netty.channel.Channel> channelFactory
    • group

      private final io.netty.channel.EventLoopGroup group
    • negotiator

      private final ProtocolNegotiator negotiator
    • authorityString

      private final String authorityString
    • authority

      private final io.netty.util.AsciiString authority
    • userAgent

      private final io.netty.util.AsciiString userAgent
    • autoFlowControl

      private final boolean autoFlowControl
    • flowControlWindow

      private final int flowControlWindow
    • maxMessageSize

      private final int maxMessageSize
    • maxHeaderListSize

      private final int maxHeaderListSize
    • keepAliveManager

      private KeepAliveManager keepAliveManager
    • keepAliveTimeNanos

      private final long keepAliveTimeNanos
    • keepAliveTimeoutNanos

      private final long keepAliveTimeoutNanos
    • keepAliveWithoutCalls

      private final boolean keepAliveWithoutCalls
    • negotiationScheme

      private final io.netty.util.AsciiString negotiationScheme
    • tooManyPingsRunnable

      private final Runnable tooManyPingsRunnable
    • handler

      private NettyClientHandler handler
    • channel

      private io.netty.channel.Channel channel
    • statusExplainingWhyTheChannelIsNull

      private Status statusExplainingWhyTheChannelIsNull
      If start(io.grpc.internal.ManagedClientTransport.Listener) has been called, non-null if channel is null.
    • lifecycleManager

      private ClientTransportLifecycleManager lifecycleManager
      Since not thread-safe, may only be used from event loop.
    • transportTracer

      private final TransportTracer transportTracer
      Since not thread-safe, may only be used from event loop.
    • eagAttributes

      private final Attributes eagAttributes
    • localSocketPicker

      private final NettyChannelBuilder.LocalSocketPicker localSocketPicker
    • channelLogger

      private final ChannelLogger channelLogger
    • useGetForSafeMethods

      private final boolean useGetForSafeMethods
    • ticker

      private final com.google.common.base.Ticker ticker
  • Constructor Details

    • NettyClientTransport

      NettyClientTransport(SocketAddress address, io.netty.channel.ChannelFactory<? extends io.netty.channel.Channel> channelFactory, Map<io.netty.channel.ChannelOption<?>,?> channelOptions, io.netty.channel.EventLoopGroup group, ProtocolNegotiator negotiator, boolean autoFlowControl, int flowControlWindow, int maxMessageSize, int maxHeaderListSize, long keepAliveTimeNanos, long keepAliveTimeoutNanos, boolean keepAliveWithoutCalls, String authority, @Nullable String userAgent, Runnable tooManyPingsRunnable, TransportTracer transportTracer, Attributes eagAttributes, NettyChannelBuilder.LocalSocketPicker localSocketPicker, ChannelLogger channelLogger, boolean useGetForSafeMethods, com.google.common.base.Ticker ticker)
  • Method Details

    • ping

      public void ping(ClientTransport.PingCallback callback, Executor executor)
      Description copied from interface: ClientTransport
      Pings a remote endpoint. When an acknowledgement is received, the given callback will be invoked using the given executor.

      Pings are not necessarily sent to the same endpoint, thus a successful ping only means at least one endpoint responded, but doesn't imply the availability of other endpoints (if there is any).

      This is an optional method. Transports that do not have any mechanism by which to ping the remote endpoint may throw UnsupportedOperationException.

      Specified by:
      ping in interface ClientTransport
    • newStream

      public ClientStream newStream(MethodDescriptor<?,?> method, Metadata headers, CallOptions callOptions, ClientStreamTracer[] tracers)
      Description copied from interface: ClientTransport
      Creates a new stream for sending messages to a remote end-point.

      This method returns immediately and does not wait for any validation of the request. If creation fails for any reason, ClientStreamListener.closed(io.grpc.Status, io.grpc.internal.ClientStreamListener.RpcProgress, io.grpc.Metadata) will be called to provide the error information. Any sent messages for this stream will be buffered until creation has completed (either successfully or unsuccessfully).

      This method is called under the Context of the ClientCall.

      Specified by:
      newStream in interface ClientTransport
      Parameters:
      method - the descriptor of the remote method to be called for this stream.
      headers - to send at the beginning of the call
      callOptions - runtime options of the call
      tracers - a non-empty array of tracers. The last element in it is reserved to be set by the load balancer's pick result and otherwise is a no-op tracer.
      Returns:
      the newly created stream.
    • start

      public Runnable start(ManagedClientTransport.Listener transportListener)
      Description copied from interface: ManagedClientTransport
      Starts transport. This method may only be called once.

      This method and the returned Runnable should not throw any exceptions.

      Specified by:
      start in interface ManagedClientTransport
      Parameters:
      transportListener - non-null listener of transport events
      Returns:
      a Runnable that is executed after-the-fact by the original caller, typically after locks are released
    • shutdown

      public void shutdown(Status reason)
      Description copied from interface: ManagedClientTransport
      Initiates an orderly shutdown of the transport. Existing streams continue, but the transport will not own any new streams. New streams will either fail (once ManagedClientTransport.Listener.transportShutdown(io.grpc.Status) callback called), or be transferred off this transport (in which case they may succeed). This method may only be called once.
      Specified by:
      shutdown in interface ManagedClientTransport
    • shutdownNow

      public void shutdownNow(Status reason)
      Description copied from interface: ManagedClientTransport
      Initiates a forceful shutdown in which preexisting and new calls are closed. Existing calls should be closed with the provided reason.
      Specified by:
      shutdownNow in interface ManagedClientTransport
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • getLogId

      public InternalLogId getLogId()
      Description copied from interface: InternalWithLogId
      Returns an ID that is primarily used in debug logs. It usually contains the class name and a numeric ID that is unique among the instances.

      The subclasses of this interface usually want to include the log ID in their Object.toString() results.

      Specified by:
      getLogId in interface InternalWithLogId
    • getAttributes

      public Attributes getAttributes()
      Description copied from interface: ConnectionClientTransport
      Returns a set of attributes, which may vary depending on the state of the transport. The keys should define in what states they will be present.
      Specified by:
      getAttributes in interface ConnectionClientTransport
    • getStats

      public com.google.common.util.concurrent.ListenableFuture<InternalChannelz.SocketStats> getStats()
      Description copied from interface: InternalInstrumented
      Returns the stats object.
      Specified by:
      getStats in interface InternalInstrumented<InternalChannelz.SocketStats>
    • getStatsHelper

      private InternalChannelz.SocketStats getStatsHelper(io.netty.channel.Channel ch)
    • channel

      io.netty.channel.Channel channel()
    • keepAliveManager

      KeepAliveManager keepAliveManager()
    • statusFromFailedFuture

      private Status statusFromFailedFuture(io.netty.channel.ChannelFuture f)
      Convert ChannelFuture.cause() to a Status, taking into account that all handlers are removed from the pipeline when the channel is closed. Since handlers are removed, you may get an unhelpful exception like ClosedChannelException.

      This method must only be called on the event loop.