I’m using Play! framwork of version 1.2.4
In my application, I have implemented a number of scheduled jobs (descendants of play.jobs.Job).
Question
Can I change the schedule of these jobs at runtime?
My own findings
At first glance, the job scheduling in Play! is done via play.jobs.JobsPlugin, which in turn uses JDK’s java.util.concurrent.ScheduledThreadPoolExecutor instance which is publicly exposed. So far I came up with following approach: when it’s the moment to change schedule, I simply iterate over executor’ scheduled jobs, cancel one which I need to reschedule and schedule the same job (more precisely, the job of the same class) with new settings. Something like this:
for (final Object o: JobsPlugin.executor.getQueue())
{
ScheduledFuture task = (ScheduledFuture) o;
Job job = (Job) Java.extractUnderlyingCallable((FutureTask)task);
if (MyJob.class == job.getClass())
{
task.cancel(true);
new MyJob().every("2h");
break;
}
}
Are there any better solutions?
Thanks!
I am not sure your solution works because when you look at JobsPlugin call, it recalculates Job next planned execution date at the end of each job execution.
Here is my solution, I recreate a JobScheduler class to be able to calculate job execution date based on a cron attribute of my job. I had to redeclare some jobs attributes because of visibility rules.
So my job class is
And my scheduler class is
package jobs;
With this code, you can call JobScheduler.scheduleMyJob to change the scheduling of the job by passing the right scheduling expression : 0 0 2 * * ? for every 2 hours.
When the job terminates, the _finally method will recall the scheduleForCRON method which set the new scheduling time.
If you want to force execution of the job, for example through a gui button, you can create an instance without cron attribute define and this instance won’t reschedule itselft at the end