public abstract class ServerCallStreamObserver<RespT> extends CallStreamObserver<RespT>
CallStreamObserver
to allows for interaction with call
cancellation events on the server side. An instance of this class is obtained by casting the
StreamObserver
passed as an argument to service implementations.
Like StreamObserver
, implementations are not required to be thread-safe; if multiple
threads will be writing to an instance concurrently, the application must synchronize its calls.
DO NOT MOCK: The API is too complex to reliably mock. Use InProcessChannelBuilder to create "real" RPCs suitable for testing and interact with the server using a normal client stub.
Constructor and Description |
---|
ServerCallStreamObserver() |
Modifier and Type | Method and Description |
---|---|
void |
disableAutoRequest()
Swaps to manual flow control where no message will be delivered to
StreamObserver.onNext(Object) unless it is request() ed. |
abstract boolean |
isCancelled()
Returns
true when the call is cancelled and the server is encouraged to abort
processing to save resources, since the client will not be processing any further methods. |
abstract boolean |
isReady()
If
true , indicates that the observer is capable of sending additional messages
without requiring excessive buffering internally. |
abstract void |
request(int count)
Requests the peer to produce
count more messages to be delivered to the 'inbound'
StreamObserver . |
abstract void |
setCompression(String compression)
Sets the compression algorithm to use for the call.
|
abstract void |
setMessageCompression(boolean enable)
Sets message compression for subsequent calls to
StreamObserver.onNext(V) . |
abstract void |
setOnCancelHandler(Runnable onCancelHandler)
Sets a
Runnable to be called if the call is cancelled and the server is encouraged to
abort processing to save resources, since the client will not process any further messages. |
void |
setOnCloseHandler(Runnable onCloseHandler)
Sets a
Runnable to be executed when the call is closed cleanly from the server's
point of view: either StreamObserver.onCompleted() or StreamObserver.onError(Throwable) has been called,
all the messages and trailing metadata have been sent and the stream has been closed. |
abstract void |
setOnReadyHandler(Runnable onReadyHandler)
|
disableAutoInboundFlowControl
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
onCompleted, onError, onNext
public abstract boolean isCancelled()
true
when the call is cancelled and the server is encouraged to abort
processing to save resources, since the client will not be processing any further methods.
Cancellations can be caused by timeouts, explicit cancellation by client, network errors, and
similar.
This method may safely be called concurrently from multiple threads.
public abstract void setOnCancelHandler(Runnable onCancelHandler)
Runnable
to be called if the call is cancelled and the server is encouraged to
abort processing to save resources, since the client will not process any further messages.
Cancellations can be caused by timeouts, explicit cancellation by the client, network errors,
etc.
It is guaranteed that execution of the Runnable
is serialized with calls to the
'inbound' StreamObserver
. That also means that the callback will be delayed if other
callbacks are running; if one of those other callbacks runs for a significant amount of time
it can poll isCancelled()
, which is not delayed.
This method may only be called during the initial call to the application, before the
service returns its StreamObserver
.
Setting the onCancelHandler will suppress the on-cancel exception thrown by
StreamObserver.onNext(V)
. If the caller is already handling cancellation via polling or cannot
substantially benefit from observing cancellation, using a no-op onCancelHandler
is
useful just to suppress the onNext()
exception.
onCancelHandler
- to call when client has cancelled the call.public abstract void setCompression(String compression)
It is safe to call this even if the client does not support the compression format chosen. The implementation will handle negotiation with the client and may fall back to no compression.
compression
- the compression algorithm to use.IllegalArgumentException
- if the compressor name can not be found.public void disableAutoRequest()
StreamObserver.onNext(Object)
unless it is request()
ed.
It may only be called during the initial call to the application, before the service returns
its StreamObserver
.
Note that for cases where the message is received before the service handler is invoked, this method will have no effect. This is true for:
MethodDescriptor.MethodType.UNARY
operations.MethodDescriptor.MethodType.SERVER_STREAMING
operations.public abstract boolean isReady()
true
, indicates that the observer is capable of sending additional messages
without requiring excessive buffering internally. This value is just a suggestion and the
application is free to ignore it, however doing so may result in excessive buffering within the
observer.
If false
, the runnable passed to setOnReadyHandler(java.lang.Runnable)
will be called after
isReady()
transitions to true
.
isReady
in class CallStreamObserver<RespT>
public abstract void setOnReadyHandler(Runnable onReadyHandler)
Runnable
that will be executed every time the stream isReady()
state
changes from false
to true
. While it is not guaranteed that the same
thread will always be used to execute the Runnable
, it is guaranteed that executions
are serialized with calls to the 'inbound' StreamObserver
.
May only be called during the initial call to the application, before the service returns
its StreamObserver
.
Because there is a processing delay to deliver this notification, it is possible for
concurrent writes to cause isReady() == false
within this callback. Handle "spurious"
notifications by checking isReady()
's current value instead of assuming it is now
true
. If isReady() == false
the normal expectations apply, so there would be
another onReadyHandler
callback.
setOnReadyHandler
in class CallStreamObserver<RespT>
onReadyHandler
- to call when peer is ready to receive more messages.public abstract void request(int count)
count
more messages to be delivered to the 'inbound'
StreamObserver
.
This method is safe to call from multiple threads without external synchronization.
request
in class CallStreamObserver<RespT>
count
- more messagespublic abstract void setMessageCompression(boolean enable)
StreamObserver.onNext(V)
.setMessageCompression
in class CallStreamObserver<RespT>
enable
- whether to enable compression.@ExperimentalApi(value="https://github.com/grpc/grpc-java/issues/8467") public void setOnCloseHandler(Runnable onCloseHandler)
Runnable
to be executed when the call is closed cleanly from the server's
point of view: either StreamObserver.onCompleted()
or StreamObserver.onError(Throwable)
has been called,
all the messages and trailing metadata have been sent and the stream has been closed. Note
however that the client still may have not received all the messages due to network delay,
client crashes, and cancellation races.
Exactly one of onCloseHandler
and onCancelHandler
is guaranteed to be called
when the RPC terminates.
It is guaranteed that execution of onCloseHandler
is serialized with calls to
the 'inbound' StreamObserver
. That also means that the callback will be delayed if
other callbacks are running.
This method may only be called during the initial call to the application, before the
service returns its request observer
.
onCloseHandler
- to execute when the call has been closed cleanly.