Class ServerCall<ReqT,RespT>
- java.lang.Object
-
- io.grpc.ServerCall<ReqT,RespT>
-
- Type Parameters:
ReqT
- parsed type of request message.RespT
- parsed type of response message.
- Direct Known Subclasses:
ForwardingServerCall
public abstract class ServerCall<ReqT,RespT> extends Object
Encapsulates a single call received from a remote client. Calls may not simply be unary request-response even though this is the most common pattern. Calls may stream any number of requests and responses. This API is generally intended for use by generated handlers, but applications may use it directly if they need to.Headers must be sent before any messages, which must be sent before closing.
No generic method for determining message receipt or providing acknowledgement is provided. Applications are expected to utilize normal messages for such signals, as a response naturally acknowledges its request.
Methods are guaranteed to be non-blocking. Implementations are not required to be thread-safe.
DO NOT MOCK: Use InProcessTransport and make a fake server instead.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
ServerCall.Listener<ReqT>
Callbacks for consuming incoming RPC messages.
-
Constructor Summary
Constructors Constructor Description ServerCall()
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description abstract void
close(Status status, Metadata trailers)
Close the call with the provided status.Attributes
getAttributes()
Returns properties of a single call.String
getAuthority()
Gets the authority this call is addressed to.abstract MethodDescriptor<ReqT,RespT>
getMethodDescriptor()
TheMethodDescriptor
for the call.SecurityLevel
getSecurityLevel()
Returns the level of security guarantee in communicationsabstract boolean
isCancelled()
Returnstrue
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.boolean
isReady()
Iftrue
, indicates that the call is capable of sending additional messages without requiring excessive buffering internally.abstract void
request(int numMessages)
Requests up to the given number of messages from the call to be delivered toServerCall.Listener.onMessage(Object)
.abstract void
sendHeaders(Metadata headers)
Send response header metadata prior to sending a response message.abstract void
sendMessage(RespT message)
Send a response message.void
setCompression(String compressor)
Sets the compression algorithm for this call.void
setMessageCompression(boolean enabled)
Enables per-message compression, if an encoding type has been negotiated.void
setOnReadyThreshold(int numBytes)
A hint to the call that specifies how many bytes must be queued beforeisReady()
will return false.
-
-
-
Method Detail
-
request
public abstract void request(int numMessages)
Requests up to the given number of messages from the call to be delivered toServerCall.Listener.onMessage(Object)
. OncenumMessages
have been delivered no further request messages will be delivered until more messages are requested by calling this method again.Servers use this mechanism to provide back-pressure to the client for flow-control.
This method is safe to call from multiple threads without external synchronization.
- Parameters:
numMessages
- the requested number of messages to be delivered to the listener.
-
sendHeaders
public abstract void sendHeaders(Metadata headers)
Send response header metadata prior to sending a response message. This method may only be called once and cannot be called after calls tosendMessage(RespT)
orclose(io.grpc.Status, io.grpc.Metadata)
.Since
Metadata
is not thread-safe, the caller must not access (read or write)headers
after this point.- Parameters:
headers
- metadata to send prior to any response body.- Throws:
IllegalStateException
- ifclose
has been called, a message has been sent, or headers have already been sent
-
sendMessage
public abstract void sendMessage(RespT message)
Send a response message. Messages are the primary form of communication associated with RPCs. Multiple response messages may exist for streaming calls.- Parameters:
message
- response message.- Throws:
IllegalStateException
- if headers not sent or call isclose(io.grpc.Status, io.grpc.Metadata)
d
-
isReady
public boolean isReady()
Iftrue
, indicates that the call is capable of sending additional messages without requiring excessive buffering internally. This event is just a suggestion and the application is free to ignore it, however doing so may result in excessive buffering within the call.If
false
,ServerCall.Listener.onReady()
will be called afterisReady()
transitions totrue
.This abstract class's implementation always returns
true
. Implementations generally override the method.
-
close
public abstract void close(Status status, Metadata trailers)
Close the call with the provided status. No further sending or receiving will occur. IfStatus.isOk()
isfalse
, then the call is said to have failed.If no errors or cancellations are known to have occurred, then a
ServerCall.Listener.onComplete()
notification should be expected, independent ofstatus
. OtherwiseServerCall.Listener.onCancel()
has been or will be called.Since
Metadata
is not thread-safe, the caller must not access (read or write)trailers
after this point.This method implies the caller completed processing the RPC, but it does not imply the RPC is complete. The call implementation will need additional time to complete the RPC and during this time the client is still able to cancel the request or a network error might cause the RPC to fail. If you wish to know when the call is actually completed/closed, you have to use
ServerCall.Listener.onComplete()
orServerCall.Listener.onCancel()
instead. This method is not necessarily invoked when Listener.onCancel() is called.- Throws:
IllegalStateException
- if call is alreadyclose
d
-
isCancelled
public abstract boolean isCancelled()
Returnstrue
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 cancel by client, network errors, and similar.This method may safely be called concurrently from multiple threads.
-
setMessageCompression
public void setMessageCompression(boolean enabled)
Enables per-message compression, if an encoding type has been negotiated. If no message encoding has been negotiated, this is a no-op. By default per-message compression is enabled, but may not have any effect if compression is not enabled on the call.
-
setCompression
public void setCompression(String compressor)
Sets the compression algorithm for this call. This compression is utilized for sending. If the server does not support the compression algorithm, the call will fail. This method may only be called beforesendHeaders(io.grpc.Metadata)
. The compressor to use will be looked up in theCompressorRegistry
. Default gRPC servers support the "gzip" compressor.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.
- Parameters:
compressor
- the name of the compressor to use.- Throws:
IllegalArgumentException
- if the compressor name can not be found.
-
setOnReadyThreshold
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/11021") public void setOnReadyThreshold(int numBytes)
A hint to the call that specifies how many bytes must be queued beforeisReady()
will return false. A call may ignore this property if unsupported. This may only be set before any messages are sent.- Parameters:
numBytes
- The number of bytes that must be queued. Must be a positive integer.
-
getSecurityLevel
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/4692") public SecurityLevel getSecurityLevel()
Returns the level of security guarantee in communicationsDetermining the level of security offered by the transport for RPCs on server-side. This can be approximated by looking for the SSLSession, but that doesn't work for ALTS and maybe some future TLS approaches. May return a lower security level when it cannot be determined precisely.
- Returns:
- non-
null
SecurityLevel enum
-
getAttributes
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1779") @TransportAttr public Attributes getAttributes()
Returns properties of a single call.Attributes originate from the transport and can be altered by
ServerTransportFilter
.- Returns:
- non-
null
Attributes container
-
getAuthority
@Nullable public String getAuthority()
Gets the authority this call is addressed to.- Returns:
- the authority string.
null
if not available.
-
getMethodDescriptor
public abstract MethodDescriptor<ReqT,RespT> getMethodDescriptor()
TheMethodDescriptor
for the call.
-
-