2009-03-17 21 views
5

Arka uç webapp Tomcat 6 sunucu uygulamasında dağıtılıyor. Webapp'ta çeşitli izleme konuları başlatıldı. Sorun kapatma ile.Tomcat üzerinde çalışan bir webapp tarafından sahip olunan yerel iletilerin düzgün bir şekilde nasıl kapatılacağı anlatılıyor

  • Webapp'in kapatılması istendiğini nasıl anlarım?
  • Bunu iş parçacıklarımda nasıl kullanmalıyım?

Şu anda iş parçacığı aşağıdaki gibidir. Sunucuya kapatma talimatı verildiğinde (shutdown.sh), temiz bir kapatma işlemi tamamlanır ve bu iş parçacığı nedeniyle askıda kalmaz - Neden?

class Updater extends Thread { 
    volatile boolean interrupted = false; 

    @Override 
    public void run() { 
    Integer lastUpdateLogId = CommonBeanFactory.getXXX() 
           .getLastUpdateLogRecordKey(MLConstants.SMART_DB_NAME); 

    List<UpdateLog> updateLogRecords; 
    while (!interrupted) { 
     boolean isConfigurationUpdateRequested = false; 

     try { 
     TimeUnit.SECONDS.sleep(5); 
     } catch (InterruptedException e) { 
     setInterrupted(true); 
     } 

     updateLogRecords = CommonBeanFactory.getXXX() 
         .getLastFactsUpdateLogRecords(MLConstants.XXXX, lastUpdateLogId); 

     for(UpdateLog updateLog : updateLogRecords) { 
     if (updateLog.getTable_name().equals(MLConstants.CONFIG_RELOAD)) { 
      isConfigurationUpdateRequested = true; 
     } 

     lastUpdateLogId = updateLog.getObjectKey(); 
     } 

     if (isConfigurationUpdateRequested) { 
     Configuration.getInstance().loadConfiguration(); 
     } 
    } 
    } 

    public boolean getInterrupted() { 
    return interrupted; 
    } 

    public void setInterrupted(boolean interrupted) { 
    this.interrupted = interrupted; 
    } 
} 

cevap

3

Servlet, kapatılması istendiğinde bir yaşam döngüsü olayı alır. İzleme işinizi durdurmak için bu etkinliği kullanabilirsiniz. Yani, bir sunucu başlatıldığında, init() yöntemi çağrılır. Durdurulduğunda, destroy() yöntemi çağrılır.

Sunucunuzdaki destroy() yöntemini geçersiz kılın ve burada iş parçacığını durdurun.

shutdown.sh'u aradığınızda tüm JVM kapatıldı. JVM durduğundan, hala çalışıyorsa tüm parçacıklar (durumları ne olursa olsun) zorla durdurulur. System.exit(0);

5

Çağrının mantıksal karşılığı, yanıtlara henüz cevap veremiyorum. Eddie'nin cevabı pek doğru değil.

Webapp'ımın neden düzgün kapanmadığını anlamaya çalıştığım için bu soruyu buldum; Kapatma çalıştırdığımda öldürülmeyen konular var. Aslında, bazı konuları durdurur ama sonuçta sadece bazı limbo durumlarında oturur. Benim sınıfım neredeyse aynen böyle.

Ön planda Ctrl + C yazma Tomcat penceresi (Windows'ta) her şeyi durdurur, ancak Tomcat ile birlikte gelen init betiğini kullanmaz. Ne yazık ki, neden henüz anlamadım ...

Düzenleme: Ben bunu anladım. İzleme iş parçacıklarının çoğu bir ServletContextListener içinde başlatıldı, ancak bu bağlam "yok edildi" olduğunda, çocuk konuları bildirilmedi. Tüm alt iş parçacıklarını bir Listede tutarak ve contextDestroyed() yönteminin her birindeki Thread.interrupt() öğesini çağırarak, bunu düzelttim. Eddie, servlet destroy() yöntemi hakkında söyledikleriyle neredeyse aynı.

Ancak, bu kapatma çalıştırdığınızda JVM özetle kapatıldığında bu doğru değil. {Sh | yarasa}. Daha çok, bu komut Tomcat bileşenlerine bir kapatma isteği gönderir. Bu kapatma mesajlarını almak ve bunları kendi nesnelerinize iletmek size kalmıştır.

İlgili konular