Как закрыть приложение командной строки Spring Boot

Я создаю приложение java командной строки с помощью Spring Boot, чтобы заставить его работать быстро.

приложение загружает различные типы файлов (например, CSV) и загружает их в базу данных Cassandra. Он не использует никаких веб-компонентов, это не веб-приложение.

проблема у меня есть, чтобы остановить приложение, когда работа сделана. Я использую интерфейс Spring CommandLineRunner с @Component для выполнения задания, как показано ниже, но когда работа завершена приложение не останавливается, оно почему-то продолжает работать, и я не могу найти способ остановить его.

@Component
public class OneTimeRunner implements CommandLineRunner {

    @Autowired
    private CassandraOperations cassandra;

    @Autowired
    private ConfigurableApplicationContext context;

    @Override
    public void run(String... args) throws Exception {
        // do some work here and then quit
        context.close();
    }
}

обновление: проблема, кажется spring-cassandra, поскольку в проекте больше ничего нет. Кто-нибудь знает, почему он держит потоки, работающие в фоновом режиме, которые мешают приложению останавливаться?

обновление: проблема исчезла при обновлении до последней версии spring boot.

5 ответов


ответ зависит от того, что это все еще делает работу. Вероятно, вы можете узнать с помощью дампа потока (например, с помощью jstack). Но если это что-то, что было начато весной, вы должны иметь возможность использовать ConfigurableApplicationContext.close() чтобы остановить приложение в методе main () (или в CommandLineRunner).


Я нашел решение. Вы можете использовать это:

public static void main(String[] args) {
    SpringApplication.run(RsscollectorApplication.class, args).close();
    System.out.println("done");
}

просто использовать .близко на бегу.


Я также встретил эту проблему в моем текущем проекте (spring boot application). Мое решение:

// releasing all resources
((ConfigurableApplicationContext) ctx).close();
// Close application
System.exit(0);

context.close() Не останавливайте наше консольное приложение, оно просто освобождает ресурсы.


Это сочетание @EliuX ответ @Quan Vo один. Спасибо вам обоим!

главное мне пройти SpringApplication.код ответа exit (context) в качестве параметра системы.exit () поэтому, если есть ошибка закрытия контекста Spring, вы заметите.

SpringApplication.exit () закроет контекст Spring.

Система.exit () закроет приложение.

@Component
public class OneTimeRunner implements CommandLineRunner {

    @Autowired
    private ConfigurableApplicationContext context;

    @Override
    public void run(String... args) throws Exception { 
       System.exit(SpringApplication.exit(context));
    }
}

использовать org.springframework.boot.SpringApplication#exit. Е. Г.

@Component
public class OneTimeRunner implements CommandLineRunner {

    @Autowired
    private ConfigurableApplicationContext context;

    @Override
    public void run(String... args) throws Exception { 
        SpringApplication.exit(context);
    }
}