Prevents the streams from hanging indefinitely. This middleware garbage collects idle streams in
case the user forgot to close a ServerStream or if a connection is reset and GRPC does not get
notified.
For every checkInterval, this class checks two thresholds:
waitingTimeout: the amount of time to wait for a response (after the caller signaled
demand) before forcefully closing the stream. Duration.ZERO disables the timeout.
idleTimeout: the amount of time to wait before assuming that the caller forgot to close the
stream and forcefully closing the stream. This is measured from the last time the caller
had no outstanding demand. Duration.ZERO disables the timeout.
Blocks until all work has completed execution after a shutdown request, or the timeout occurs,
or the current thread is interrupted, whichever happens first.
Returns true if all work has completed following shut down. Note that isTerminated is never
true unless either shutdown or shutdownNow was called first.
Initiates an orderly shutdown in which previously submitted work is finished, but no new work
will be accepted. Invocation has no additional effect if already shut down.
This method does not wait for previously submitted work to complete execution. Use
awaitTermination to do that.
shutdownNow()
publicvoidshutdownNow()
Attempts to stop all actively executing work and halts the processing of waiting work.
This method does not wait for actively executing work to terminate. Use awaitTermination to
do that.
There are no guarantees beyond best-effort attempts to stop processing actively executing
work. For example, typical implementations will cancel via Thread.interrupt(), so any task that
fails to respond to interrupts may never terminate.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-28 UTC."],[[["\u003cp\u003eThe \u003ccode\u003eWatchdog\u003c/code\u003e class prevents streams from hanging indefinitely by garbage collecting idle streams and forcefully closing them if needed.\u003c/p\u003e\n"],["\u003cp\u003eIt monitors streams based on \u003ccode\u003ewaitingTimeout\u003c/code\u003e (time to wait for a response) and \u003ccode\u003eidleTimeout\u003c/code\u003e (time to wait before assuming a stream was forgotten).\u003c/p\u003e\n"],["\u003cp\u003eThe latest version of Watchdog available is 2.63.1, and many older versions are accessible via their respective links.\u003c/p\u003e\n"],["\u003cp\u003eIt includes \u003ccode\u003ecreate\u003c/code\u003e and \u003ccode\u003ecreateDuration\u003c/code\u003e static methods to instantiate \u003ccode\u003eWatchdog\u003c/code\u003e, and \u003ccode\u003ewatch\u003c/code\u003e and \u003ccode\u003ewatchDuration\u003c/code\u003e methods to wrap a \u003ccode\u003eResponseObserver\u003c/code\u003e with timeout constraints.\u003c/p\u003e\n"],["\u003cp\u003eThe class implements the \u003ccode\u003eRunnable\u003c/code\u003e and \u003ccode\u003eBackgroundResource\u003c/code\u003e interfaces and includes methods to manage its lifecycle, such as \u003ccode\u003eshutdown\u003c/code\u003e, \u003ccode\u003eshutdownNow\u003c/code\u003e, \u003ccode\u003eawaitTermination\u003c/code\u003e, \u003ccode\u003eisShutdown\u003c/code\u003e, and \u003ccode\u003eisTerminated\u003c/code\u003e.\u003c/p\u003e\n"]]],[],null,["# Class Watchdog (2.69.0)\n\nVersion latestkeyboard_arrow_down\n\n- [2.69.0 (latest)](/java/docs/reference/gax/latest/com.google.api.gax.rpc.Watchdog)\n- [2.68.2](/java/docs/reference/gax/2.68.2/com.google.api.gax.rpc.Watchdog)\n- [2.67.0](/java/docs/reference/gax/2.67.0/com.google.api.gax.rpc.Watchdog)\n- [2.66.0](/java/docs/reference/gax/2.66.0/com.google.api.gax.rpc.Watchdog)\n- [2.65.0](/java/docs/reference/gax/2.65.0/com.google.api.gax.rpc.Watchdog)\n- [2.63.1](/java/docs/reference/gax/2.63.1/com.google.api.gax.rpc.Watchdog)\n- [2.62.0](/java/docs/reference/gax/2.62.0/com.google.api.gax.rpc.Watchdog)\n- [2.61.0](/java/docs/reference/gax/2.61.0/com.google.api.gax.rpc.Watchdog)\n- [2.60.0](/java/docs/reference/gax/2.60.0/com.google.api.gax.rpc.Watchdog)\n- [2.59.1](/java/docs/reference/gax/2.59.1/com.google.api.gax.rpc.Watchdog)\n- [2.58.0](/java/docs/reference/gax/2.58.0/com.google.api.gax.rpc.Watchdog)\n- [2.57.0](/java/docs/reference/gax/2.57.0/com.google.api.gax.rpc.Watchdog)\n- [2.55.0](/java/docs/reference/gax/2.55.0/com.google.api.gax.rpc.Watchdog)\n- [2.54.1](/java/docs/reference/gax/2.54.1/com.google.api.gax.rpc.Watchdog)\n- [2.53.0](/java/docs/reference/gax/2.53.0/com.google.api.gax.rpc.Watchdog)\n- [2.52.0](/java/docs/reference/gax/2.52.0/com.google.api.gax.rpc.Watchdog)\n- [2.51.0](/java/docs/reference/gax/2.51.0/com.google.api.gax.rpc.Watchdog)\n- [2.50.0](/java/docs/reference/gax/2.50.0/com.google.api.gax.rpc.Watchdog)\n- [2.49.0](/java/docs/reference/gax/2.49.0/com.google.api.gax.rpc.Watchdog)\n- [2.48.1](/java/docs/reference/gax/2.48.1/com.google.api.gax.rpc.Watchdog)\n- [2.47.0](/java/docs/reference/gax/2.47.0/com.google.api.gax.rpc.Watchdog)\n- [2.46.1](/java/docs/reference/gax/2.46.1/com.google.api.gax.rpc.Watchdog)\n- [2.45.0](/java/docs/reference/gax/2.45.0/com.google.api.gax.rpc.Watchdog)\n- [2.43.0](/java/docs/reference/gax/2.43.0/com.google.api.gax.rpc.Watchdog)\n- [2.42.0](/java/docs/reference/gax/2.42.0/com.google.api.gax.rpc.Watchdog)\n- [2.41.0](/java/docs/reference/gax/2.41.0/com.google.api.gax.rpc.Watchdog)\n- [2.39.0](/java/docs/reference/gax/2.39.0/com.google.api.gax.rpc.Watchdog)\n- [2.38.0](/java/docs/reference/gax/2.38.0/com.google.api.gax.rpc.Watchdog)\n- [2.37.0](/java/docs/reference/gax/2.37.0/com.google.api.gax.rpc.Watchdog)\n- [2.36.0](/java/docs/reference/gax/2.36.0/com.google.api.gax.rpc.Watchdog)\n- [2.35.0](/java/docs/reference/gax/2.35.0/com.google.api.gax.rpc.Watchdog)\n- [2.34.1](/java/docs/reference/gax/2.34.1/com.google.api.gax.rpc.Watchdog)\n- [2.33.0](/java/docs/reference/gax/2.33.0/com.google.api.gax.rpc.Watchdog)\n- [2.32.1](/java/docs/reference/gax/2.32.1/com.google.api.gax.rpc.Watchdog)\n- [2.31.1](/java/docs/reference/gax/2.31.1/com.google.api.gax.rpc.Watchdog)\n- [2.30.1](/java/docs/reference/gax/2.30.1/com.google.api.gax.rpc.Watchdog)\n- [2.24.0](/java/docs/reference/gax/2.24.0/com.google.api.gax.rpc.Watchdog)\n- [2.23.3](/java/docs/reference/gax/2.23.3/com.google.api.gax.rpc.Watchdog)\n- [2.22.0](/java/docs/reference/gax/2.22.0/com.google.api.gax.rpc.Watchdog)\n- [2.21.0](/java/docs/reference/gax/2.21.0/com.google.api.gax.rpc.Watchdog)\n- [2.20.1](/java/docs/reference/gax/2.20.1/com.google.api.gax.rpc.Watchdog)\n- [2.19.6](/java/docs/reference/gax/2.19.6/com.google.api.gax.rpc.Watchdog)\n- [2.18.7](/java/docs/reference/gax/2.18.7/com.google.api.gax.rpc.Watchdog)\n- [2.17.0](/java/docs/reference/gax/2.17.0/com.google.api.gax.rpc.Watchdog)\n- [2.16.0](/java/docs/reference/gax/2.16.0/com.google.api.gax.rpc.Watchdog)\n- [2.15.0](/java/docs/reference/gax/2.15.0/com.google.api.gax.rpc.Watchdog)\n- [2.14.0](/java/docs/reference/gax/2.14.0/com.google.api.gax.rpc.Watchdog)\n- [2.13.0](/java/docs/reference/gax/2.13.0/com.google.api.gax.rpc.Watchdog)\n- [2.12.2](/java/docs/reference/gax/2.12.2/com.google.api.gax.rpc.Watchdog)\n- [2.11.0](/java/docs/reference/gax/2.11.0/com.google.api.gax.rpc.Watchdog)\n- [2.10.0](/java/docs/reference/gax/2.10.0/com.google.api.gax.rpc.Watchdog)\n- [2.9.0](/java/docs/reference/gax/2.9.0/com.google.api.gax.rpc.Watchdog)\n- [2.8.1](/java/docs/reference/gax/2.8.1/com.google.api.gax.rpc.Watchdog)\n- [2.7.1](/java/docs/reference/gax/2.7.1/com.google.api.gax.rpc.Watchdog) \n\n public final class Watchdog implements Runnable, BackgroundResource\n\nPrevents the streams from hanging indefinitely. This middleware garbage collects idle streams in\ncase the user forgot to close a ServerStream or if a connection is reset and GRPC does not get\nnotified.\n\nFor every `checkInterval`, this class checks two thresholds:\n\n- waitingTimeout: the amount of time to wait for a response (after the caller signaled demand) before forcefully closing the stream. Duration.ZERO disables the timeout.\n- idleTimeout: the amount of time to wait before assuming that the caller forgot to close the stream and forcefully closing the stream. This is measured from the last time the caller had no outstanding demand. Duration.ZERO disables the timeout. \n\nInheritance\n-----------\n\n[java.lang.Object](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html) \\\u003e Watchdog \n\nImplements\n----------\n\n[Runnable](https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html), [BackgroundResource](/java/docs/reference/gax/latest/com.google.api.gax.core.BackgroundResource) \n\nInherited Members\n-----------------\n\n[Object.clone()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#clone--) \n[Object.equals(Object)](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-) \n[Object.finalize()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#finalize--) \n[Object.getClass()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#getClass--) \n[Object.hashCode()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--) \n[Object.notify()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#notify--) \n[Object.notifyAll()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#notifyAll--) \n[Object.toString()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#toString--) \n[Object.wait()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait--) \n[Object.wait(long)](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait-long-) \n[Object.wait(long,int)](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait-long-int-)\n\nStatic Methods\n--------------\n\n### create(ApiClock clock, Duration scheduleInterval, ScheduledExecutorService executor)\n\n public static Watchdog create(ApiClock clock, Duration scheduleInterval, ScheduledExecutorService executor)\n\n| **Obsolete**\n|\n| *Use create(ApiClock, java.time.Duration, ScheduledExecutorService) instead*\n|\n| This feature is stable for usage in this major version, but may be deprecated in a future release.\n\nThis method is obsolete. Use #createDuration(ApiClock, java.time.Duration, ScheduledExecutorService) instead.\n\n### createDuration(ApiClock clock, Duration scheduleInterval, ScheduledExecutorService executor)\n\n public static Watchdog createDuration(ApiClock clock, Duration scheduleInterval, ScheduledExecutorService executor)\n\nreturns a Watchdog which is scheduled at the provided interval.\n\nMethods\n-------\n\n### \\\u003cResponseT\\\u003ewatch(ResponseObserver\\\u003cResponseT\\\u003e innerObserver, Duration waitTimeout, Duration idleTimeout)\n\n public ResponseObserver\u003cResponseT\u003e \u003cResponseT\u003ewatch(ResponseObserver\u003cResponseT\u003e innerObserver, Duration waitTimeout, Duration idleTimeout)\n\n| **Obsolete**\n|\n| *Use watchDuration(ResponseObserver, java.time.Duration, java.time.Duration) instead*\n|\n| This feature is stable for usage in this major version, but may be deprecated in a future release.\n\nThis method is obsolete. Use #watchDuration(ResponseObserver, java.time.Duration, java.time.Duration) instead.\n\n### \\\u003cResponseT\\\u003ewatchDuration(ResponseObserver\\\u003cResponseT\\\u003e innerObserver, Duration waitTimeout, Duration idleTimeout)\n\n public ResponseObserver\u003cResponseT\u003e \u003cResponseT\u003ewatchDuration(ResponseObserver\u003cResponseT\u003e innerObserver, Duration waitTimeout, Duration idleTimeout)\n\nWraps the target observer with timing constraints.\n\n### awaitTermination(long duration, TimeUnit unit)\n\n public boolean awaitTermination(long duration, TimeUnit unit)\n\nBlocks until all work has completed execution after a shutdown request, or the timeout occurs,\nor the current thread is interrupted, whichever happens first.\n\n### close()\n\n public void close()\n\n### isShutdown()\n\n public boolean isShutdown()\n\nReturns true if this background resource has been shut down.\n\n### isTerminated()\n\n public boolean isTerminated()\n\nReturns true if all work has completed following shut down. Note that isTerminated is never\ntrue unless either shutdown or shutdownNow was called first.\n\n### run()\n\n public void run()\n\n### shutdown()\n\n public void shutdown()\n\nInitiates an orderly shutdown in which previously submitted work is finished, but no new work\nwill be accepted. Invocation has no additional effect if already shut down.\n\nThis method does not wait for previously submitted work to complete execution. Use\nawaitTermination to do that.\n\n### shutdownNow()\n\n public void shutdownNow()\n\nAttempts to stop all actively executing work and halts the processing of waiting work.\n\nThis method does not wait for actively executing work to terminate. Use awaitTermination to\ndo that.\n\nThere are no guarantees beyond best-effort attempts to stop processing actively executing\nwork. For example, typical implementations will cancel via Thread.interrupt(), so any task that\nfails to respond to interrupts may never terminate."]]