@PublicApi
public interface SchedulerService
This service provides the ability to schedule services for execution, either as a one time task,
as a repeating task, or according to a formal cron-style schedule.
Applications and add-ons define the scheduled work to perform by registering a JobRunner
with a unique key. The scheduled work is performed according to individual
scheduled jobs that the define its configuration,
including when it should run and any parameters
that the job runner needs to know
The work to be performed is registered as a JobRunner, and the schedule and associated
data are set by scheduling a specific job for that runner. Multiple jobs can be
scheduled for a given job runner.
| Modifier and Type | Method and Description |
|---|---|
Date |
calculateNextRunTime(Schedule schedule)
Returns the next time that a job with the given schedule would be expected to run.
|
JobDetails |
getJobDetails(JobId jobId)
Retrieves the details for the specified job ID.
|
Set<JobRunnerKey> |
getJobRunnerKeysForAllScheduledJobs()
Returns all of the job runner keys that have been used to schedule jobs, regardless
of whether or not
JobRunners are currently registered for them. |
List<JobDetails> |
getJobsByJobRunnerKey(JobRunnerKey jobRunnerKey)
Retrieves the job details for all jobs with the given job runner key.
|
Set<JobRunnerKey> |
getRegisteredJobRunnerKeys()
Returns all of the job runner keys that currently have registered job runners, regardless
of whether or not any jobs have actually been
scheduled
for them. |
void |
registerJobRunner(JobRunnerKey jobRunnerKey,
JobRunner jobRunner)
Registers the job runner for a given job runner key.
|
void |
scheduleJob(JobId jobId,
JobConfig jobConfig)
Schedules a job with the given job ID.
|
JobId |
scheduleJobWithGeneratedId(JobConfig jobConfig)
Schedules a "dynamic" job by generating a new unique job ID.
|
void |
unregisterJobRunner(JobRunnerKey jobRunnerKey)
Unregisters the specified job runner.
|
void |
unscheduleJob(JobId jobId)
Unschedules a previously scheduled job ID.
|
void registerJobRunner(JobRunnerKey jobRunnerKey, JobRunner jobRunner)
jobRunnerKey will replace any existing registration.
A job that is scheduled to run but has no registered job runner is reported as
unavailable.
jobRunnerKey - Globally unique job runner key.jobRunner - the concrete object capable of running instances of this jobvoid unregisterJobRunner(JobRunnerKey jobRunnerKey)
Jobs that fire with no registered job runner will fail to start.
jobRunnerKey - Globally unique job runner key.@Nonnull Set<JobRunnerKey> getRegisteredJobRunnerKeys()
scheduled
for them. The job runner keys are not guaranteed to be returned in any particular order.getJobRunnerKeysForAllScheduledJobs()@Nonnull Set<JobRunnerKey> getJobRunnerKeysForAllScheduledJobs()
JobRunners are currently registered for them. The job
runner keys are not guaranteed to be returned in any particular order.getRegisteredJobRunnerKeys()void scheduleJob(JobId jobId, JobConfig jobConfig) throws SchedulerServiceException
If a job already exists with the given ID, then it will be replaced with the new run config. If the schedule is eligible to run immediately and multiple nodes take this action at close to the same time, then the job might run more than once as the instances replace one another.
In most cases, this will be harmless, but it can be avoided by making sure the job will not be eligible to run until some time in the future. For example, when using an interval schedule, the caller can first check whether or not the job already exists, and if it does not then specify an initial start date for the schedule, as in:
Schedule.forInterval(120000L, new Date(System.currentTimeMillis() + 15000L))
Since the schedule will not be eligible to run until 15 seconds after the current time, any race conditions between two nodes starting up at once and trying to schedule the same job should resolve before the job actually fires. For cron expressions, this is a little bit more difficult, but you can set the seconds field to an explicit value to accomplish the same thing. For example:
final Calendar calendar = new GregorianCalendar();
calendar.add(15, Calendar.SECOND);
final Schedule schedule = Schedule.forCronExpression(
calendar.get(Calendar.SECOND) + " 0 2 * * ?"); // at or just after 2 A.M.
scheduleJob(...
jobId - the Job IDjobConfig - the configuration details for the job instance including schedule,
run mode, run parameters, etc.SchedulerServiceException - if the job cannot be scheduled because there is a problem
with either the provided configuration or within the scheduler implementation itself@Nonnull JobId scheduleJobWithGeneratedId(JobConfig jobConfig) throws SchedulerServiceException
This method should normally only be used when creating multiple jobs for a given job runner key that need to run independently — most likely because these are created in response to user input.
jobConfig - the configuration details for the job instance including schedule,
run mode, run parameters, etc.SchedulerServiceException - if the job cannot be scheduled because there is a problem
with either the provided configuration or within the scheduler implementation itselfvoid unscheduleJob(JobId jobId)
If no such job exists, then the request is ignored.
jobId - the Job ID to be unregistered@Nullable Date calculateNextRunTime(Schedule schedule) throws SchedulerServiceException
Caveats:
JobDetails are not aware of the job that they came from
or whether or not that job has previously run. They are calculated on the basis of the current
time, not the original job's history.cron expressions are implicitly
validated by this request.schedule - the schedule to evaluatenull if it would never runSchedulerServiceException - if schedule is invalid.@CheckForNull JobDetails getJobDetails(JobId jobId)
jobId - the Job ID for which to retrieve the detailsnull if no such job is defined@Nonnull List<JobDetails> getJobsByJobRunnerKey(JobRunnerKey jobRunnerKey)
jobRunnerKey - the job runner key to look upnullCopyright © 2017 Atlassian. All rights reserved.