Herunterfahren eines ExecutorService

9

In Tomcat habe ich einen ServletContextListener geschrieben, der beim Start einen ExecutorService startet und ihn beim Entladen beendet.

Ich folge dem Beispiel im Javadoc für ExecutorService

%Vor%

Meine Frage ist, sollte ich die InterruptedException in der contextDestroyed () Methode propagieren?

    
Jacques René Mesrine 16.09.2009, 07:55
quelle

3 Antworten

4

Ich würde nein sagen. Die contextDestroyed -Methode wird vom Container als Benachrichtigung darüber, dass der Kontext abgerissen werden soll, aufgerufen und fragt nicht nach Ihrer Berechtigung. Außerdem definiert Javadoc nicht, was passiert, wenn Sie eine Ausnahme auslösen, sodass die Ergebnisse unvorhersehbar und / oder nicht portabel sind.

Ich würde executor.shutdownNow() innerhalb des catch-Blocks aufrufen, um den Executor zwangsweise zu beenden (d. h. "Sie hatten Ihre Chance, jetzt stoppen Sie").

    
skaffman 16.09.2009, 07:58
quelle
1

Was Sie in Ihrem Codebeispiel haben (unterbrechen Sie den aktuellen Thread), ist genau das, was ich empfehlen würde. Etwas in Tomcat außerhalb deines eigenen Codes hat den ursprünglichen Interrupt gesendet, also lass Tomcat eine Chance haben, damit umzugehen.

Ich weiß nicht, was Tomcat mit der InterruptedException machen wird. Es ist undefiniert. Tomcat initiierte jedoch den Interrupt und Tomcat besitzt den Thread, in dem die contextDestroyed (...) -Methode ausgeführt wird. Der allgemeine Grundsatz von "Java Concurrency in Practice", der hier gilt, ist: Der Ersteller des Threads ist verantwortlich für die Thread-Lebensdauer. cycle Probleme.

Die Behandlung eines Interrupts ist definitiv ein Problem des Lebenszyklus.

    
Steve McLeod 16.09.2009 07:58
quelle
0

Ich stimme Steve zu, das Zurücksetzen des Interrupt-Flags gibt Code außerhalb Ihrer Kontrolle eine Chance, auf das Ereignis zu reagieren.

tempus-fugit bietet eine Convenience-Methode, um dies für Sie zu tun, zusammen mit einer Exception Timeout Ausnahme, wenn die Dinge zu lange dauern.

%Vor%

Schauen Sie unter dem Parallelitätsbereich der Dokumente nach, ob es von Interesse ist ... tempusfugitlibrary.org/documentation

Dies Beispiel demonstriert seine Verwendung, sowohl für die Fertigstellung als auch für eine aggressivere Abschaltung.

    
Toby 27.10.2010 07:59
quelle