Reputation: 645
I have tritten below code in which I am running two jobs. First with the interval of 10 seconds and the other with the interval of 3 seconds. But ultimately at some point they will execute at the same time. Is there any mechanism to avoid this situation
JobDetail jDetail = new JobDetail("Job1", "group1", MyJob.class);
CronTrigger crTrigger = new CronTrigger("cronTrigger", "group1", "0/10 * * * * ?");
sche.scheduleJob(jDetail, crTrigger);
jDetail = new JobDetail("Job2","group2",MyJob2.class);
crTrigger = new CronTrigger("cronTrigger2","group2","0/3 * * * * ?");
sche.scheduleJob(jDetail, crTrigger);
Upvotes: 8
Views: 8989
Reputation: 976
Have you tried:
org.quartz.jobStore.isClustered: true
Alternatively, you make your job into a Stateful job (and set isClustered to true), and that shoujld solve your problem. (Oops, StatefulJob is deprecated; use DisallowConcurrentExecution.)
Upvotes: 1
Reputation: 937
Configure the Quartz threadpool to have only one thread.
org.quartz.threadPool.threadCount=1
Upvotes: 3
Reputation: 915
You could create a helper object to make the two jobs synchronized:
//In the base class
public static Object lock = new Object();
//In the first class
public void execute() {
synchronized(lock) {
//do stuff
}
}
//In the second class
public void execute() {
synchronized(lock) {
//do stuff
}
}
Read more about synchronization at: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
Upvotes: 2
Reputation: 21421
Not completely answering your question but this is how you can query for something running in a thread-safe manner:
//sched is your org.quartz.Scheduler
synchronized (sched) {
JobDetail existingJobDetail = sched.getJobDetail(jobName, jobGroup);
if (existingJobDetail != null) {
List<JobExecutionContext> currentlyExecutingJobs = (List<JobExecutionContext>) sched.getCurrentlyExecutingJobs();
for (JobExecutionContext jec : currentlyExecutingJobs) {
if (existingJobDetail.equals(jec.getJobDetail())) {
// This job is currently executing
}
}
}
Upvotes: 3