Class DelayedClientCall<ReqT,RespT>
- Direct Known Subclasses:
ManagedChannelImpl.RealChannel.PendingCall
ClientCall itself doesn't require thread-safety. However, the state of
DelayedCall may be internally altered by different threads, thus internal synchronization is
necessary.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate final classprivate static final classNested classes/interfaces inherited from class io.grpc.ClientCall
ClientCall.Listener<T> -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final Executorprivate final Contextprivate DelayedClientCall.DelayedListener<RespT> private Statusprivate final ScheduledFuture<?> A timer to monitor the initial deadline.private ClientCall.Listener<RespT> Non-nulliff start has been called.private static final Loggerprivate static final ClientCall<Object, Object> private booleantrueonce realCall is valid and all pending calls have been drained.private ClientCall<ReqT, RespT> -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedDelayedClientCall(Executor callExecutor, ScheduledExecutorService scheduler, Deadline deadline) -
Method Summary
Modifier and TypeMethodDescriptionprotected voidprivate voidCancels the call unlessrealCallis set andonlyCancelPendingCallis true.final voidPrevent any further processing for thisClientCall.private voiddelayOrExecute(Runnable runnable) private voidCalled to transitionpassThroughtotrue.final AttributesReturns additional properties of the call.(package private) final ClientCall<ReqT, RespT> final voidClose the call for request message sending.private booleanisAbeforeB(Deadline a, Deadline b) final booleanisReady()Iftrue, indicates that the call is capable of sending additional messages without requiring excessive buffering internally.final voidrequest(int numMessages) Requests up to the given number of messages from the call to be delivered toClientCall.Listener.onMessage(Object).private ScheduledFuture<?> scheduleDeadlineIfNeeded(ScheduledExecutorService scheduler, Deadline deadline) final voidsendMessage(ReqT message) Send a request message to the server.final RunnablesetCall(ClientCall<ReqT, RespT> call) Transfers all pending and future requests and mutations to the given call.final voidsetMessageCompression(boolean enable) Enables per-message compression, if an encoding type has been negotiated.private voidsetRealCall(ClientCall<ReqT, RespT> realCall) final voidstart(ClientCall.Listener<RespT> listener, Metadata headers) Start a call, usingresponseListenerfor processing response messages.toString()
-
Field Details
-
logger
-
initialDeadlineMonitor
A timer to monitor the initial deadline. The timer must be cancelled on transition to the real call. -
callExecutor
-
context
-
passThrough
private volatile boolean passThroughtrueonce realCall is valid and all pending calls have been drained. -
listener
Non-nulliff start has been called. Used to assert methods are called in appropriate order, but also used if an error occurs beforerealCallis set. -
realCall
-
error
-
pendingRunnables
-
delayedListener
-
NOOP_CALL
-
-
Constructor Details
-
DelayedClientCall
protected DelayedClientCall(Executor callExecutor, ScheduledExecutorService scheduler, @Nullable Deadline deadline)
-
-
Method Details
-
isAbeforeB
-
scheduleDeadlineIfNeeded
@Nullable private ScheduledFuture<?> scheduleDeadlineIfNeeded(ScheduledExecutorService scheduler, @Nullable Deadline deadline) -
setCall
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
Description copied from class:ClientCallStart a call, usingresponseListenerfor 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
Metadatais not thread-safe, the caller must not access (read or write)headersafter this point.- Specified by:
startin classClientCall<ReqT,RespT> - Parameters:
listener- receives response messagesheaders- which can contain extra call metadata, e.g. authentication credentials.
-
cancel
Description copied from class:ClientCallPrevent 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()edClientCallhas 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:
cancelin 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
Cancels the call unlessrealCallis set andonlyCancelPendingCallis true. -
callCancelled
protected void callCancelled() -
delayOrExecute
-
drainPendingCalls
private void drainPendingCalls()Called to transitionpassThroughtotrue. This method is not safe to be called multiple times; the caller must ensure it will only be called once, ever.thislock should not be held when calling this method. -
setRealCall
-
getRealCall
-
sendMessage
Description copied from class:ClientCallSend 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:
sendMessagein classClientCall<ReqT,RespT> - Parameters:
message- message to be sent to the server.
-
setMessageCompression
public final void setMessageCompression(boolean enable) Description copied from class:ClientCallEnables 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:
setMessageCompressionin classClientCall<ReqT,RespT>
-
request
public final void request(int numMessages) Description copied from class:ClientCallRequests 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:
requestin 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:ClientCallClose 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:
halfClosein classClientCall<ReqT,RespT>
-
isReady
public final boolean isReady()Description copied from class:ClientCallIftrue, 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.UNARYorMethodDescriptor.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:
isReadyin classClientCall<ReqT,RespT>
-
getAttributes
Description copied from class:ClientCallReturns 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 throwIllegalStateExceptionor return arbitraryAttributes.- Overrides:
getAttributesin classClientCall<ReqT,RespT> - Returns:
- non-
nullattributes
-
toString
-