Class Context.CancellableContext
- java.lang.Object
-
- io.grpc.Context
-
- io.grpc.Context.CancellableContext
-
- All Implemented Interfaces:
Closeable,AutoCloseable
- Enclosing class:
- Context
public static final class Context.CancellableContext extends Context implements Closeable
A context which inherits cancellation from its parent but which can also be independently cancelled and which will propagate cancellation to its descendants. To avoid leaking memory, every CancellableContext must have a defined lifetime, after which it is guaranteed to be cancelled.This class must be cancelled by either calling
close()orcancel(java.lang.Throwable).close()is equivalent to callingcancel(null). It is safe to call the methods more than once, but only the first call will have any effect. Because it's safe to call the methods multiple times, users are encouraged to always callclose()at the end of the operation, and disregard whethercancel(java.lang.Throwable)was already called somewhere else.Blocking code can use the try-with-resources idiom:
try (CancellableContext c = Context.current() .withDeadlineAfter(100, TimeUnit.MILLISECONDS, executor)) { Context toRestore = c.attach(); try { // do some blocking work } finally { c.detach(toRestore); } }Asynchronous code will have to manually track the end of the CancellableContext's lifetime, and cancel the context at the appropriate time.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class io.grpc.Context
Context.CancellableContext, Context.CancellationListener, Context.Key<T>, Context.Storage
-
-
Method Summary
All Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description voidaddListener(Context.CancellationListener cancellationListener, Executor executor)Add a listener that will be notified when the context becomes cancelled.Contextattach()Attach this context, thus enter a new scope within which this context isContext.current().booleancancel(Throwable cause)Cancel this context and optionally provide a cause (can benull) for the cancellation.ThrowablecancellationCause()If a contextContext.isCancelled()then return the cause of the cancellation ornullif context was cancelled without a cause.voidclose()Cleans up this object by callingcancel(null).voiddetach(Context toAttach)Reverse anattach(), restoring the previous context and exiting the current scope.voiddetachAndCancel(Context toAttach, Throwable cause)Cancel this context and detach it as the current context.DeadlinegetDeadline()A context may have an associatedDeadlineat which it will be automatically cancelled.booleanisCancelled()Is this context cancelled.booleanisCurrent()Deprecated.This method violates some GRPC class encapsulation and should not be used.voidremoveListener(Context.CancellationListener cancellationListener)Remove aContext.CancellationListener.-
Methods inherited from class io.grpc.Context
call, current, currentContextExecutor, fixedContextExecutor, fork, key, keyWithDefault, run, withCancellation, withDeadline, withDeadlineAfter, withValue, withValues, withValues, withValues, wrap, wrap
-
-
-
-
Method Detail
-
attach
public Context attach()
Description copied from class:ContextAttach this context, thus enter a new scope within which this context isContext.current(). The previously current context is returned. It is allowed to attach contexts whereContext.isCancelled()istrue.Instead of using
attach()andContext.detach(Context)most use-cases are better served by using theContext.run(Runnable)orContext.call(java.util.concurrent.Callable)to execute work immediately within a context's scope. If work needs to be done in other threads it is recommended to use the 'wrap' methods or to use a propagating executor.All calls to
attach()should have a correspondingContext.detach(Context)within the same method:Context previous = someContext.attach(); try { // Do work } finally { someContext.detach(previous); }
-
detach
public void detach(Context toAttach)
Description copied from class:ContextReverse anattach(), restoring the previous context and exiting the current scope.This context should be the same context that was previously
attached. The provided replacement should be what was returned by the sameattach()call. If anattach()and adetach()meet above requirements, they match.It is expected that between any pair of matching
attach()anddetach(), allattach()es anddetach()es are called in matching pairs. If this method finds that this context is notcurrent, either you or some code in-between are not detaching correctly, and a SEVERE message will be logged but the context to attach will still be bound. Never useContext.current().detach(), as this will compromise this error-detecting mechanism.
-
addListener
public void addListener(Context.CancellationListener cancellationListener, Executor executor)
Description copied from class:ContextAdd a listener that will be notified when the context becomes cancelled.- Overrides:
addListenerin classContext
-
removeListener
public void removeListener(Context.CancellationListener cancellationListener)
Description copied from class:ContextRemove aContext.CancellationListener.- Overrides:
removeListenerin classContext
-
isCurrent
@Deprecated public boolean isCurrent()
Deprecated.This method violates some GRPC class encapsulation and should not be used. If you must know whether a Context is the current context, check whether it is the same object returned byContext.current().Returns true if the Context is the current context.
-
cancel
public boolean cancel(Throwable cause)
Cancel this context and optionally provide a cause (can benull) for the cancellation. This will trigger notification of listeners. It is safe to call this method multiple times. Only the first call will have any effect.Calling
cancel(null)is the same as callingclose().- Returns:
trueif this context cancelled the context and notified listeners,falseif the context was already cancelled.
-
detachAndCancel
public void detachAndCancel(Context toAttach, Throwable cause)
Cancel this context and detach it as the current context.- Parameters:
toAttach- context to make current.cause- of cancellation, can benull.
-
isCancelled
public boolean isCancelled()
Description copied from class:ContextIs this context cancelled.- Overrides:
isCancelledin classContext
-
cancellationCause
public Throwable cancellationCause()
Description copied from class:ContextIf a contextContext.isCancelled()then return the cause of the cancellation ornullif context was cancelled without a cause. If the context is not yet cancelled will always returnnull.The cancellation cause is provided for informational purposes only and implementations should generally assume that it has already been handled and logged properly.
- Overrides:
cancellationCausein classContext
-
getDeadline
public Deadline getDeadline()
Description copied from class:ContextA context may have an associatedDeadlineat which it will be automatically cancelled.- Overrides:
getDeadlinein classContext- Returns:
- A
Deadlineornullif no deadline is set.
-
close
public void close()
Cleans up this object by callingcancel(null).- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable
-
-