public void schedule(TimerTask task, Duration delay, Duration period) {
        TimerTaskWrapper taskWrapper = new TimerTaskWrapper(task);
        wrappedTasks.put(task, taskWrapper);
        timer.schedule(taskWrapper, delay.toMillis(), period.toMillis());
    }
Schedules the specified task for repeated <i>fixed-delay execution</i>,
beginning after the specified delay.  Subsequent executions take place
at approximately regular intervals separated by the specified period.

<p>In fixed-delay execution, each execution is scheduled relative to
the actual execution time of the previous execution.  If an execution
is delayed for any reason (such as garbage collection or other
background activity), subsequent executions will be delayed as well.
In the long run, the frequency of execution will generally be slightly
lower than the reciprocal of the specified period (assuming the system
clock underlying {@code Object.wait(long)} is accurate).

<p>Fixed-delay execution is appropriate for recurring activities
that require "smoothness."  In other words, it is appropriate for
activities where it is more important to keep the frequency accurate
in the short run than in the long run.  This includes most animation
tasks, such as blinking a cursor at regular intervals.  It also includes
tasks wherein regular activity is performed in response to human
input, such as automatically repeating a character as long as a key
is held down.

@param task task to be scheduled.
@param delay  delay before task is to be executed.
@param period time between successive task executions.
@throws IllegalArgumentException if {@code delay} is negative, or
        {@code delay + System.currentTimeMillis()} is negative.
@throws IllegalStateException if task was already scheduled or
        cancelled, timer was cancelled, or timer thread terminated.
xmppserver/src/main/java/org/jivesoftware/util/TaskEngine.java