public class Timer extends TimerBase
TimeScheduleDateScheduleCountSchedule (With a count of 1)If Oddjob is running with a persister missed executions fire immediately one after the other until all missed executions have run.
This can be overridden with the skipMissedRuns property.
If a timer is started after the initial execution time but within the interval
of the schedule - execution will happen immediately. Extended intervals are created
using the from properties instead of the at/in/on
properties of schedules.
SetJob job within Oddjob.
The first method is to set the next due date directly with the
nextDue property. The existing timer is cancelled and the
job rescheduled to run at this time. If the time is in the past, the job
will run immediately.
reschedule property with
a date and time. The next due date is calculated by applying the date
and time the schedule. This is particularly useful for advancing a
timer.
Retry job.
ArchiveJob.
GrabJob.
<oddjob>
<job>
<scheduling:timer id="timer" xmlns:scheduling="http://rgordon.co.uk/oddjob/scheduling" xmlns:schedules="http://rgordon.co.uk/oddjob/schedules">
<schedule>
<schedules:weekly from="Monday" to="Friday">
<refinement>
<schedules:daily at="10:00"/>
</refinement>
</schedules:weekly>
</schedule>
<job>
<echo id="work">Doing some work at ${timer.current.fromDate}</echo>
</job>
</scheduling:timer>
</job>
</oddjob>
<oddjob>
<job>
<sequential>
<jobs>
<echo id="big-report" name="Pretend this is a Long Running Report">Meaning of Life: 42</echo>
<scheduling:timer id="timer" xmlns:scheduling="http://rgordon.co.uk/oddjob/scheduling">
<schedule>
<schedules:time from="10:00" xmlns:schedules="http://rgordon.co.uk/oddjob/schedules"/>
</schedule>
<job>
<echo name="Pretend this Forwards the Long Running Report">Emailing: ${big-report.text}</echo>
</job>
</scheduling:timer>
</jobs>
</sequential>
</job>
</oddjob>
If the report completes before 10am the timer will schedule it to be e-mailed
at 10am. If the report completes after 10am it is e-mailed immediately.
<oddjob>
<job>
<sequential id="main" name="Stop Overdue Job">
<jobs>
<scheduling:timer id="timer" xmlns:scheduling="http://rgordon.co.uk/oddjob/scheduling">
<schedule>
<schedules:count count="1" xmlns:schedules="http://rgordon.co.uk/oddjob/schedules">
<refinement>
<schedules:after>
<schedule>
<schedules:interval interval="00:00:10"/>
</schedule>
</schedules:after>
</refinement>
</schedules:count>
</schedule>
<job>
<stop job="${long-job}" name="Stop Long Running Job"/>
</job>
</scheduling:timer>
<wait id="long-job" name="A Long Running Job"/>
</jobs>
</sequential>
</job>
</oddjob>
The job will be stopped after 10 seconds. If the job has already completed
the stop will have no affect.
<oddjob>
<job>
<sequential>
<jobs>
<scheduling:timer id="timer" xmlns:scheduling="http://rgordon.co.uk/oddjob/scheduling">
<schedule>
<schedules:date on="9999-12-31" xmlns:schedules="http://rgordon.co.uk/oddjob/schedules"/>
</schedule>
<clock>
<value value="${clock}"/>
</clock>
<job>
<echo id="echo">Running at ${timer.current.fromDate}</echo>
</job>
</scheduling:timer>
<folder>
<jobs>
<set id="set">
<values>
<date date="2012-12-27 08:02" key="timer.nextDue"/>
</values>
</set>
</jobs>
</folder>
</jobs>
</sequential>
</job>
</oddjob>
Note that the current interval property is not changed, so
the echo job shows 'Running at 9999-12-31 00:00:00.000'.Example
Manually rescheduling the timer. When the set job is run manually, the
timer will advance to it's next scheduled slot.
<oddjob>
<job>
<sequential>
<jobs>
<scheduling:timer id="timer" xmlns:scheduling="http://rgordon.co.uk/oddjob/scheduling">
<schedule>
<schedules:daily at="23:00" xmlns:schedules="http://rgordon.co.uk/oddjob/schedules"/>
</schedule>
<clock>
<value value="${clock}"/>
</clock>
<job>
<echo id="echo">Running at ${timer.current.fromDate}</echo>
</job>
</scheduling:timer>
<folder>
<jobs>
<set id="set">
<values>
<date date="TOMORROW" key="timer.reschedule">
<clock>
<value value="${clock}"/>
</clock>
</date>
</values>
</set>
</jobs>
</folder>
</jobs>
</sequential>
</job>
</oddjob>
Note that the unlike above, current interval property
changes when the time is rescheduled.
- See Also:
- Serialized Form
- Author:
- Rob Gordon.
contextDatabegun, childHelper, childStateReflector, stateHandler, stop| Constructor and Description |
|---|
Timer() |
| Modifier and Type | Method and Description |
|---|---|
protected void |
begin()
Sub classes must override this to submit the first execution.
|
protected StateCondition |
getDefaultHaltOn() |
protected ResetAction |
getDefaultReset() |
protected IntervalTo |
getLimits()
Implementation provided by sub classes so limits are available in
TimerBase.scheduleFrom(Date). |
protected StateOperator |
getStateOp()
Sub classes provide the state operator that is used to calculate the subclasses
completion state.
|
boolean |
isHaltOnFailure() |
boolean |
isSkipMissedRuns() |
void |
setHaltOnFailure(boolean haltOnFailure) |
void |
setSkipMissedRuns(boolean skipMissedRuns) |
CancelAndStopChild, changeStateLocked, getClock, getCurrent, getHaltOn, getLastDue, getNextDue, getReset, getSchedule, getTimeZone, handleChildState, internalSetNextDue, onReset, onStop, postStop, reschedule, reset, scheduleFrom, setClock, setHaltOn, setJob, setNextDue, setReschedule, setReset, setSchedule, setScheduleExecutorService, setTimeZoneaddStructuralListener, fireDestroyedState, force, getStateChanger, hardReset, iconHelper, onDestroy, removeStructuralListener, run, softReset, stateHandler, stopconfigure, getName, logger, logger, loggerName, save, setName, toStringaddIconListener, addPropertyChangeListener, addStateListener, configure, destroy, firePropertyChange, getArooaSession, iconForId, initialise, lastStateEvent, onConfigured, onInitialised, removeIconListener, removePropertyChangeListener, removeStateListener, save, setArooaContext, setArooaSessionclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitaddStateListener, lastStateEvent, removeStateListenerprotected StateOperator getStateOp()
ScheduleBasegetStateOp in class ScheduleBaseprotected void begin()
throws ComponentPersistException
ScheduleBasebegin in class TimerBaseComponentPersistException - If the scheduled time can't be saved.public void setHaltOnFailure(boolean haltOnFailure)
public boolean isHaltOnFailure()
public boolean isSkipMissedRuns()
isSkipMissedRuns in class TimerBasepublic void setSkipMissedRuns(boolean skipMissedRuns)
protected IntervalTo getLimits()
TimerBaseTimerBase.scheduleFrom(Date).protected StateCondition getDefaultHaltOn()
getDefaultHaltOn in class TimerBaseprotected ResetAction getDefaultReset()
getDefaultReset in class TimerBase