esecuzione di attività periodiche sul lato server per il sito Web JSP MVC di servlet

Ho sviluppato un’applicazione web usando l’uso di servlet e JSP. Non sto usando alcun framework di per sé, usando invece il mio framework MVC fatto in casa. Sto usando MySQL come back-end.

Voglio fare quanto segue:

  1. Pulisci alcuni dati dal database ogni ora
  2. Genera e memorizza statistiche sui dati ogni 15 minuti in un file XML da qualche parte

Il problema è: attualmente tutto il mio codice viene eseguito come risultato della richiesta ricevuta da un client.

Come posso eseguire attività periodiche sul lato server?

Una soluzione che ho adesso è quella di creare un thread nella funzione init del controller. Ci sono altre opzioni?

    È ansible utilizzare ServletContextListener per eseguire l’inizializzazione all’avvio di webapp. Il modo standard dell’API Java per eseguire attività periodiche sarebbe una combinazione di Timer e TimerTask . Ecco un esempio di kickoff:

     public void contextInitialized(ServletContextEvent event) { Timer timer = new Timer(true); timer.scheduleAtFixedRate(new CleanDBTask(), 0, oneHourInMillis); timer.scheduleAtFixedRate(new StatisticsTask(), 0, oneQuartInMillis); } 

    dove possono apparire entrambi i compiti:

     public class CleanDBTask extends TimerTask { public void run() { // Implement. } } 

    Tuttavia, l’uso di Timer non è consigliato in Java EE. Se l’attività genera un’eccezione, l’intero thread Timer viene ucciso e in pratica è necessario riavviare l’intero server per farlo funzionare nuovamente. Il Timer è anche sensibile ai cambiamenti nell’orologio di sistema.

    Il modo più nuovo e più robusto java.util.concurrent sarebbe una combinazione di ScheduledExecutorService e solo un Runnable . Ecco un esempio di kickoff:

     private ScheduledExecutorService scheduler; public void contextInitialized(ServletContextEvent event) { scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(new CleanDBTask(), 0, 1, TimeUnit.HOURS); scheduler.scheduleAtFixedRate(new StatisticsTask(), 0, 15, TimeUnit.MINUTES); } public void contextDestroyed(ServletContextEvent event) { scheduler.shutdownNow(); } 

    puoi usare qualsiasi programma di pianificazione per pianificare il tuo processo come il quarzo, programmatore di spring

    http://static.springsource.org/spring/docs/2.5.x/reference/scheduling.html ha un buon supporto per queste cose con qualsiasi implementazione.