Package io.grpc.internal
Class AbstractClientStream
- java.lang.Object
-
- io.grpc.internal.AbstractStream
-
- io.grpc.internal.AbstractClientStream
-
- All Implemented Interfaces:
ClientStream
,MessageFramer.Sink
,Stream
- Direct Known Subclasses:
NettyClientStream
public abstract class AbstractClientStream extends AbstractStream implements ClientStream, MessageFramer.Sink
The abstract base class forClientStream
implementations. Extending classes only need to implementtransportState()
andabstractClientStreamSink()
. Must only be called from the sending application thread.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private class
AbstractClientStream.GetFramer
protected static interface
AbstractClientStream.Sink
A sink for outbound operations, separated from the stream simply to avoid name collisions/confusion.protected static class
AbstractClientStream.TransportState
This should only be called from the transport thread.
-
Field Summary
Fields Modifier and Type Field Description private boolean
cancelled
Whether cancel() has been called.private Framer
framer
private Metadata
headers
private static java.util.logging.Logger
log
private boolean
shouldBeCountedForInUse
private TransportTracer
transportTracer
private boolean
useGet
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractClientStream(WritableBufferAllocator bufferAllocator, StatsTraceContext statsTraceCtx, TransportTracer transportTracer, Metadata headers, CallOptions callOptions, boolean useGet)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract AbstractClientStream.Sink
abstractClientStreamSink()
Sink for transport to be called to perform outbound operations.void
appendTimeoutInsight(InsightBuilder insight)
Append information that will be included in the locally generated DEADLINE_EXCEEDED errors to the givenInsightBuilder
, in order to tell the user about the state of the stream so that they can better diagnose the cause of the error.void
cancel(Status reason)
Abnormally terminates the stream.void
deliverFrame(WritableBuffer frame, boolean endOfStream, boolean flush, int numMessages)
Delivers a frame via the transport.protected Framer
framer()
The framer to use for sending messages.protected TransportTracer
getTransportTracer()
void
halfClose()
Closes the local side of this stream and flushes any remaining messages.boolean
isReady()
Iftrue
, indicates that the transport is capable of sending additional messages without requiring excessive buffering internally.void
setDeadline(Deadline deadline)
Sets the effective deadline of the RPC.void
setDecompressorRegistry(DecompressorRegistry decompressorRegistry)
Sets the registry to find a decompressor for the framer.void
setFullStreamDecompression(boolean fullStreamDecompression)
Enables full-stream decompression, allowing the client stream to useGzipInflatingBuffer
to decode inbound GZIP compressed streams.void
setMaxInboundMessageSize(int maxSize)
Sets the max size accepted from the remote endpoint.void
setMaxOutboundMessageSize(int maxSize)
Sets the max size sent to the remote endpoint.boolean
shouldBeCountedForInUse()
Returns true if this stream should be counted when determining the in-use state of the transport.void
start(ClientStreamListener listener)
Starts stream.protected abstract AbstractClientStream.TransportState
transportState()
Obtain the transport state corresponding to this stream.-
Methods inherited from class io.grpc.internal.AbstractStream
endOfMessages, flush, onSendingBytes, optimizeForDirectExecutor, request, setCompressor, setMessageCompression, setOnReadyThreshold, writeMessage
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface io.grpc.internal.ClientStream
getAttributes, setAuthority
-
Methods inherited from interface io.grpc.internal.Stream
flush, optimizeForDirectExecutor, request, setCompressor, setMessageCompression, writeMessage
-
-
-
-
Field Detail
-
log
private static final java.util.logging.Logger log
-
transportTracer
private final TransportTracer transportTracer
-
framer
private final Framer framer
-
shouldBeCountedForInUse
private final boolean shouldBeCountedForInUse
-
useGet
private final boolean useGet
-
headers
private Metadata headers
-
cancelled
private volatile boolean cancelled
Whether cancel() has been called. This is not strictly necessary, but removes the delay between cancel() being called and isReady() beginning to return false, since cancel is commonly processed asynchronously.
-
-
Constructor Detail
-
AbstractClientStream
protected AbstractClientStream(WritableBufferAllocator bufferAllocator, StatsTraceContext statsTraceCtx, TransportTracer transportTracer, Metadata headers, CallOptions callOptions, boolean useGet)
-
-
Method Detail
-
setDeadline
public void setDeadline(Deadline deadline)
Description copied from interface:ClientStream
Sets the effective deadline of the RPC.- Specified by:
setDeadline
in interfaceClientStream
-
setMaxOutboundMessageSize
public void setMaxOutboundMessageSize(int maxSize)
Description copied from interface:ClientStream
Sets the max size sent to the remote endpoint.- Specified by:
setMaxOutboundMessageSize
in interfaceClientStream
-
setMaxInboundMessageSize
public void setMaxInboundMessageSize(int maxSize)
Description copied from interface:ClientStream
Sets the max size accepted from the remote endpoint.- Specified by:
setMaxInboundMessageSize
in interfaceClientStream
-
setFullStreamDecompression
public final void setFullStreamDecompression(boolean fullStreamDecompression)
Description copied from interface:ClientStream
Enables full-stream decompression, allowing the client stream to useGzipInflatingBuffer
to decode inbound GZIP compressed streams.- Specified by:
setFullStreamDecompression
in interfaceClientStream
-
setDecompressorRegistry
public final void setDecompressorRegistry(DecompressorRegistry decompressorRegistry)
Description copied from interface:ClientStream
Sets the registry to find a decompressor for the framer. May only be called beforeClientStream.start(io.grpc.internal.ClientStreamListener)
. If the transport does not support compression, this may do nothing.- Specified by:
setDecompressorRegistry
in interfaceClientStream
- Parameters:
decompressorRegistry
- the registry of decompressors for decoding responses
-
transportState
protected abstract AbstractClientStream.TransportState transportState()
Obtain the transport state corresponding to this stream. Each stream must have its own unique transport state.- Specified by:
transportState
in classAbstractStream
-
start
public final void start(ClientStreamListener listener)
Description copied from interface:ClientStream
Starts stream. This method may only be called once. It is safe to do latent initialization of the stream up untilClientStream.start(io.grpc.internal.ClientStreamListener)
is called.This method should not throw any exceptions.
- Specified by:
start
in interfaceClientStream
- Parameters:
listener
- non-null
listener of stream events
-
abstractClientStreamSink
protected abstract AbstractClientStream.Sink abstractClientStreamSink()
Sink for transport to be called to perform outbound operations. Each stream must have its own unique sink.
-
framer
protected final Framer framer()
Description copied from class:AbstractStream
The framer to use for sending messages.- Specified by:
framer
in classAbstractStream
-
shouldBeCountedForInUse
public final boolean shouldBeCountedForInUse()
Returns true if this stream should be counted when determining the in-use state of the transport.
-
deliverFrame
public final void deliverFrame(WritableBuffer frame, boolean endOfStream, boolean flush, int numMessages)
Description copied from interface:MessageFramer.Sink
Delivers a frame via the transport.- Specified by:
deliverFrame
in interfaceMessageFramer.Sink
- Parameters:
frame
- a non-empty buffer to deliver ornull
if the framer is being closed and there is no data to deliver.endOfStream
- whether the frame is the last one for the GRPC streamflush
-true
if more data may not be arriving soonnumMessages
- the number of messages that this series of frames represents
-
halfClose
public final void halfClose()
Description copied from interface:ClientStream
Closes the local side of this stream and flushes any remaining messages. After this is called, no further messages may be sent on this stream, but additional messages may be received until the remote end-point is closed. This method may only be called once, and only afterClientStream.start(io.grpc.internal.ClientStreamListener)
.- Specified by:
halfClose
in interfaceClientStream
-
cancel
public final void cancel(Status reason)
Description copied from interface:ClientStream
Abnormally terminates the stream. After calling this method, no further messages will be sent or received, however it may still be possible to receive buffered messages for a brief period untilClientStreamListener.closed(io.grpc.Status, io.grpc.internal.ClientStreamListener.RpcProgress, io.grpc.Metadata)
is called. This method may only be called afterClientStream.start(io.grpc.internal.ClientStreamListener)
, but else is safe to be called at any time and multiple times and from any thread.- Specified by:
cancel
in interfaceClientStream
- Parameters:
reason
- must be non-OK
-
isReady
public final boolean isReady()
Description copied from interface:Stream
Iftrue
, indicates that the transport is capable of sending additional messages without requiring excessive buffering internally. Otherwise,StreamListener.onReady()
will be called when it turnstrue
.This is just a suggestion and the application is free to ignore it, however doing so may result in excessive buffering within the transport.
- Specified by:
isReady
in interfaceStream
- Overrides:
isReady
in classAbstractStream
-
appendTimeoutInsight
public final void appendTimeoutInsight(InsightBuilder insight)
Description copied from interface:ClientStream
Append information that will be included in the locally generated DEADLINE_EXCEEDED errors to the givenInsightBuilder
, in order to tell the user about the state of the stream so that they can better diagnose the cause of the error.- Specified by:
appendTimeoutInsight
in interfaceClientStream
-
getTransportTracer
protected TransportTracer getTransportTracer()
-
-