## com.google.common.util.concurrent
Class AbstractScheduledService

    java.lang.Object
      com.google.common.util.concurrent.AbstractScheduledService

All Implemented Interfaces:
  Service

    @Beta
    public abstract class AbstractScheduledService

extends Object
implements Service

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 `AbstractScheduledService.Scheduler`. When this service is asked to stop via `stop()` or `stopAndWait()`, 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.

Since:
  11.0
Author:
  Luke Sandberg

Nested Class Summary
`static class` `AbstractScheduledService.CustomScheduler` A `AbstractScheduledService.Scheduler` that provides a convenient way for the `AbstractScheduledService` to use a dynamically changing schedule.
`static class` `AbstractScheduledService.Scheduler` A scheduler defines the policy for how the `AbstractScheduledService` should run its task.

Nested classes/interfaces inherited from interface com.google.common.util.concurrent.Service
`Service.Listener, Service.State`

Constructor Summary
`AbstractScheduledService()`

Method Summary
`void` `addListener(Service.Listener listener, Executor executor)` Registers a `Service.Listener` to be executed on the given executor.
`protected ScheduledExecutorService` `executor()` Returns the `ScheduledExecutorService` that will be used to execute the `startUp()`, `runOneIteration()` and `shutDown()` methods.
`boolean` `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 `AbstractScheduledService.Scheduler` object used to configure this service.
`protected void` `shutDown()` Stop the service.
`ListenableFuture<Service.State>` `start()` If the service state is `Service.State.NEW`, this initiates service startup and returns immediately.
`Service.State` `startAndWait()` Initiates service startup (if necessary), returning once the service has finished starting.
`protected void` `startUp()` Start the service.
`Service.State` `state()` Returns the lifecycle state of the service.
`ListenableFuture<Service.State>` `stop()` If the service is starting or running, this initiates service shutdown and returns immediately.
`Service.State` `stopAndWait()` Initiates service shutdown (if necessary), returning once the service has finished stopping.
`String` `toString()`

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

Constructor Detail

### AbstractScheduledService

    public AbstractScheduledService()

Method Detail

### runOneIteration

    protected abstract void runOneIteration()
                                     throws Exception

  Run one iteration of the scheduled task. If any invocation of this method throws an exception, the service will transition to the `Service.State.FAILED` state and this method will no longer be called.

  Throws:
    `Exception`

### startUp

    protected void startUp()
                    throws Exception

  Start the service.

  By default this method does nothing.

  Throws:
    `Exception`

### shutDown

    protected void shutDown()
                     throws Exception

  Stop the service. This is guaranteed not to run concurrently with `runOneIteration()`.

  By default this method does nothing.

  Throws:
    `Exception`

### scheduler

    protected abstract AbstractScheduledService.Scheduler scheduler()

  Returns the `AbstractScheduledService.Scheduler` object used to configure this service. This method will only be called once.

### executor

    protected ScheduledExecutorService executor()

  Returns the `ScheduledExecutorService` that will be used to execute the `startUp()`, `runOneIteration()` and `shutDown()` methods. The executor will not be `ExecutorService.shutdown()` when this service stops. Subclasses may override this method to use a custom `ScheduledExecutorService` instance.

  By default this returns a new `ScheduledExecutorService` with a single thread thread pool. This method will only be called once.

### toString

    public String toString()

  Overrides:
    `toString` in class `Object`

### start

    public final ListenableFuture<Service.State> start()

  Description copied from interface: `Service`
  If the service state is `Service.State.NEW`, this initiates service startup and returns immediately. If the service has already been started, this method returns immediately without taking action. A stopped service may not be restarted.

  Specified by:
    `start` in interface `Service`
  Returns:
    a future for the startup result, regardless of whether this call initiated startup. Calling `Future.get()` will block until the service has finished starting, and returns one of `Service.State.RUNNING`, `Service.State.STOPPING` or `Service.State.TERMINATED`. If the service fails to start, `Future.get()` will throw an `ExecutionException`, and the service's state will be `Service.State.FAILED`. If it has already finished starting, `Future.get()` returns immediately. Cancelling this future has no effect on the service.

### startAndWait

    public final Service.State startAndWait()

  Description copied from interface: `Service`
  Initiates service startup (if necessary), returning once the service has finished starting. Unlike calling `start().get()`, this method throws no checked exceptions, and it cannot be interrupted.

  Specified by:
    `startAndWait` in interface `Service`
  Returns:
    the state of the service when startup finished.

### isRunning

    public final boolean isRunning()

  Description copied from interface: `Service`
  Returns `true` if this service is running.

  Specified by:
    `isRunning` in interface `Service`

### state

    public final Service.State state()

  Description copied from interface: `Service`
  Returns the lifecycle state of the service.

  Specified by:
    `state` in interface `Service`

### stop

    public final ListenableFuture<Service.State> stop()

  Description copied from interface: `Service`
  If the service is starting or running, this initiates service shutdown and returns immediately. If the service is new, it is terminated without having been started nor stopped. If the service has already been stopped, this method returns immediately without taking action.

  Specified by:
    `stop` in interface `Service`
  Returns:
    a future for the shutdown result, regardless of whether this call initiated shutdown. Calling `Future.get()` will block until the service has finished shutting down, and either returns `Service.State.TERMINATED` or throws an `ExecutionException`. If it has already finished stopping, `Future.get()` returns immediately. Cancelling this future has no effect on the service.

### stopAndWait

    public final Service.State stopAndWait()

  Description copied from interface: `Service`
  Initiates service shutdown (if necessary), returning once the service has finished stopping. If this is `Service.State.STARTING`, startup will be cancelled. If this is `Service.State.NEW`, it is `terminated` without having been started nor stopped. Unlike calling `stop().get()`, this method throws no checked exceptions.

  Specified by:
    `stopAndWait` in interface `Service`
  Returns:
    the state of the service when shutdown finished.

### addListener

    public final void addListener(Service.Listener listener,
                                  Executor executor)

  Description copied from interface: `Service`
  Registers a `Service.Listener` to be executed on the given executor. The listener will have the corresponding transition method called whenever the service changes state. The listener will not have previous state changes replayed, so it is suggested that listeners are added before the service starts.

  There is no guaranteed ordering of execution of listeners, but any listener added through this method is guaranteed to be called whenever there is a state change.

  Exceptions thrown by a listener will be propagated up to the executor. Any exception thrown during `Executor.execute` (e.g., a `RejectedExecutionException` or an exception thrown by inline execution) will be caught and logged.

  Specified by:
    `addListener` in interface `Service`
  Parameters:
    `listener` - the listener to run when the service changes state is complete
    `executor` - the executor in which the the listeners callback methods will be run. For fast, lightweight listeners that would be safe to execute in any thread, consider `MoreExecutors.sameThreadExecutor()`.

Copyright © 2010-2012. All Rights Reserved.