2017-09-10 4 views
0

Ich möchte einen Auftrag für mehrere Sekunden ausführen, was 2,4,8,16,32 Sekunden ist . Das zweite Feuer sollte nach zwei Sekunden nach dem ersten Feuer ausgelöst werden. Das dritte Feuer sollte nach 4 Sekunden nach dem zweiten Feuer und so weiter geschehen. Das nächste Feuer basiert auf dem Status, den wir von einem vorherigen Feuer erhalten haben. Basierend darauf wird entschieden, ob wir das nächste Feuer auslösen müssen oder nicht. Kann mir jemand sagen, wie kann ich den Quartz-Scheduler verwenden, um dies zu erreichen?Planen Sie einen Job für mehrere Sekunden, dh 2,4,8,16,32 Sekunden

Wenn ich SimpleTrigger.withIntervalInSeconds (2) verwende, wird nach jeweils 2 Sekunden ein Job ausgeführt, wobei das Zeitintervall bei jedem Feuern um ein Vielfaches von 2 erhöht werden soll.

+1

Mögliche Duplikat [Planen eines Job mit Spring programmatisch (wobei fixedRate dynamisch gesetzt ist)] (https://stackoverflow.com/questions/14630539/scheduling-a-job-with-spring-programmatical-with-fixedrate-set-dynamically) – prettyvoid

Antwort

0

Vielleicht können Sie vergessen, einen einzelnen Trigger einzurichten, aber mehrere Trigger verwenden. Meine Java ist in diesem Bereich nicht gut, so ist dies in Pseudo-Code:

delay = 2 
repeat 
TriggerOnceAfter(delay) 
delay <- delay * 2 
WaitUntilTriggered() 
until (finished) 

Ich bin nicht sicher, wie die WaitUntilTriggered() Methode zu implementieren; Sie müssen ein Signalisierungsflag zu dem ausgelösten Code für WaitUntilTriggered() hinzufügen, um zu sehen.

Das gibt Verzögerungen von 2, 4, 8, ...

0

Dies ist eine vereinfachte Implementierung, die eine Runnable am gewünschten Zeitplan aufrufen wird:

import java.util.concurrent.CountDownLatch; 
import java.util.concurrent.TimeUnit; 

public class Tasker { 

    private int numberOfRuns; //how many times job executed 
    private int timeBetweenRuns;//seconds 

    Tasker(int numberOfRuns){ 

     this.numberOfRuns = numberOfRuns; 
     timeBetweenRuns = 2; 
     execute(); 
    } 


    private void execute() { 

     for (int counter = 0; counter < numberOfRuns ; counter++) { 
      CountDownLatch latch = new CountDownLatch(1); 
      Job job = new Job(latch, timeBetweenRuns); 
      job.run(); 

      try { 
       latch.await(); 
       TimeUnit.SECONDS.sleep(timeBetweenRuns); 
      } catch (InterruptedException ex) { 
       ex.printStackTrace(); 
      } 
      timeBetweenRuns *=2; 
     } 
    } 

    public static void main(String[] args){ 

     new Tasker(5); 
    } 
} 

class Job implements Runnable { 

    private int seconds; 
    private CountDownLatch latch ; 

    Job(CountDownLatch latch , int seconds){ 
     this.latch = latch; 
     this.seconds = seconds; 
    } 

    @Override 
    public void run() { 

     System.out.println("Job runs "+ seconds +" after previous one"); 
     latch.countDown(); 
    } 
} 
Verwandte Themen