2011-12-12 12 views
6

Mam tritten poniżej kodu, w którym mam dwa zadania. Najpierw z interwałem 10 sekund, a drugim z interwałem 3 sekund. Ale ostatecznie w pewnym momencie będą wykonywać w tym samym czasie. Czy istnieje jakiś mechanizm, aby uniknąć tej sytuacjiJak uniknąć dwóch zadań uruchomionych w tym samym czasie w Quartz?

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

Czy próbujesz upewnić się, że zadanie nie zostanie uruchomione dwukrotnie w tej samej maszynie JVM lub w wielu maszynach JVM? Ile czasu zajmuje też każde zadanie? Czy są one podsegmentowe, kilka sekund, kilka minut? – Bill

Odpowiedz

2

Można by utworzyć obiekt pomocnika, aby te dwa zadania zsynchronizowane:

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

Więcej o synchronizacji w: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

+1

ale OP stwierdził, że prowadzi dwie różne klasy, to nie rozwiąże jego sytuacji –

+0

@AngeloNeuschitzer jesteś absolutnie poprawny, nie złapał tam, gdzie do różnych klas do pracy. –

3

Nie całkowicie odpowiadając Twoje pytanie, ale możesz zapytać o coś działającego w sposób bezpieczny dla wątków:

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

fajny pomysł na wykorzystanie Harmonogramu jako obiektu oglądania! –

3

mieć tylko jeden wątek.

org.quartz.threadPool.threadCount=1 
0

Czy próbowałeś:

org.quartz.jobStore.isClustered: true 

Alternatywnie, możesz zrobić swoją pracę w Stateful pracy (i ustaw isClustered true), a shoujld rozwiązać problem. (Ups, StatefulJob jest przestarzałe, użyj DisallowConcurrentExecution.)

Powiązane problemy