public interface IInterruptableJob extends IJob
IJobs that provide a
mechanism for having their execution interrupted. It is NOT a requirement for
jobs to implement this interface - in fact, for most people, none of their
jobs will.
Interrupting a Job is very analogous in concept and challenge to
normal interruption of a Thread in Java.
The means of actually interrupting the Job must be implemented within the
Job itself (the interrupt() method of this
interface is simply a means for the scheduler to inform the Job
that a request has been made for it to be interrupted). The mechanism that
your jobs use to interrupt themselves might vary between implementations.
However the principle idea in any implementation should be to have the body
of the job's execute(..) periodically check some flag to see if
an interruption has been requested, and if the flag is set, somehow abort the
performance of the rest of the job's work. An example of interrupting a job
can be found in the java source for the class
org.quartz.examples.DumbInterruptableJob. It is legal to use
some combination of wait() and notify()
synchronization within interrupt() and execute(..)
in order to have the interrupt() method block until the
execute(..) signals that it has noticed the set flag.
If the Job performs some form of blocking I/O or similar functions, you may
want to consider having the Job.execute(..) method store a
reference to the calling Thread as a member variable. Then the
Implementation of this interfaces interrupt() method can call
interrupt() on that Thread. Before attempting this, make sure
that you fully understand what java.lang.Thread.interrupt() does
and doesn't do. Also make sure that you clear the Job's member reference to
the Thread when the execute(..) method exits (preferably in a
finally block.
See Example 7 (org.quartz.examples.example7.DumbInterruptableJob) for a simple implementation demonstration.
IJob,
IScheduler.interrupt(JobKey),
IScheduler.interrupt(String)| Modifier and Type | Method and Description |
|---|---|
void |
interrupt()
Called by the
when a user interrupts the
Job. |
void interrupt()
throws UnableToInterruptJobException
Called by the when a user interrupts the
ISchedulerJob.
UnableToInterruptJobException - if there is an exception while interrupting the job.Copyright © 2016–2021 Philip Helger. All rights reserved.