2017-06-28 2 views
0

Ich habe eine Reihe von Aufgaben, die zu bestimmten Zeitpunkten (lange in der Zukunft, Tage und möglicherweise Wochen) ausgeführt werden müssen. Mein Plan war es, für jeden einen Thread zu erstellen, der bis zum Fälligkeitstermin wartet. Da die Anzahl der Aufgaben sehr hoch sein kann, mache ich mir Sorgen, dass diese Threads eine Menge Ressourcen verbrauchen (um nichts zu tun/zu warten). Meine Frage ist, ob ein Thread, der wartet, Ressourcen verbraucht und wenn ja wie viele.Aufgabe über lange Zeitintervalle in der Scala

(I asume, dass eine Datenbank mit Aufgaben erstellt und ständig durchlaufen zu sehen, ob ausgeführt werden soll, ist noch weniger effizient)

+0

Ich würde vermuten, dass die einfachste Lösung sein wird, einen Dienst zu erstellen und fügen Sie es dem Cron für einmal täglich geplant werden, so wird es einmal am Tag wie ein Job ausgeführt werden, sieht es mehr wie ich Sie haben Job keine Aufgabe, die nur geplant werden muss. Im Falle einer skala-spezifischen Implementierung sollten Sie in Akka nachschauen: http://doc.akka.io/docs/akka/current/scala/scheduler.html – Pavel

Antwort

0

Dies ist nicht wirklich ein scala-spezifisches Problem.

Das Problem mit einem Thread warten für eine lange Zeit ist, dass Ihre Anwendung in der Zwischenzeit abstürzen könnte oder Sie haben einen Stromausfall oder was auch immer.

Speichern in der Datenbank klingt für mich auf der anderen Seite wie eine einfache Lösung. Sicher würde es ziemlich zeitaufwendig sein, wenn Sie alle Einträge die ganze Zeit durchlaufen würden. Wenn Sie jedoch in der Datenbank ein "fälliges" Feld haben, anhand dessen Sie sortieren können, sollte dies ziemlich effizient sein. Offensichtlich müssen Sie eine geeignete Datenbank auswählen, die solche Operationen effizient unterstützt. Dadurch können Sie jedoch ein zuverlässigeres System erstellen, das nach dem Neustart der Anwendung weiterhin ordnungsgemäß funktioniert.

0

Wenn Sie einen Job zu einem bestimmten Zeitpunkt planen müssen, würde ich einen Job-Scheduler wie http://www.quartz-scheduler.org/ empfehlen. Es ist ziemlich umfangreich und man kann einen Job wie leicht zu erstellen und planen:

public class MyJob implements org.quartz.Job { 

     public MyJob() { 
     } 

     public void execute(JobExecutionContext context) throws JobExecutionException { 
      System.err.println("Hello World! MyJob is executing."); 
     } 
} 

    JobDetail job = newJob(MyJob.class) 
     .withIdentity("job1", "group1") 
     .build(); 

    // Trigger the job to run now, and then repeat every 40 seconds 
    Trigger trigger = newTrigger() 
     .withIdentity("trigger1", "group1") 
     .startNow() 
     .withSchedule(simpleSchedule() 
       .withIntervalInSeconds(40) 
       .repeatForever()) 
     .build(); 

    // Tell quartz to schedule the job using our trigger 
    scheduler.scheduleJob(job, trigger); 

Da es sich um eine Java-Bibliothek ist, kann man natürlich leicht auch innerhalb Scala (siehe SO here).

In Bezug auf die Option, Akka (@Pavel) zu verwenden. Wenn Sie Akka sowieso nicht verwenden und Sie nur die Scheduler-Funktionalität benötigen, würde ich mit Quarz gehen. Wenn Sie Akka verwenden (oder planen, es zu verwenden) und nur Jobs benötigen, die X Wochen/Tage/Stunden ab jetzt oder in einem bestimmten Zeitraum ausführen, können Sie den Akka-Scheduler verwenden. Wenn Sie komplexere Semantiken wie bestimmte Daten und Zeiten benötigen, würde ich mir Quarz ansehen.

Verwandte Themen