2016-05-18 22 views
0

Ich benutze Spring und ich habe eine ThreadPoolTaskExecutor (um ähnliche und sich wiederholende Aufgaben häufig auszuführen) mit CallerRunsPolicy eingerichtet. Aufgrund der Art der Funktionalität, die ich erstelle, kann ich viele Aufgaben haben, die generiert werden und asynchron ausgeführt werden müssen.Gibt es einen einfacheren Weg, um in Java zu erfahren, ob eine abgelehnte Aufgabe (von einem Executor) als "CallerRunsPolicy" ausgeführt wurde?

Da die Warteschlange ihre Kapazität überschritten hat, werden diese Tasks im Thread des Aufrufers ausgeführt. Ich brauche einen Weg, um herauszufinden, welche Aufgaben in Caller's Thread ausgeführt werden. Ich weiß, zur Laufzeit kann ich Methoden auf dem Executor aufrufen, um herauszufinden, ob die Warteschlange voll ist, und dann wird jede neue Aufgabe folgen CallersRunPolicy, aber ich fragte mich, ob es andere Möglichkeiten gibt, dies zu tun?

Antwort

2

Definieren Sie Ihre eigenen RejectedExecutionHandler und übergeben Sie es unter Konstruktor.

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long 
keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, 
ThreadFactory threadFactory, RejectedExecutionHandler handler) 

Beispielcode für MyRejectedExecutionHandler

public class MyRejectedExecutionHandler extends CallerRunsPolicy{ 
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { 
     // Add your code to log Runnable details. 
     super.rejectedExecution(r, executor); 
    } 

} 
+0

Das macht Sinn. Mir war nicht klar, dass es eine Methode auf dem Executor gab, um den Zurückweisungs-Rückruf zu registrieren. Trotzdem danke ! –