Как закрыть приложение командной строки 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);
}
}