2011-12-17 7 views
5

Ho un'applicazione Java EE che scarica i prezzi delle azioni da Internet ogni quindici minuti. Da un punto di vista della precisione temporale è meglio per l'applicazione internalizzare questa operazione periodica, ad esempio utilizzare Thread.sleep() in combinazione con un contatore o impostare un timer O sarebbe meglio esporre l'attività tramite un URL e fare in modo che un processo cron della piattaforma colpisca l'URL periodicamente (alla frequenza richiesta ovviamente).Utilizzare il job cron Thread.sleep(), Timer o piattaforma per un'operazione periodica nell'applicazione Java EE

Quali sono i pro e i contro di entrambi gli approcci?

Sono stato spaventato da un errore del timer che ho visto segnalato contro l'implementazione di OpenJDK. Il bug indicava che i cambiamenti nel tempo di sistema influivano sul funzionamento delle operazioni e dei metodi relativi al tempo, come la periodicità del sonno e del timer.

+1

Si dovrebbe considerare l'utilizzo di quarzo. – fge

+0

Perché qualcuno dovrebbe cambiare l'ora del sistema? –

+0

Correlati: http://stackoverflow.com/questions/7499534/applicationscope-bean-that-uses-a-timertask-sheduler-good-or-bad/7499769#7499769 e http://stackoverflow.com/questions/5357033/background-timer-task-in-jsp-servlet-web-application/5357856 # 5357856 – BalusC

risposta

1

Considerare senz'altro l'utilizzo di un processo di pianificazione creato per l'attività. Prova a suddividere il compito stesso da qualsiasi considerazione temporale.

  • Come è stato suggerito, il quarzo è una buona scelta.
  • Cron non è male, ma richiederebbe più impostazioni per l'integrazione con l'attività .
  • Se su Java EE è possibile utilizzare un timer EJB.
  • Si può rotolare il proprio con ScheduledExecutorService (non raccomandato)
1

Thread.sleep non è un metodo consigliato per eseguire periodicamente il codice. È impreciso e di solito è un segno di cattivo design. Ti suggerisco di usare la classe Timer per programmare facilmente l'esecuzione del codice periodicamente.

2

Timer non è deprecato, ma ora esiste un'alternativa migliore: SheduledExecutorService. Uno dei fattori che lo rende migliore è che utilizza il tempo relativo piuttosto che il tempo assoluto per la pianificazione.

L'utilizzo di uno script cron esterno o di un timer interno è solo una questione o una preferenza, IMHO. Un timer interno è più semplice da configurare, ma se hai già altri crons, potresti volerne uno aggiuntivo e avere questa responsabilità in un unico posto.