Class DelayedClientCall<ReqT,RespT>
- java.lang.Object
-
- io.grpc.ClientCall<ReqT,RespT>
-
- io.grpc.internal.DelayedClientCall<ReqT,RespT>
-
- Direct Known Subclasses:
ManagedChannelImpl.RealChannel.PendingCall
public class DelayedClientCall<ReqT,RespT> extends ClientCall<ReqT,RespT>
A call that queues requests before a real call is ready to be delegated to.ClientCall
itself doesn't require thread-safety. However, the state ofDelayedCall
may be internally altered by different threads, thus internal synchronization is necessary.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private class
DelayedClientCall.CloseListenerRunnable
private static class
DelayedClientCall.DelayedListener<RespT>
-
Nested classes/interfaces inherited from class io.grpc.ClientCall
ClientCall.Listener<T>
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.concurrent.Executor
callExecutor
private Context
context
private DelayedClientCall.DelayedListener<RespT>
delayedListener
private Status
error
private java.util.concurrent.ScheduledFuture<?>
initialDeadlineMonitor
A timer to monitor the initial deadline.private ClientCall.Listener<RespT>
listener
Non-null
iff start has been called.private static java.util.logging.Logger
logger
private static ClientCall<java.lang.Object,java.lang.Object>
NOOP_CALL
private boolean
passThrough
true
once realCall is valid and all pending calls have been drained.private java.util.List<java.lang.Runnable>
pendingRunnables
private ClientCall<ReqT,RespT>
realCall
-
Constructor Summary
Constructors Modifier Constructor Description protected
DelayedClientCall(java.util.concurrent.Executor callExecutor, java.util.concurrent.ScheduledExecutorService scheduler, Deadline deadline)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
callCancelled()
private void
cancel(Status status, boolean onlyCancelPendingCall)
Cancels the call unlessrealCall
is set andonlyCancelPendingCall
is true.void
cancel(java.lang.String message, java.lang.Throwable cause)
Prevent any further processing for thisClientCall
.private void
delayOrExecute(java.lang.Runnable runnable)
private void
drainPendingCalls()
Called to transitionpassThrough
totrue
.Attributes
getAttributes()
Returns additional properties of the call.(package private) ClientCall<ReqT,RespT>
getRealCall()
void
halfClose()
Close the call for request message sending.private boolean
isAbeforeB(Deadline a, Deadline b)
boolean
isReady()
Iftrue
, indicates that the call is capable of sending additional messages without requiring excessive buffering internally.void
request(int numMessages)
Requests up to the given number of messages from the call to be delivered toClientCall.Listener.onMessage(Object)
.private java.util.concurrent.ScheduledFuture<?>
scheduleDeadlineIfNeeded(java.util.concurrent.ScheduledExecutorService scheduler, Deadline deadline)
void
sendMessage(ReqT message)
Send a request message to the server.java.lang.Runnable
setCall(ClientCall<ReqT,RespT> call)
Transfers all pending and future requests and mutations to the given call.void
setMessageCompression(boolean enable)
Enables per-message compression, if an encoding type has been negotiated.private void
setRealCall(ClientCall<ReqT,RespT> realCall)
void
start(ClientCall.Listener<RespT> listener, Metadata headers)
Start a call, usingresponseListener
for processing response messages.java.lang.String
toString()
-
-
-
Field Detail
-
logger
private static final java.util.logging.Logger logger
-
initialDeadlineMonitor
@Nullable private final java.util.concurrent.ScheduledFuture<?> initialDeadlineMonitor
A timer to monitor the initial deadline. The timer must be cancelled on transition to the real call.
-
callExecutor
private final java.util.concurrent.Executor callExecutor
-
context
private final Context context
-
passThrough
private volatile boolean passThrough
true
once realCall is valid and all pending calls have been drained.
-
listener
private ClientCall.Listener<RespT> listener
Non-null
iff start has been called. Used to assert methods are called in appropriate order, but also used if an error occurs beforerealCall
is set.
-
realCall
private ClientCall<ReqT,RespT> realCall
-
error
private Status error
-
pendingRunnables
private java.util.List<java.lang.Runnable> pendingRunnables
-
delayedListener
private DelayedClientCall.DelayedListener<RespT> delayedListener
-
NOOP_CALL
private static final ClientCall<java.lang.Object,java.lang.Object> NOOP_CALL
-
-
Constructor Detail
-
DelayedClientCall
protected DelayedClientCall(java.util.concurrent.Executor callExecutor, java.util.concurrent.ScheduledExecutorService scheduler, @Nullable Deadline deadline)
-
-
Method Detail
-
scheduleDeadlineIfNeeded
@Nullable private java.util.concurrent.ScheduledFuture<?> scheduleDeadlineIfNeeded(java.util.concurrent.ScheduledExecutorService scheduler, @Nullable Deadline deadline)
-
setCall
public final java.lang.Runnable setCall(ClientCall<ReqT,RespT> call)
Transfers all pending and future requests and mutations to the given call.No-op if either this method or
cancel(java.lang.String, java.lang.Throwable)
have already been called.
-
start
public final void start(ClientCall.Listener<RespT> listener, Metadata headers)
Description copied from class:ClientCall
Start a call, usingresponseListener
for processing response messages.It must be called prior to any other method on this class, except for
ClientCall.cancel(java.lang.String, java.lang.Throwable)
which may be called at any time.Since
Metadata
is not thread-safe, the caller must not access (read or write)headers
after this point.- Specified by:
start
in classClientCall<ReqT,RespT>
- Parameters:
listener
- receives response messagesheaders
- which can contain extra call metadata, e.g. authentication credentials.
-
cancel
public final void cancel(@Nullable java.lang.String message, @Nullable java.lang.Throwable cause)
Description copied from class:ClientCall
Prevent any further processing for thisClientCall
. No further messages may be sent or will be received. The server is informed of cancellations, but may not stop processing the call. Cancellation is permitted even if previouslyClientCall.halfClose()
d. Cancelling an alreadycancel()
edClientCall
has no effect.No other methods on this class can be called after this method has been called.
It is recommended that at least one of the arguments to be non-
null
, to provide useful debug information. Both argument being null may log warnings and result in suboptimal performance. Also note that the provided information will not be sent to the server.- Specified by:
cancel
in classClientCall<ReqT,RespT>
- Parameters:
message
- if notnull
, will appear as the description of the CANCELLED statuscause
- if notnull
, will appear as the cause of the CANCELLED status
-
cancel
private void cancel(Status status, boolean onlyCancelPendingCall)
Cancels the call unlessrealCall
is set andonlyCancelPendingCall
is true.
-
callCancelled
protected void callCancelled()
-
delayOrExecute
private void delayOrExecute(java.lang.Runnable runnable)
-
drainPendingCalls
private void drainPendingCalls()
Called to transitionpassThrough
totrue
. This method is not safe to be called multiple times; the caller must ensure it will only be called once, ever.this
lock should not be held when calling this method.
-
setRealCall
private void setRealCall(ClientCall<ReqT,RespT> realCall)
-
getRealCall
final ClientCall<ReqT,RespT> getRealCall()
-
sendMessage
public final void sendMessage(ReqT message)
Description copied from class:ClientCall
Send a request message to the server. May be called zero or more times depending on how many messages the server is willing to accept for the operation.- Specified by:
sendMessage
in classClientCall<ReqT,RespT>
- Parameters:
message
- message to be sent to the server.
-
setMessageCompression
public final void setMessageCompression(boolean enable)
Description copied from class:ClientCall
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.- Overrides:
setMessageCompression
in classClientCall<ReqT,RespT>
-
request
public final void request(int numMessages)
Description copied from class:ClientCall
Requests up to the given number of messages from the call to be delivered toClientCall.Listener.onMessage(Object)
. No additional messages will be delivered.Message delivery is guaranteed to be sequential in the order received. In addition, the listener methods will not be accessed concurrently. While it is not guaranteed that the same thread will always be used, it is guaranteed that only a single thread will access the listener at a time.
If it is desired to bypass inbound flow control, a very large number of messages can be specified (e.g.
Integer.MAX_VALUE
).If called multiple times, the number of messages able to delivered will be the sum of the calls.
This method is safe to call from multiple threads without external synchronization.
- Specified by:
request
in classClientCall<ReqT,RespT>
- Parameters:
numMessages
- the requested number of messages to be delivered to the listener. Must be non-negative.
-
halfClose
public final void halfClose()
Description copied from class:ClientCall
Close the call for request message sending. Incoming response messages are unaffected. This should be called when no more messages will be sent from the client.- Specified by:
halfClose
in classClientCall<ReqT,RespT>
-
isReady
public final boolean isReady()
Description copied from class:ClientCall
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
,ClientCall.Listener.onReady()
will be called afterisReady()
transitions totrue
.If the type of the call is either
MethodDescriptor.MethodType.UNARY
orMethodDescriptor.MethodType.SERVER_STREAMING
, this method may persistently return false. Calls that send exactly one message should not check this method.This abstract class's implementation always returns
true
. Implementations generally override the method.- Overrides:
isReady
in classClientCall<ReqT,RespT>
-
getAttributes
public final Attributes getAttributes()
Description copied from class:ClientCall
Returns additional properties of the call. May only be called afterClientCall.Listener.onHeaders(io.grpc.Metadata)
orClientCall.Listener.onClose(io.grpc.Status, io.grpc.Metadata)
. If called prematurely, the implementation may throwIllegalStateException
or return arbitraryAttributes
.- Overrides:
getAttributes
in classClientCall<ReqT,RespT>
- Returns:
- non-
null
attributes
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
-