2010-06-17 13 views
7

Necesito hacer una operación periódica (llamar a un método java) en mi aplicación web (jsp en tomcat). ¿Cómo puedo hacer esto? Java daemon u otras soluciones?Cómo puedo hacer un Java Daemon

+0

publicación similar http://stackoverflow.com/questions/3053936/how-to-execute-task-for-a-specific-period-in-java/3053971#3053971 –

Respuesta

8

Puede usar ScheduledExecutorService para la ejecución periódica de una tarea. Sin embargo, si necesita una programación cron más compleja, eche un vistazo al Quartz. En particular, recomendaría usar Quartz in conjunction with Spring si sigue esta ruta, ya que proporciona una API más agradable y le permite controlar la activación de su trabajo en la configuración.

ScheduledExecutorService Ejemplo (tomado de 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

Mi operación no tiene un tiempo de finalización . Necesito hacer esto, por ejemplo, todas las semanas. ¿Cómo puedo hacer esto? – enfix

+0

Si está usando ScheduledExecutorService, necesita usar scheduleWithFixedDelay o scheduleAtFixedRate. Para las tareas que se ejecutan una vez por semana o en ciertos momentos del mes, tiendo a favorecer a Quartz, ya que puede proporcionar una expresión cron simple en config que describa las horas exactas en que se debe ejecutar el trabajo. – Adamski

4

Adams respuesta es justo en el dinero. Si terminas rodando el tuyo (en lugar de ir por la ruta del cuarzo), querrás dar el puntapié inicial en un ServletContextListener. Aquí hay un ejemplo, usando java.util.Timer, que es más o menos una versión tonta de 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); 
    } 

} 

Y entonces esto va en su web.xml

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

Sólo más alimento para el pensamiento!

Cuestiones relacionadas