2010-03-13 11 views
7

Ho un'applicazione web che si sincronizza con un database centrale quattro volte all'ora. Il processo richiede in genere 2 minuti. Vorrei eseguire questo processo come una discussione in X: 55, X: 10, X: 25 e X: 40 in modo che gli utenti lo sappiano in X: 00, X: 15, X: 30 e X: 45 hanno una copia pulita del database. Si tratta solo di gestire le aspettative. Ho esaminato l'esecutore in java.util.concurrent ma la pianificazione è stata eseguita con lo scheduleAtFixedRate che, a mio avviso, non fornisce alcuna garanzia su quando questo viene effettivamente eseguito in termini di ore. Potrei usare un primo ritardo per lanciare il Runnable in modo che il primo sia vicino al tempo di avvio e pianificare per ogni 15 minuti, ma sembra che questo probabilmente divergerebbe nel tempo. C'è un modo più semplice per pianificare l'esecuzione del thread 5 minuti prima di ogni quarto d'ora?Esegui il thread java in orari specifici

risposta

9

È possibile lasciare che il programma Runnable sia la "prossima esecuzione".

Come ad esempio,

class Task implements Runnable { 
    private final ScheduledExecutorService service; 

    public Task(ScheduledExecutorService service){ 
     this.service = service; 
    } 

    public void run(){ 
     try{ 
      //do stuff 
     }finally{ 
      //Prevent this task from stalling due to RuntimeExceptions. 
      long untilNextInvocation = //calculate how many ms to next launch 
      service.schedule(new Task(service),untilNextInvocation,TimeUnit.MILLISECONDS); 
     } 
    } 
} 
+0

Dit in questo modo e sta lavorando in modo bello. Grazie. – rmarimon

+1

@rmarimon: NP :) Basta fare attenzione che un 'RuntimeException' può fermare l'esecuzione periodica. Sono stato bruciato da questo, quindi ho modificato la risposta di conseguenza. –

+0

L'ho appena cambiato. Mi è piaciuto provare {} catch (Exception e) {} e poi il reschedule. Ma finalmente sembra l'approccio giusto. – rmarimon

1

TimerTask gestisce questo caso.

Vedi schedule(TimerTask, Date)

Se non si desidera avere per mantenere la programmazione dei lavori, si consiglia di guardare in uno strumento di pianificazione lavoro come Quartz.

2

Quartz sarebbe una buona misura dal momento che l'applicazione è basata sul Web. Fornirà la pianificazione basata sul tempo a grana fine di cui hai bisogno.

quarzo è una fonte full-optional, aperto servizio di pianificazione lavoro che può essere integrato con, o utilizzati lungo il lato praticamente qualsiasi EE Java o Java SE applicazione - dalla più piccola applicazione stand-alone a il più grande sistema di e-commerce . Il quarzo può essere utilizzato per creare programmi semplici o complessi per l'esecuzione di decine, centinaia o addirittura decine di migliaia di posti di lavoro; lavori le cui attività sono definite come componenti standard Java che possono essere eseguite virtualmente da qualsiasi cosa si possa programmare da loro. Quartz Scheduler include molte funzioni di classe enterprise , come le transazioni JTA e il clustering.