2012-12-18 7 views
8

Başlangıçta bazı kaynakları yükleyen ServletContextListener uygulayan bir sınıfım var.ServletContextListener'de istisna üzerine Tomcat startup nasıl iptal edilir?

Bu kaynaklar, mantığımda bir takım kötü bir olay olduğunda tüm başlangıçta başarısız olmak istediğim bir şekilde uygulama için kritik öneme sahiptir.

Tüm Tomcat başlangıcını durdurmak ve durdurmak için ServletContextListener.contextInitialized() yönteminin içinden yürütebileceğim herhangi bir komut var mı?

+0

birisi System.exit (1) daha başka bir şekilde buldular mı? – Bastien

+0

@Bastien, SpringBoot –

+2

@Leo Alakasız'ı kullanın. Sorunun doğru bir cevabı, SpringBoot'un bu sorunu nasıl yönettiğine dair bir açıklama olabilir. – Bastien

cevap

11

deneyin belirten: official documentation alıntı senin java çalışma zamanı seçeneklerinde

-Dorg.apache.catalina.startup.EXIT_ON_INIT_FAILURE=true 

: Bir istisna sunucu başlatma aşamasında olursa

doğruysa, sunucu çıkılacak.

Belirtilmezse, varsayılan false değeri kullanılır.

GÜNCELLEME:

kod bunu istiyorsanız, will System.exit() çalışır?

public class FailFastListener implements ServletContextListener { 

    private static final Logger log = LoggerFactory.getLogger(FailFastListener.class); 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
     try { 
      //initialization 
     } catch(Exception e) { 
      log.error("Sooo bad, shutting down", e); 
      System.exit(1); 
     } 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    } 
} 
Onları bozmadan mevcut dinleyicileri sarmak için deseni kullanabilirsiniz

. Tomcat nasıl tepki vereceğinden emin değil ...

+0

Teşekkürler, neredeyse sorunumu çözüyor, ancak ... Kod yürütme ile yapmak istiyorum. İmkansız ise - çalışma zamanını seçerim. – urir

+1

@urir: güncellememi görün –

+0

Yep :) büyülü System.exit (1) :) Biliyorum, bana daha net sorular sormalıyım ... yani ... Bunu Tomcat konteynırını kullanarak gerçekleştirmenin herhangi bir yolu ? Temel neden, System.exit'in yaşam döngüsünde başka dinleyicilerin yok edişi gibi diğer olayları kapatmayacağından korkuyordum. Bu konuda ne düşünüyorsunuz? Güvenlik yöneticisi etkinleştirildiğinde – urir

0

Tomcat'ı web sunucunuz dağıtılamadığından durdurmak istiyorsanız, tomcat'e dağıtılmış başka uygulamaların olmadığını kabul ediyorum. Bu durumda, neden bu uygulamayı gömülü Tomcat/Jetty ile bağımsız bir webapp olarak oluşturmuyorsunuz? Bu şekilde, web sunucunuz düzgün başlamadığı sürece, yerleşik sunucu da kapanır.

Bana göre, ServletContextListener'un ne anlama geldiğiyle ilgili bir sorunu çözmek için ServletContextListener odaklandığınız anlaşılıyor.

System.exit()'u kullanmayın, çünkü diğer dağıtılmış uygulamaları çalıştırmama neden olabilecek sunucuyu öldürecektir. Tamamsa, başka uygulamalar olmayacağını (ve istemediğini) bildiğiniz için bağımsız bir web uygulaması yapın. Bu kötü uygulama, potansiyel bir zayıflık olarak CWE'de listelenir: CWE-382

Sadece bir ipucu: Yaylı önyükleme, yerleşik sunucu ile bağımsız bir web uygulaması oluşturma çabasını kolaylaştırır. Bu kılavuzu bakınız: https://spring.io/guides/gs/spring-boot/

bu aradığınızı muhtemelen açıklarken İyi madde: http://www.beyondjava.net/blog/application-servers-sort-of-dead/

+0

downvoter ... olabilir misiniz? lütfen nedenini açıkla? –

+0

Merhaba downvoter, buna ne dersin? http://cwe.mitre.org/data/definitions/382.html –

+1

Genelde doğru olduğun için sizi destekledim Tomcat, özel bir durumdur çünkü gömülü tomcat her zaman gerçekten gömülü değildir ... bu çok sayıda sınıf yükleyicidir hala kullanılıyor. Örneğin, Tomcat Maven eklentisi, tek bir SAV'u çalıştırılabilir bir JAR ** 'ya çevirecektir, ancak ** aslında normal Tomcat'e çok benzer. Spring Boot, ebeveyn olduğu için bunu yapmaz ve Tomcat aynı classloader'da çalışır. Tomcats kavanozlarıyla ilgili sorunlardan kaçınmanız için (tombala eklentisi gibi) çoklu sınıf yükleyicilere (tomcat maven eklentisi) sahip olmanın bir yararı vardır (günlüğe kaydetme gibi). –

İlgili konular