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.
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.
| Modifier and Type | Class and Description |
|---|---|
| pack-priv static interface | |
| public abstract static class | AbstractScheduledService.CustomScheduler
A |
| private static class | |
| public abstract static class | AbstractScheduledService.Scheduler
A scheduler defines the policy for how the |
| private class |
| Modifier and Type | Field and Description |
|---|---|
| private final AbstractService | |
| private static final Logger |
| Access | Constructor and Description |
|---|---|
| protected |
| Modifier and Type | Method and Description |
|---|---|
| public final void | addListener(Service.
the listener to run when the service changes state is complete listener,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 executor)MoreExecutors#directExecutor.Implements com. Listener to be executed on the given
executor.
|
| public final void | awaitRunning()
Implements com. Service to reach the running state.
|
| public final void | awaitRunning(Duration
the maximum time to wait timeout)Overrides default com. 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. Service to reach the running state for no more
than the given time.
|
| public final void | awaitTerminated()
Implements com. Service to reach the terminated state.
|
| public final void | awaitTerminated(Duration
the maximum time to wait timeout)Overrides default com. 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. Service to reach a terminal state (either terminated or failed) for no more than the given time.
|
| protected ScheduledExecutorService | executor()
Returns the |
| public final Throwable | failureCause()
Implements com. Throwable that caused this service to fail.
|
| public final boolean | isRunning()
Implements com. true if this service is running.
|
| protected abstract void | |
| protected abstract AbstractScheduledService. | |
| protected String | |
| protected void | |
| public final Service | startAsync()
Implements com. State#NEW, this initiates service startup and returns
immediately.
|
| protected void | |
| public final Service. | state()
Implements com. |
| public final Service | stopAsync()
Implements com. |
| public String |