Spring Boot - Wait for web server to start

The simplest thing to do is to send the message once SpringApplication.run() has returned. This method won't return until Tomcat (or any other supported embedded container) is fully started and listening on the configured port(s). However, while this is simple, it's not a very neat approach as it mixes the concerns of your main configuration class and some of your application's runtime logic.

Instead, you can use a SpringApplicationRunListener. finished() will not be called until Tomcat is fully started and listening on the configured port.

Create a file named src/main/resources/META-INF/spring.factories listing your run listener. For example:

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

Create your run listener with the required constructor and implement SpringApplicationRunListener. For example:

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 starting() { }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) { }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) { }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) { }

    @Override
    public void started(ConfigurableApplicationContext context) {
        // Send message; Tomcat is running and listening on the configured port(s)
    }

    @Override
    public void running(ConfigurableApplicationContext context) { }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) { }

Since Spring Boot 1.3.0 this can also be accomplished by implementing ApplicationListener<ApplicationReadyEvent>

example:

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;
    }
}

Also, as mentioned in the accepted answer, you can create a file named src/main/resources/META-INF/spring.factories listing your ApplicationListener. For example:

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

however, in my case, I only needed this listener to run under a specific profile

so I added the following property to application-<profile_name>.properties

context.listener.classes=com.example.MyApplicationListener