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
È 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);
}
}
}
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.
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.
- 1. Collegamenti a orari specifici in iframe YouTube incorporati
- 2. panda, pitone - come selezionare orari specifici in timeseries
- 3. Esegui codice su thread UI in WinRT
- 4. Esegui attività in più thread su node.js
- 5. Esegui/esegui il debug dell'applicazione OSGi in Eclipse
- 6. Esegui programma esterno in java
- 7. Affinità thread Java
- 8. System.exit in Java Thread
- 9. Java: esegui come amministratore
- 10. Timer in Java Thread
- 11. RejectedExecutionException in thread Java
- 12. Esegui codice Java online
- 13. Thread verde e thread nativi in java
- 14. Esegui i metodi Class nei thread (python)
- 15. E-mail automatica dell'output grafico pdf in orari specifici da R
- 16. Fusi orari in Python
- 17. iPhone iOS 4: programma l'app per eseguire le funzioni in orari e giorni specifici
- 18. Gli allarmi AWS CloudWatch possono essere messi in pausa/disattivati durante orari specifici?
- 19. Esegui più metodi java main in eclissi
- 20. Fusi orari in Rails
- 21. Esegui due thread che aspettano uno per l'altro mentre il thread principale continua
- 22. Come tradurre tra finestre e fusi orari IANA in java
- 23. JVM e fusi orari
- 24. Pool di thread in Java
- 25. Android - Esegui in background - Servizio vs. classe Java Standard
- 26. Eseguire il processo in background in thread diversi in Java
- 27. Esegui JSP direttamente da Java
- 28. Sicurezza thread in classe Java
- 29. È sicuro il thread Java Regex?
- 30. Exception in thread "main" java.lang.OutOfMemoryError: spazio heap Java
Dit in questo modo e sta lavorando in modo bello. Grazie. – rmarimon
@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. –
L'ho appena cambiato. Mi è piaciuto provare {} catch (Exception e) {} e poi il reschedule. Ma finalmente sembra l'approccio giusto. – rmarimon