Wie neu zu starten, zu planen, Wann scheduleWithFixedDelay eine exception wirft?
Benutze ich ScheduledExecutorService
planen einige Aufgaben, die brauchen, um ausführen regelmäßig.
Ich möchte wissen, ob dieser code funktioniert nach Wiederherstellung der Zeitplan, wenn eine Ausnahme passiert.
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
this.startMemoryUpdateSchedule(service);//See below method
//Recursive method to handle exception when run schedule task
private void startMemoryUpdateSchedule(ScheduledExecutorService service) {
ScheduledFuture<?> future = service.scheduleWithFixedDelay(new MemoryUpdateThread(), 1, UPDATE_MEMORY_SCHEDULE, TimeUnit.MINUTES);
try {
future.get();
} catch (ExecutionException e) {
e.printStackTrace();
logger.error("Exception thrown for thread",e);
future.cancel(true);
this.startMemoryUpdateSchedule(service);
} catch(Exception e) {
logger.error("Other exception ",e);
}
}
- hey, wenn Sie diesen Aufruf.startMemoryUpdateSchedule(service) aus dem Haupt-thread. Der Haupt-thread muss warten, bis Prozess zu beenden, aber Ihre Funktion wird ausgeführt foreover.der Haupt-thread gehen, um zu schlafen??
- Parannoy, ich erstelle ein neuen thread für diese Funktion aus dem Haupt-thread.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie wahrscheinlich schließen Sie den try-block in einem
while(true)
- Schleife, denn wenn der erste run nicht eine Ausnahme werfen, verlassen Sie Ihre Methode, und wenn Sie den zweiten Anruf wirft man Sie nicht fangen.Ich würde auch den rekursiven Aufruf in einem eigenen thread, um das Risiko zu vermeiden, einen StackOverFlow Fehler, wenn Dinge schlecht gehen.
Also würde es so Aussehen:
future.get()
) wird von einem separaten thread. Ich denke, am Ende muss man einige tests mit einem einfachen Thread, der sendet eine Ausnahme alle 5 fordert zum Beispiel, und sehen, ob das Verhalten wie erwartet.Versuchen,
VerboseRunnable
Klasse aus jcabi-log, die entworfen ist, für genau diesen Zweck:Nun, wenn jemand ruft
runnable.run()
keine Ausnahmen geworfen werden. Stattdessen werden Sie geschluckt und protokolliert (zu SLF4J).Habe ich die Schleife wie besprochen.
ScheduledExecutorService.scheduleWithFixedDelay(Runnable, long, long, TimeUnit)
wirftRejectedExecutionException
(ein Kind von RuntimeException) ==> Wir können es fangen & retry Vorlage einmal mehr.Nun als
future.get()
soll das Ergebnis einer Ausführung, die wir brauchen, um es aufzurufen in einer Schleife.Auch der Ausfall einer Ausführung nicht auf das nächste geplante Ausführung, das unterscheidet den ScheduledExecutorService aus dem TimerTask, das führt die geplanten Aufgaben im selben thread => Fehler in einer Ausführung würde zum Abbruch der Zeitplan im Falle von TimerTask (http://stackoverflow.com/questions/409932/java-timer-vs-executorservice)
Wir brauchen nur alle zu fangen die drei Ausnahmen von der Zukunft.bekommen(), aber wir können nicht rethrow Sie, dann werden wir nicht in der Lage sein, um das Ergebnis der nachfolgenden Ausführungen.
Den code könnte sein: