2010-03-13 7 views
7

Ich habe eine Webanwendung, die vier Mal pro Stunde mit einer zentralen Datenbank synchronisiert. Der Prozess dauert normalerweise 2 Minuten. Ich möchte diesen Prozess als Thread bei X: 55, X: 10, X: 25 und X: 40 ausführen, damit die Benutzer das bei X: 00, X: 15, X: 30 und X: 45 wissen Sie haben eine saubere Kopie der Datenbank. Es geht nur darum, Erwartungen zu managen. Ich bin durch den Executor in java.util.concurrent durchgegangen, aber die Planung wird mit der scheduleAtFixedRate getan, die ich glaube, gibt keine Garantie über, wenn das tatsächlich in Bezug auf die Stunden ausgeführt wird. Ich könnte eine erste Verzögerung verwenden, um die Runnable so zu starten, dass die erste nah an der Startzeit und dem Zeitplan für alle 15 Minuten ist, aber es scheint, dass dies wahrscheinlich zeitlich auseinander gehen würde. Gibt es eine einfachere Möglichkeit, den Thread so zu planen, dass er 5 Minuten vor jeder Viertelstunde ausgeführt wird?Run Java-Thread zu bestimmten Zeiten

Antwort

9

Sie können den RUNNABLE-Zeitplan für den nächsten Durchlauf festlegen.

Wie,

class Task implements Runnable { 
    private final ScheduledExecutorService service; 

    public Task(ScheduledExecutorService service){ 
     this.service = service; 
    } 

    public void run(){ 
     try{ 
      //do stuff 
     }finally{ 
      //Prevent this task from stalling due to RuntimeExceptions. 
      long untilNextInvocation = //calculate how many ms to next launch 
      service.schedule(new Task(service),untilNextInvocation,TimeUnit.MILLISECONDS); 
     } 
    } 
} 
+0

Dit es auf diese Weise und funktioniert wunderbar. Vielen Dank. – rmarimon

+1

@rmarimon: NP :) Sei nur vorsichtig, dass eine 'RuntimeException' die periodische Ausführung stoppen kann. Ich wurde dadurch verbrannt, also habe ich die Antwort entsprechend bearbeitet. –

+0

Ich habe es gerade geändert. Ich hatte es wie versuchen {} catch (Exception e) {} und dann die Umplanung. Aber das scheint endlich der richtige Ansatz zu sein. – rmarimon

1

TimerTask behandelt diesen Fall.

Siehe schedule(TimerTask, Date)

Wenn Sie die Aufträge planen nicht haben wollen, zu halten, möchten Sie vielleicht wie Quartz in eine Job-Scheduling-Tool suchen.

2

Quartz wäre eine gute Passform, da Sie Anwendung ist webbasiert. Es bietet die feinkörnige zeitbasierte Planung, die Sie benötigen.

Quarz ist ein voll funktionsfähige Open-Source- Job-Scheduling-Dienst, die an der Seite von integriert mit oder verwendet werden kann, praktisch jedes Java EE oder Java SE Anwendung - vom kleinsten Stand-alone-Anwendung das größte E-Commerce-System. Quartz kann verwendet werden, um einfache oder komplexe Zeitpläne für die Ausführung von Zehnen, Hunderten oder sogar Zehntausenden von Jobs zu erstellen; Jobs, deren Aufgaben als Standard-Java Komponenten definiert sind, die virtuell ausgeführt werden können alles, was Sie programmieren können, zu tun. Der Quartz Scheduler enthält viele Enterprise-Funktionen wie JTA Transaktionen und Clustering.

Verwandte Themen