APIdia Launch Partner
Top Description Fields Constructors Methods
javafx.concurrent

public abstract Class ScheduledService<V>

extends Service<V>
Class Inheritance
Type Parameters
<V>
The computed value of the ScheduledService
Imports
javafx.beans.property.BooleanProperty, .IntegerProperty, .ObjectProperty, .ReadOnlyIntegerProperty, .ReadOnlyIntegerWrapper, .ReadOnlyObjectProperty, .ReadOnlyObjectWrapper, .SimpleBooleanProperty, .SimpleIntegerProperty, .SimpleObjectProperty, javafx.util.Callback, .Duration, java.util.Timer, .TimerTask

The ScheduledService is a Service that will automatically restart itself after a successful execution, and under some conditions will restart even in case of failure. A new ScheduledService begins in the READY state, just as a normal Service. After calling start or restart, the ScheduledService will enter the SCHEDULED state for the duration specified by delay.

Once RUNNING, the ScheduledService will execute its Task. On successful completion, the ScheduledService will transition to the SUCCEEDED state, and then to the READY state and back to the SCHEDULED state. The amount of time the ScheduledService will remain in this state depends on the amount of time between the last state transition to RUNNING, and the current time, and the period. In short, the period defines the minimum amount of time from the start of one run and the start of the next. If the previous execution completed before period expires, then the ScheduledService will remain in the SCHEDULED state until the period expires. If on the other hand the execution took longer than the specified period, then the ScheduledService will immediately transition back to RUNNING.

If, while RUNNING, the ScheduledService's Task throws an error or in some other way ends up transitioning to FAILED, then the ScheduledService will either restart or quit, depending on the values for backoffStrategy, restartOnFailure, and maximumFailureCount.

If a failure occurs and restartOnFailure is false, then the ScheduledService will transition to FAILED and will stop. To restart a failed ScheduledService, you must call restart manually.

If a failure occurs and restartOnFailure is true, then the the ScheduledService may restart automatically. First, the result of calling backoffStrategy will become the new cumulativePeriod. In this way, after each failure, you can cause the service to wait a longer and longer period of time before restarting. Once the task completes successfully, the cumulativePeriod is reset to the value of period.

ScheduledService defines static EXPONENTIAL_BACKOFF_STRATEGY and LOGARITHMIC_BACKOFF_STRATEGY implementations, of which LOGARITHMIC_BACKOFF_STRATEGY is the default value for backoffStrategy. After maximumFailureCount is reached, the ScheduledService will transition to FAILED in exactly the same way as if restartOnFailure were false.

If the period or delay is changed while the ScheduledService is running, the new values will be taken into account on the next iteration. For example, if the period is increased, then the next time the ScheduledService enters the SCHEDULED state, the new period will be used. Likewise, if the delay is changed, the new value will be honored on the next restart or reset/start.

The ScheduledService is typically used for use cases that involve polling. For example, you may want to ping a server on a regular basis to see if there are any updates. Such as ScheduledService might be implemented like this:

ScheduledService<Document> svc = new ScheduledService<Document>() {
    protected Task<Document> createTask() {
        return new Task<Document>() {
            protected Document call() {
                // Connect to a Server
                // Get the XML document
                // Parse it into a document
                return document;
            }
        };
    }
};
svc.setPeriod(Duration.seconds(1));
This example will ping the remote server every 1 second.

Timing for this class is not absolutely reliable. A very busy event thread might introduce some timing lag into the beginning of the execution of the background Task, so very small values for the period or delay are likely to be inaccurate. A delay or period in the hundreds of milliseconds or larger should be fairly reliable.

The ScheduledService in its default configuration has a default period of 0 and a default delay of 0. This will cause the ScheduledService to execute the task immediately upon start(), and re-executing immediately upon successful completion.

For this purposes of this class, any Duration that answers true to javafx.util.Duration#isUnknown() will treat that duration as if it were Duration.ZERO. Likewise, any Duration which answers true to javafx.util.Duration#isIndefinite() will be treated as if it were a duration of Double.MAX_VALUE milliseconds. Any null Duration is treated as Duration.ZERO. Any custom implementation of a backoff strategy callback must be prepared to handle these different potential values.

The ScheduledService introduces a new property called lastValue. The lastValue is the value that was last successfully computed. Because a Service clears its value property on each run, and because the ScheduledService will reschedule a run immediately after completion (unless it enters the cancelled or failed states), the value property is not overly useful on a ScheduledService. In most cases you will want to instead use the value returned by lastValue.

Implementation Note

The ready(), scheduled(), running(), succeeded(), cancelled(), and failed() methods are implemented in this class. Subclasses which also override these methods must take care to invoke the super implementation.

Since
JavaFX 8.0

Field Summary

Modifier and TypeField and Description
private ObjectProperty<Callback<ScheduledService<?>, Duration>>
backoffStrategy

Computes the amount of time to add to the period on each failure.

private ReadOnlyObjectWrapper<Duration>
cumulativePeriod

The current cumulative period in use between iterations.

private ReadOnlyIntegerWrapper
currentFailureCount

The current number of times the ScheduledService has failed.

private ObjectProperty<Duration>
delay

The initial delay between when the ScheduledService is first started, and when it will begin operation.

private static final Timer
DELAY_TIMER

This Timer is used to schedule the delays for each ScheduledService.

private TimerTask
delayTask

This is a TimerTask scheduled with the DELAY_TIMER.

public static final Callback<ScheduledService<?>, Duration>
EXPONENTIAL_BACKOFF_STRATEGY

A Callback implementation for the backoffStrategy property which will exponentially backoff the period between re-executions in the case of a failure.

private boolean
freshStart

Whether or not this iteration is a "fresh start", such as the initial call to start, or a call to restart, or a call to reset followed by a call to start.

private long
lastRunTime

The timestamp of the last time the task was run.

private ReadOnlyObjectWrapper<V>
lastValue

The last successfully computed value.

public static final Callback<ScheduledService<?>, Duration>
LINEAR_BACKOFF_STRATEGY

A Callback implementation for the backoffStrategy property which will linearly backoff the period between re-executions in the case of a failure.

public static final Callback<ScheduledService<?>, Duration>
LOGARITHMIC_BACKOFF_STRATEGY

A Callback implementation for the backoffStrategy property which will logarithmically backoff the period between re-executions in the case of a failure.

private ObjectProperty<Duration>
maximumCumulativePeriod

The maximum allowed value for the cumulativePeriod.

private IntegerProperty
maximumFailureCount

The maximum number of times the ScheduledService can fail before it simply ends in the FAILED state.

private ObjectProperty<Duration>
period

The minimum amount of time to allow between the start of the last run and the start of the next run.

private BooleanProperty
restartOnFailure

Indicates whether the ScheduledService should automatically restart in the case of a failure in the Task.

private boolean
stop

This is set to false when the "cancel" method is called, and reset to true on "reset".

Constructor Summary

AccessConstructor and Description
public
ScheduledService()

Constructor for subclasses to call.

Method Summary

Modifier and TypeMethod and Description
public final ObjectProperty<Callback<ScheduledService<?>, Duration>>
public boolean

Returns:

whether any running task was cancelled, false if no task was cancelled. In any case, the ScheduledService will stop iterating.
cancel
()

Overrides javafx.concurrent.Service.cancel.

Implements javafx.concurrent.Worker.cancel.

Cancels any currently running task and stops this scheduled service, such that no additional iterations will occur.

pack-priv long

Returns:

The clock time
clock
()

Gets the time of the current clock.

private TimerTask

Returns:

the delay TimerTask.
createTimerTask
(final Task<V>
must not be null.
task
)

Creates the TimerTask used for delaying execution.

public final ReadOnlyObjectProperty<Duration>
public final ReadOnlyIntegerProperty
public final ObjectProperty<Duration>
protected void
executeTask(final Task<V> task)

Overrides javafx.concurrent.Service.executeTask.

Uses the executor defined on this Service to execute the given task.

private void
executeTaskNow(Task<V>
must not be null
task
)

Called when it is time to actually execute the task (any delay has by now been accounted for).

protected void
failed()

Overrides javafx.concurrent.Service.failed.

A protected convenience method for subclasses, called whenever the state of the Service has transitioned to the FAILED state.

public final Callback<ScheduledService<?>, Duration>
public final Duration
public final int
public final Duration
public final V
public final Duration
public final int
public final Duration
public final boolean
pack-priv boolean

Returns:

freshStart
isFreshStart
()

This method only exists for the sake of testing.

public final ReadOnlyObjectProperty<V>
public final ObjectProperty<Duration>
public final IntegerProperty
private static double

Returns:

a double representing the millis.
normalize
(Duration
can be null
d
)

Normalize our handling of Durations according to the class documentation.

public final ObjectProperty<Duration>
public void
reset()

Overrides javafx.concurrent.Service.reset.

Resets the Service.

public final BooleanProperty
pack-priv void
schedule(TimerTask
not null
task
,
long
>= 0
delay
)

This method exists only for testing purposes.

public final void
pack-priv void
private void
public final void
public final void
public final void
public final void
public final void
setRestartOnFailure(boolean value)

protected void
succeeded()

Overrides javafx.concurrent.Service.succeeded.

A protected convenience method for subclasses, called whenever the state of the Service has transitioned to the SUCCEEDED state.

private void
superReset()

Called by this class when we need to avoid calling this class' implementation of reset which has the side effect of resetting the "freshStart", currentFailureCount, and other state.

Inherited from javafx.concurrent.Service:
addEventFilteraddEventHandlerbuildEventDispatchChaincancelFromReadyStatecancelledcheckThreadcreateTaskexceptionPropertyexecutorPropertyfireEventgetExceptiongetExecutorgetMessagegetOnCancelledgetOnFailedgetOnReadygetOnRunninggetOnScheduledgetOnSucceededgetProgressgetStategetTitlegetTotalWorkgetValuegetWorkDoneisFxApplicationThreadisRunningmessagePropertyonCancelledPropertyonFailedPropertyonReadyPropertyonRunningPropertyonScheduledPropertyonSucceededPropertyprogressPropertyreadyremoveEventFilterremoveEventHandlerrestartrunLaterrunningrunningPropertyscheduledsetEventHandlersetExecutorsetOnCancelledsetOnFailedsetOnReadysetOnRunningsetOnScheduledsetOnSucceededstartstatePropertytitlePropertytotalWorkPropertyvaluePropertyworkDoneProperty

Field Detail

backoffStrategyback to summary
private ObjectProperty<Callback<ScheduledService<?>, Duration>> backoffStrategy

Computes the amount of time to add to the period on each failure. This cumulative amount is reset whenever the the ScheduledService is manually restarted.

cumulativePeriodback to summary
private ReadOnlyObjectWrapper<Duration> cumulativePeriod

The current cumulative period in use between iterations. This will be the same as period, except after a failure, in which case the result of the backoffStrategy will be used as the cumulative period following each failure. This is reset whenever the ScheduledService is manually restarted or an iteration is successful. The cumulativePeriod is modified when the ScheduledService enters the scheduled state. The cumulativePeriod can be capped by setting the maximumCumulativePeriod.

currentFailureCountback to summary
private ReadOnlyIntegerWrapper currentFailureCount

The current number of times the ScheduledService has failed. This is reset whenever the ScheduledService is manually restarted.

delayback to summary
private ObjectProperty<Duration> delay

The initial delay between when the ScheduledService is first started, and when it will begin operation. This is the amount of time the ScheduledService will remain in the SCHEDULED state, before entering the RUNNING state, following a fresh invocation of start() or restart().

DELAY_TIMERback to summary
private static final Timer DELAY_TIMER

This Timer is used to schedule the delays for each ScheduledService. A single timer ought to be able to easily service thousands of ScheduledService objects.

delayTaskback to summary
private TimerTask delayTask

This is a TimerTask scheduled with the DELAY_TIMER. All it does is kick off the execution of the actual background Task.

EXPONENTIAL_BACKOFF_STRATEGYback to summary
public static final Callback<ScheduledService<?>, Duration> EXPONENTIAL_BACKOFF_STRATEGY

A Callback implementation for the backoffStrategy property which will exponentially backoff the period between re-executions in the case of a failure. This computation takes the original period and the number of consecutive failures and computes the backoff amount from that information.

If the service is null, then Duration.ZERO is returned. If the period is 0 then the result of this method will simply be Math.exp(currentFailureCount). In all other cases, the returned value is the same as period + (period * Math.exp(currentFailureCount)).

freshStartback to summary
private boolean freshStart

Whether or not this iteration is a "fresh start", such as the initial call to start, or a call to restart, or a call to reset followed by a call to start.

lastRunTimeback to summary
private long lastRunTime

The timestamp of the last time the task was run. This is used to compute the amount of delay between successive iterations by taking the cumulativePeriod into account.

lastValueback to summary
private ReadOnlyObjectWrapper<V> lastValue

The last successfully computed value. During each iteration, the "value" of the ScheduledService will be reset to null, as with any other Service. The "lastValue" however will be set to the most recently successfully computed value, even across iterations. It is reset however whenever you manually call reset or restart.

LINEAR_BACKOFF_STRATEGYback to summary
public static final Callback<ScheduledService<?>, Duration> LINEAR_BACKOFF_STRATEGY

A Callback implementation for the backoffStrategy property which will linearly backoff the period between re-executions in the case of a failure. This computation takes the original period and the number of consecutive failures and computes the backoff amount from that information.

If the service is null, then Duration.ZERO is returned. If the period is 0 then the result of this method will simply be currentFailureCount. In all other cases, the returned value is the same as period + (period * currentFailureCount).

LOGARITHMIC_BACKOFF_STRATEGYback to summary
public static final Callback<ScheduledService<?>, Duration> LOGARITHMIC_BACKOFF_STRATEGY

A Callback implementation for the backoffStrategy property which will logarithmically backoff the period between re-executions in the case of a failure. This computation takes the original period and the number of consecutive failures and computes the backoff amount from that information.

If the service is null, then Duration.ZERO is returned. If the period is 0 then the result of this method will simply be Math.log1p(currentFailureCount). In all other cases, the returned value is the same as period + (period * Math.log1p(currentFailureCount)).

maximumCumulativePeriodback to summary
private ObjectProperty<Duration> maximumCumulativePeriod

The maximum allowed value for the cumulativePeriod. Setting this value will help ensure that in the case of repeated failures the back-off algorithm doesn't end up producing unreasonably large values for cumulative period. The cumulative period is guaranteed not to be any larger than this value. If the maximumCumulativePeriod is negative, then cumulativePeriod will be capped at 0. If maximumCumulativePeriod is NaN or null, then it will not influence the cumulativePeriod.

maximumFailureCountback to summary
private IntegerProperty maximumFailureCount

The maximum number of times the ScheduledService can fail before it simply ends in the FAILED state. You can of course restart the ScheduledService manually, which will cause the current count to be reset.

periodback to summary
private ObjectProperty<Duration> period

The minimum amount of time to allow between the start of the last run and the start of the next run. The actual period (also known as cumulativePeriod) will depend on this property as well as the backoffStrategy and number of failures.

restartOnFailureback to summary
private BooleanProperty restartOnFailure

Indicates whether the ScheduledService should automatically restart in the case of a failure in the Task.

stopback to summary
private boolean stop

This is set to false when the "cancel" method is called, and reset to true on "reset". We need this so that any time the developer calls 'cancel', even when from within one of the event handlers, it will cause us to transition to the cancelled state.

Constructor Detail

ScheduledServiceback to summary
public ScheduledService()

Constructor for subclasses to call.

Method Detail

backoffStrategyPropertyback to summary
public final ObjectProperty<Callback<ScheduledService<?>, Duration>> backoffStrategyProperty()
cancelback to summary
public boolean cancel()

Overrides javafx.concurrent.Service.cancel.

Implements javafx.concurrent.Worker.cancel.

Cancels any currently running task and stops this scheduled service, such that no additional iterations will occur.

Returns:boolean

whether any running task was cancelled, false if no task was cancelled. In any case, the ScheduledService will stop iterating.

Annotations
@Override
clockback to summary
pack-priv long clock()

Gets the time of the current clock. At runtime this is simply getting the results of System.currentTimeMillis, however during testing this is hammered so as to return a time that works well during testing.

Returns:long

The clock time

createTimerTaskback to summary
private TimerTask createTimerTask(final Task<V> task)

Creates the TimerTask used for delaying execution. The delay can either be due to the initial delay (if this is a freshStart), or it can be the computed delay in order to execute the task on its fixed schedule.

Parameters
task:Task<V>

must not be null.

Returns:TimerTask

the delay TimerTask.

cumulativePeriodPropertyback to summary
public final ReadOnlyObjectProperty<Duration> cumulativePeriodProperty()
currentFailureCountPropertyback to summary
public final ReadOnlyIntegerProperty currentFailureCountProperty()
delayPropertyback to summary
public final ObjectProperty<Duration> delayProperty()
executeTaskback to summary
protected void executeTask(final Task<V> task)

Overrides javafx.concurrent.Service.executeTask.

Doc from javafx.concurrent.Service.executeTask.

Uses the executor defined on this Service to execute the given task. If the executor is null, then a default executor is used which will create a new daemon thread on which to execute this task.

This method is intended only to be called by the Service implementation.

Annotations
@Override
executeTaskNowback to summary
private void executeTaskNow(Task<V> task)

Called when it is time to actually execute the task (any delay has by now been accounted for). Essentially this ends up simply calling the super implementation of executeTask and doing some bookkeeping.

Parameters
task:Task<V>

must not be null

failedback to summary
protected void failed()

Overrides javafx.concurrent.Service.failed.

Doc from javafx.concurrent.Service.failed.

A protected convenience method for subclasses, called whenever the state of the Service has transitioned to the FAILED state. This method is invoked after the Service has been fully transitioned to the new state. Implementation Note: Subclasses which override this method must call this super implementation.

Annotations
@Override
getBackoffStrategyback to summary
public final Callback<ScheduledService<?>, Duration> getBackoffStrategy()
getCumulativePeriodback to summary
public final Duration getCumulativePeriod()
getCurrentFailureCountback to summary
public final int getCurrentFailureCount()
getDelayback to summary
public final Duration getDelay()
getLastValueback to summary
public final V getLastValue()
getMaximumCumulativePeriodback to summary
public final Duration getMaximumCumulativePeriod()
getMaximumFailureCountback to summary
public final int getMaximumFailureCount()
getPeriodback to summary
public final Duration getPeriod()
getRestartOnFailureback to summary
public final boolean getRestartOnFailure()
isFreshStartback to summary
pack-priv boolean isFreshStart()

This method only exists for the sake of testing.

Returns:boolean

freshStart

lastValuePropertyback to summary
public final ReadOnlyObjectProperty<V> lastValueProperty()
maximumCumulativePeriodPropertyback to summary
public final ObjectProperty<Duration> maximumCumulativePeriodProperty()
maximumFailureCountPropertyback to summary
public final IntegerProperty maximumFailureCountProperty()
normalizeback to summary
private static double normalize(Duration d)

Normalize our handling of Durations according to the class documentation.

Parameters
d:Duration

can be null

Returns:double

a double representing the millis.

periodPropertyback to summary
public final ObjectProperty<Duration> periodProperty()
resetback to summary
public void reset()

Overrides javafx.concurrent.Service.reset.

Doc from javafx.concurrent.Service.reset.

Resets the Service. May only be called while in one of the finish states, that is, SUCCEEDED, FAILED, or CANCELLED, or when READY. This method should only be called on the FX application thread. Implementation Note: Subclasses which override this method must call this super implementation.

Annotations
@Override
restartOnFailurePropertyback to summary
public final BooleanProperty restartOnFailureProperty()
scheduleback to summary
pack-priv void schedule(TimerTask task, long delay)

This method exists only for testing purposes. The normal implementation will delegate to a java.util.Timer, however during testing we want to simply inspect the value for the delay and execute immediately.

Parameters
task:TimerTask

not null

delay:long

>= 0

setBackoffStrategyback to summary
public final void setBackoffStrategy(Callback<ScheduledService<?>, Duration> value)
setCumulativePeriodback to summary
pack-priv void setCumulativePeriod(Duration value)
setCurrentFailureCountback to summary
private void setCurrentFailureCount(int value)
setDelayback to summary
public final void setDelay(Duration value)
setMaximumCumulativePeriodback to summary
public final void setMaximumCumulativePeriod(Duration value)
setMaximumFailureCountback to summary
public final void setMaximumFailureCount(int value)
setPeriodback to summary
public final void setPeriod(Duration value)
setRestartOnFailureback to summary
public final void setRestartOnFailure(boolean value)
succeededback to summary
protected void succeeded()

Overrides javafx.concurrent.Service.succeeded.

Doc from javafx.concurrent.Service.succeeded.

A protected convenience method for subclasses, called whenever the state of the Service has transitioned to the SUCCEEDED state. This method is invoked after the Service has been fully transitioned to the new state. Implementation Note: Subclasses which override this method must call this super implementation.

Annotations
@Override
superResetback to summary
private void superReset()

Called by this class when we need to avoid calling this class' implementation of reset which has the side effect of resetting the "freshStart", currentFailureCount, and other state.