Top Description Inners Fields Constructors Methods
com.google.common.util.concurrent

public abstract Class AbstractScheduledService

extends Object
implements Service
Class Inheritance
All Implemented Interfaces
com.google.common.util.concurrent.Service
Annotations
@GwtIncompatible
@J2ktIncompatible
@ElementTypesAreNonnullByDefault
Static Imports
com.google.common.base.Preconditions.checkArgument, .Preconditions.checkNotNull, com.google.common.util.concurrent.Futures.immediateCancelledFuture, .Internal.toNanosSaturated, .MoreExecutors.directExecutor, .Platform.restoreInterruptIfIsInterruptedException, java.util.Objects.requireNonNull, java.util.concurrent.TimeUnit.NANOSECONDS

Base class for services that can implement startUp and shutDown but while in the "running" state need to perform a periodic task. Subclasses can implement startUp, shutDown and also a runOneIteration method that will be executed periodically.

This class uses the ScheduledExecutorService returned from executor to run the startUp and shutDown methods and also uses that service to schedule the runOneIteration that will be executed periodically as specified by its Scheduler. When this service is asked to stop via stopAsync it will cancel the periodic task (but not interrupt it) and wait for it to stop before running the shutDown method.

Subclasses are guaranteed that the life cycle methods (runOneIteration, startUp and shutDown) will never run concurrently. Notably, if any execution of runOneIteration takes longer than its schedule defines, then subsequent executions may start late. Also, all life cycle methods are executed with a lock held, so subclasses can safely modify shared state without additional synchronization necessary for visibility to later executions of the life cycle methods.

Usage Example

Here is a sketch of a service which crawls a website and uses the scheduling capabilities to rate limit itself.

class CrawlingService extends AbstractScheduledService {
  private Set<Uri> visited;
  private Queue<Uri> toCrawl;
  protected void startUp() throws Exception {
    toCrawl = readStartingUris();
  }

  protected void runOneIteration() throws Exception {
    Uri uri = toCrawl.remove();
    Collection<Uri> newUris = crawl(uri);
    visited.add(uri);
    for (Uri newUri : newUris) {
      if (!visited.contains(newUri)) { toCrawl.add(newUri); }
    }
  }

  protected void shutDown() throws Exception {
    saveUris(toCrawl);
  }

  protected Scheduler scheduler() {
    return Scheduler.newFixedRateSchedule(0, 1, TimeUnit.SECONDS);
  }
}

This class uses the life cycle methods to read in a list of starting URIs and save the set of outstanding URIs when shutting down. Also, it takes advantage of the scheduling functionality to rate limit the number of queries we perform.

Author
Luke Sandberg
Since
11.0

Nested and Inner Type Summary

Modifier and TypeClass and Description
pack-priv static interface
public abstract static class
AbstractScheduledService.CustomScheduler

A Scheduler that provides a convenient way for the AbstractScheduledService to use a dynamically changing schedule.

private static class
public abstract static class
AbstractScheduledService.Scheduler

A scheduler defines the policy for how the AbstractScheduledService should run its task.

private class

Field Summary

Modifier and TypeField and Description
private final AbstractService
private static final LazyLogger

Constructor Summary

AccessConstructor and Description
protected
AbstractScheduledService()

Constructor for use by subclasses.

Method Summary

Modifier and TypeMethod and Description
public final void
addListener(Service.Listener
the listener to run when the service changes state is complete
listener
,
Executor
the executor in which the listeners callback methods will be run. For fast, lightweight listeners that would be safe to execute in any thread, consider MoreExecutors#directExecutor.
executor
)

Implements com.google.common.util.concurrent.Service.addListener.

Registers a Listener to be executed on the given executor.
public final void
public final void
awaitRunning(Duration
the maximum time to wait
timeout
)

Overrides default com.google.common.util.concurrent.Service.awaitRunning.

Waits for the Service to reach the running state for no more than the given time.
public final void
awaitRunning(long
the maximum time to wait
timeout
,
TimeUnit
the time unit of the timeout argument
unit
)

Implements com.google.common.util.concurrent.Service.awaitRunning.

Waits for the Service to reach the running state for no more than the given time.
public final void
public final void
awaitTerminated(Duration
the maximum time to wait
timeout
)

Overrides default com.google.common.util.concurrent.Service.awaitTerminated.

Waits for the Service to reach a terminal state (either terminated or failed) for no more than the given time.
public final void
awaitTerminated(long
the maximum time to wait
timeout
,
TimeUnit
the time unit of the timeout argument
unit
)

Implements com.google.common.util.concurrent.Service.awaitTerminated.

Waits for the Service to reach a terminal state (either terminated or failed) for no more than the given time.
protected ScheduledExecutorService
executor()

Returns the ScheduledExecutorService that will be used to execute the startUp, runOneIteration and shutDown methods.

public final Throwable
failureCause()

Implements com.google.common.util.concurrent.Service.failureCause.

Returns the Throwable that caused this service to fail.
public final boolean
isRunning()

Implements com.google.common.util.concurrent.Service.isRunning.

Returns true if this service is running.
protected abstract void
runOneIteration()

Run one iteration of the scheduled task.

protected abstract AbstractScheduledService.Scheduler
scheduler()

Returns the Scheduler object used to configure this service.

protected String
serviceName()

Returns the name of this service.

protected void
shutDown()

Stop the service.

public final Service
startAsync()

Implements com.google.common.util.concurrent.Service.startAsync.

If the service state is State#NEW, this initiates service startup and returns immediately.
protected void
startUp()

Start the service.

public final Service.State
state()

Implements com.google.common.util.concurrent.Service.state.

Returns the lifecycle state of the service.
public final Service
stopAsync()

Implements com.google.common.util.concurrent.Service.stopAsync.

If the service is starting or running, this initiates service shutdown and returns immediately.
public String
toString()

Overrides java.lang.Object.toString.

Returns a string representation of the object.
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAllwaitwaitwait