2009-09-16 30 views
9

Tomcat'de, başlatma sırasında bir ExecutorService'ı başlatan ve kaldırıldığında sona erdirecek bir ServletContextListener yazdım.Bir ExecutorService Kapatma

ben contextDestroyed() yönteminde InterruptedException yaymak gerektiğini edilir ExecutorService

public void contextDestroyed(ServletContextEvent sce) 
{ 
    executor.shutdown(); 
    try 
    { 
     executor.awaitTermination(50, TimeUnit.SECONDS); 
    } 
    catch(InterruptedException ie) 
    { 
     Thread.currentThread().interrupt(); 
    } 
} 

Benim soru için javadoc örneğe izliyorum?

+1

Yöneticiniz kapanıyor mu? Benimki aynı koda sahip değil, aynı kodu kullandı ... (ve daha pek çok yaklaşım) – SoulWanderer

+0

Benimki de aynı kodla kapanmıyor. Tomcat 7'yi kullanıyorum. – lili

cevap

4

Hayır derim. contextDestroyed yöntemi, kapsayıcının bağlamın parçalanmak üzere olduğuna dair bir bildirim olarak çağrılır, bu sizin izninizi istemez. Ayrıca, Javadoc bir istisna atarsanız ne olacağını tanımlamaz, bu nedenle sonuçlar tahmin edilemez ve/veya taşınabilir değildir.

Ne yapmam, yürütücüyü zorla sonlandırmak için catch bloğunun içinde executor.shutdownNow() numaralı telefonu arayın (yani "şansınız oldu, şimdi dur").

+0

"Öngörülemez" ise, bir istisna atılırsa olabilecek en kötü şey nedir? ShutDownNow() önceliği ile –

+0

+1 spot-on. İstisnai emmek ve bayrağı ayarlamak gerçekten doğru olan şey. –

+0

En kötü durum, bu geri bildirimi yürüten kod onu yakalamaz ve bir iş parçacığı çöker. Daha da önemlisi, "awaitTermination()" ifadesinden gelen istisnanın ne olduğunu düşünün. Tüm özel durum, iş parçacığının tüm iş parçacıklarının bitmesini beklemeye devam edememesidir, çünkü başka bir iş parçacığı tarafından kesintiye uğratılır ve bu da sonlandırılması gerektiğini gösterir. Engelleme çağrısı yapmamış olsaydınız, kesinti bayrağı arka planda olurdu ve bunu bile bilmiyordunuz. Burada doğru olan şey bayrağı ayarlamak, idareciyi feshetmek ve bayrağı ayarlamaktır. –

1

Kod örneğinizde sahip olduğunuz şey (geçerli dizgiyi yeniden kesme) tam olarak öneriyorum. Tomcat'ta kendi kodunuzun dışında bir şey, orijinal kesintiyi gönderdi, bu yüzden Tomcat'ın bunu yapma şansı var.

Tomcat'in InterruptedException ile ne yapacağını bilmiyorum. Tanımsız. Ancak Tomcat, interrupt'ı başlattı ve Tomcat, contextDestroyed (...) yönteminin çalıştığı iş parçacığına sahip oldu. Burada geçerli olan "Uygulamada Java Concurrency" dan genel ilke şudur: iş parçacığının yaratıcısı iş parçacığı hayatının işlenmesinden sorumludur. silindir sorunları.

Bir kesme işleminin yapılması kesinlikle bir yaşam döngüsü sorunudur.

+0

Tomcat'in InterruptedException ile ne yapacağını biliyor musunuz? –

0

Steve'e katılıyorum, kesinti bayrağını sıfırlamak, kontrolünüz dışındaki kodun etkinliğe tepki verme şansı veriyor.

tempus-fugit, işler çok uzun sürerse, açık bir zaman aşımı istisnasının yanı sıra sizin için bunu yapmak üzere bir iletişim yöntemi sunar.

waitOrTimeout(shutdown(executor), timeout); 

eğer onun ilgi dokümanlar eşzamanlılık bölümü altında bir göz ... tempusfugitlibrary.org/documentation Bu example kullanımını gösteren

, hem tamamlanmasını ve daha agresif kapatma bekleyen için var.