2015-01-30 22 views
12

Spring Boot uygulamasında, (varsayılan Tomcat) web sunucusunun tamamen başlatılmasından ve diğer uygulamalara HTTP istekleri göndermelerini bildiren mesaj göndermeden önce trafiği almaya hazır olmasını beklemeliyim bana (özellikle benim /health benim hit bir izleme sistemi).Spring Boot - Web sunucusunun başlamasını bekleyin

ApplicationListener<ContextRefreshedEvent>'daki diğer uygulamalara ileti gönderen mantığı koymaya çalıştım ancak hala çok erken. Diğer uygulamalar bana istekte bulunmaya ve başarısız olmaya çalışır. Şu anda onApplicationEvent'da bir gecikme yaptım ve bu işe yarıyor ama hacky ve tokluk.

Ayrıca bir ServletContextInitializer eklemeyi de denedim, ancak daha önce tetiklenmiş.

Bir Tomcat API'sini kullanmam gerekeceğini varsayardım, ancak bunun için Önyükleme API'sinde bir şey olup olmadığını görmek istedim.

+0

aşağıdaki özelliği eklendi belirli bir profile altında çalıştırmak için bu dinleyici gerekli : //stackoverflow.com/a/4747639/283084? Ek olarak, uygulamanızı bir LB'nin arkasına saklayabilir ve LB, '/ health' isteğinin HTTP TAMAMINI (200) döndürmesine kadar uygulamanızı havuza almaz. – harpun

cevap

16

Yapılacak en basit şey, SpringApplication.run() döndüğünde mesajı göndermektir. Bu yöntem Tomcat (veya desteklenen diğer tümleşik kapsayıcı) tam olarak başlatılıncaya ve yapılandırılmış bağlantı noktalarına (dinleyicilere) dinlenene kadar geri dönmez. Bununla birlikte, bu basit olsa da, ana konfigürasyon sınıfınızın ve uygulamanızın çalışma zamanı mantığının bazılarının endişelerini karıştırması nedeniyle çok düzgün bir yaklaşım değildir. Bu bir SpringApplicationRunListener kullanabilirsiniz. Tomcat tamamen başlatılana ve yapılandırılmış bağlantı noktasını dinleyene kadar finished() çağrılmaz.

Çalıştırıcınızı listeleyen src/main/resources/META-INF/spring.factories adlı bir dosya oluşturun. Örneğin:

org.springframework.boot.SpringApplicationRunListener=com.example.MyRunListener 

gerekli yapıcı ile çalıştırmak dinleyici oluşturun ve SpringApplicationRunListener uygulamak. Örneğin: kabul edilen yanıt belirtildiği gibi

public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent>, Ordered { 

    @Override 
    public void onApplicationEvent(ApplicationReadyEvent event) { 
     //do stuff now that application is ready 
    } 

    @Override 
    public int getOrder() { 
     return Ordered.LOWEST_PRECEDENCE; 
    } 
} 

Ayrıca, bir oluşturabilirsiniz:

package com.example; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.SpringApplicationRunListener; 
import org.springframework.context.ConfigurableApplicationContext; 
import org.springframework.core.env.ConfigurableEnvironment; 

public class MyRunListener implements SpringApplicationRunListener { 

    public MyRunListener(SpringApplication application, String[] args) { } 

    @Override 
    public void started() { } 

    @Override 
    public void environmentPrepared(ConfigurableEnvironment environment) { } 

    @Override 
    public void contextPrepared(ConfigurableApplicationContext context) { } 

    @Override 
    public void contextLoaded(ConfigurableApplicationContext context) { } 

    @Override 
    public void finished(ConfigurableApplicationContext context, Throwable exception) { 
     // Send message; Tomcat is running and listening on the configured port(s) 
    } 
} 
+1

Harika çalışıyor. İlgilenen fasülyelerin uygulayabildiği ve 'SpringApplicationRunListener' öğesinin bunları bağlamdan çıkardığı ve onları çağırdığı başka bir arayüz oluşturdum, böylece mantık ilgili fasülyede kalabiliyor. – sourcedelica

5

Bahar Boot 1.3.0 bu da ApplicationListener<ApplicationReadyEvent>

örnek uygulayarak gerçekleştirilebilir yana ApplicationListener listeleme src/main/resources/META-INF/spring.factories adlı dosya. Örneğin: http:

org.springframework.context.ApplicationListener=com.example.MyApplicationListener 

ancak benim durumumda, ben sadece gördünüzmü

yüzden application-<profile_name>.properties

context.listener.classes=com.example.MyApplicationListener