2010-06-17 8 views
7

Ich muss eine periodische Operation (rufen Sie eine Java-Methode) in meiner Web-App (Jsp auf Tomcat). Wie kann ich das tun? Java-Daemon oder andere Lösungen?Wie kann ich einen Java-Daemon machen

+0

ähnlicher Beitrag http://StackOverflow.com/Questions/3053936/How-to-Execute-Task-for-Aspecific-Period-in-Java/3053971#3053971 –

Antwort

8

Sie könnten eine ScheduledExecutorService für die periodische Ausführung einer Aufgabe verwenden. Wenn Sie jedoch eine komplexere Cron-ähnliche Planung benötigen, werfen Sie einen Blick auf Quartz. Insbesondere würde ich empfehlen, Quartz in conjunction with Spring zu verwenden, wenn Sie diesen Weg gehen, da es eine nettere API zur Verfügung stellt und Ihnen erlaubt, Ihre Jobfeuerung in der Konfiguration zu steuern.

ScheduledExecutorService Beispiel (aus Javadoc genommen)

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

Meine Operation haben keine Endzeit . Ich muss dies zum Beispiel jede Woche tun. Wie kann ich das tun? – enfix

+0

Wenn Sie ScheduledExecutorService verwenden, müssen Sie scheduleWithFixedDelay oder scheduleAtFixedRate verwenden. Für Aufgaben, die einmal pro Woche oder zu bestimmten Zeiten des Monats ausgeführt werden, favorisiere ich Quartz, da Sie in der Konfiguration einen einfachen Cron-Ausdruck angeben können, der die genauen Zeiten beschreibt, zu denen der Job ausgeführt werden sollte. – Adamski

4

Adams Antwort ist direkt auf das Geld. Wenn Sie am Ende Ihre eigenen rollen (anstatt die Quarz-Route zu gehen), sollten Sie in einer ServletContextListener starten. Hier ist ein Beispiel mit java.util.Timer, das mehr oder weniger eine dumme Version des ScheduledExexutorPool ist.

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); 
    } 

} 

Und dann geht dies in Ihrem web.xml

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

Einfach mehr zu denken!

Verwandte Themen