0

Ich habe eine Anwendung, die eine ScheduledExecutorService verwendet, um mehrere Runnable zu behandeln: jeder ist mit fester Rate geplant und muss am Leben sein, solange die Anwendung.Überprüfen Sie geplante Tasks Status

Ich brauche eine Lösung, um benachrichtigt zu werden, wenn einer dieser Threads wegen einer Ausnahme beendet wird, damit ich sie erneut einplanen kann.

Kann ich ein beliebiges Muster für dieses Problem verwenden? Oder verwende ich die falschen Objekte in meiner Anwendung?

+0

http://stackoverflow.com/questions/21442322/scheduledexecutorservice-check-if-scheduled-task-has-already-been-completed –

Antwort

0

Es könnte einfacher sein, wenn man einfach die Runnable wickeln, so dass Ausnahmen nie die Aufgabe verursachen abgesagt werden:

class CatchingRunnable implements Runnable { 
    private final Runnable delegate; 

    CatchingRunnable(Runnable delegate) { 
    this.delegate = delegate; 
    } 

    @Override public void run() { 
    try { 
     delegate.run(); 
    } catch (RuntimeException e) { 
     // Handle the exception somehow, e.g. log it. 
    } 
    } 
} 

Jetzt runnable über Zeitplan:

executor.scheduleAtFixedRate(new CatchingRunnable(runnable), delay, period, unit); 

Dann brauchen Sie nie Sorgen zu machen über die Neuplanung von ihnen.

+0

Das ist gut, aber es könnte schwierig sein, irgendeine Art von Ausnahme zu prognostizieren, die Sie können habe und handle es entsprechend. Vorschlag: Rufen Sie aus dem Block '' 'catch''' zurück zu der Klasse, die den Executor hat, und verschieben Sie sie erneut. Um dies zu tun, haben Sie wahrscheinlich eine andere Schnittstelle anstelle von '' 'Runnable''' für' 'delegate''', die auch eine Funktion hat (zB' '' receate() '' '), um den gleichen Delegaten neu zu erstellen . –

+0

@JornVernee Nun, sicher, Sie könnten bestimmte Ausnahmen auf spezifische Weise behandeln. Aber 1) Wie würden Sie diese "unerkennbaren" Ausnahmen auf andere Weise handhaben? 2) Wenn Ihr Ziel ist "wenn es fehlgeschlagen ist, starten Sie es neu", spielt der Typ der Ausnahme keine Rolle. –

+0

Ja, mein Punkt war Nummer 2, die Art der Ausnahme spielt keine Rolle. Der Vorschlag war, die Runnable-Umplanung selbst vorzunehmen, wenn sie mit einer Ausnahme beendet wird. Das ist alles. –

0

Alternativ können Sie einen Handler für die erneute Übermittlung beibehalten, wenn ScheduleFuture abgeschlossen ist.