2010-06-17 12 views
7

Ho bisogno di eseguire un'operazione periodica (chiama un metodo java) nella mia app web (jsp su tomcat). Come posso fare questo? Demone Java o altre soluzioni?Come posso creare un Demone Java

+0

post simile http://stackoverflow.com/questions/3053936/how-to-execute-task-for-a-specific-period-in-java/3053971#3053971 –

risposta

8

È possibile utilizzare un ScheduledExecutorService per l'esecuzione periodica di un'attività. Tuttavia, se hai bisogno di una programmazione più complessa come cron, dai uno sguardo allo Quartz. In particolare, consiglierei di usare Quartz in conjunction with Spring se segui questa strada, poiché fornisce un'API più carina e ti consente di controllare il licenziamento del lavoro nella configurazione.

ScheduledExecutorService Esempio (tratto da Javadoc)

import static java.util.concurrent.TimeUnit.*; 
class BeeperControl { 
    private final ScheduledExecutorService scheduler = 
     Executors.newScheduledThreadPool(1); 

    public void beepForAnHour() { 
     final Runnable beeper = new Runnable() { 
       public void run() { System.out.println("beep"); } 
      }; 
     final ScheduledFuture<?> beeperHandle = 
      scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); 
     scheduler.schedule(new Runnable() { 
       public void run() { beeperHandle.cancel(true); } 
      }, 60 * 60, SECONDS); 
    } 
} 
+0

Le mie operazioni non hanno un'ora di fine . Ho bisogno di farlo, per esempio, ogni settimana. Come posso fare questo? – enfix

+0

Se si utilizza ScheduledExecutorService è necessario utilizzare scheduleWithFixedDelay o scheduleAtFixedRate. Per le attività in esecuzione una volta alla settimana o in determinati periodi del mese tendo a preferire il quarzo, in quanto è possibile fornire un'espressione cron semplice nella configurazione che descrive le esatte volte in cui il lavoro deve essere eseguito. – Adamski

4

Adams risposta è proprio sul prezzo. Se finisci col rotolare per conto tuo (piuttosto che seguire la rotta del quarzo), ti consigliamo di dare il via a qualcosa in un ServletContextListener. Ecco un esempio, utilizzando java.util.Timer, che è più o meno una versione stupida di ScheduledExexutorPool.

public class TimerTaskServletContextListener implements ServletContextListener 
{ 
    private Timer timer; 

    public void contextDestroyed(ServletContextEvent sce) 
    { 
     if (timer != null) { 
     timer.cancel(); 
     } 
    } 

    public void contextInitialized(ServletContextEvent sce) 
    { 
     Timer timer = new Timer(); 
     TimerTask myTask = new TimerTask() { 
     @Override 
     public void run() 
     { 
      System.out.println("I'm doing awesome stuff right now."); 
     } 
     }; 

     long delay = 0; 
     long period = 10 * 1000; // 10 seconds; 
     timer.schedule(myTask, delay, period); 
    } 

} 

E poi questo va nel vostro web.xml

<listener> 
    <listener-class>com.TimerTaskServletContextListener</listener-class> 
</listener> 

Solo più cibo per la mente!

Problemi correlati