Как избежать одновременного выполнения двух заданий в Quartz? - PullRequest
8 голосов
/ 12 декабря 2011

Ниже приведен код, в котором я выполняю два задания.Сначала с интервалом в 10 секунд, а другой с интервалом в 3 секунды.Но в конечном итоге в какой-то момент они будут выполняться одновременно.Есть ли механизм, чтобы избежать этой ситуации

    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);

Ответы [ 4 ]

3 голосов
/ 12 декабря 2011

Не полностью отвечая на ваш вопрос, но вот как вы можете запросить что-то работающее в поточно-ориентированном режиме:

//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
                    }
                }
            }
3 голосов
/ 13 декабря 2011

Настройте пул потоков кварца , чтобы иметь только одну нить.

org.quartz.threadPool.threadCount=1
2 голосов
/ 12 декабря 2011

Вы можете создать вспомогательный объект для синхронизации двух заданий:

//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
    }
}

Подробнее о синхронизации можно узнать по адресу: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

1 голос
/ 06 сентября 2014

Вы пробовали:

org.quartz.jobStore.isClustered: true

В качестве альтернативы, вы превращаете свою работу в работу с сохранением состояния (и устанавливаете для isClustered значение true), и это должно решить вашу проблему. (К сожалению, StatefulJob устарела; используйте DisallowConcurrentExecution.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...