如何关闭 Spring Boot 命令行应用程序

新手上路,请多包涵

我正在使用 Spring Boot 构建命令行 java 应用程序以使其快速运行。

该应用程序加载不同类型的文件(例如 CSV)并将它们加载到 Cassandra 数据库中。它不使用任何网络组件,它不是网络应用程序。

我遇到的问题是在工作完成后停止应用程序。我正在使用带有 @Component 的 Spring CommandLineRunner 接口来运行任务,如下所示,但是当工作完成时,应用程序不会停止,它由于某种原因继续运行,我找不到阻止它的方法。

 @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 版本,问题消失了。

原文由 ESala 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

答案取决于仍在工作的是什么。您可能可以通过线程转储找到答案(例如使用 jstack)。但是,如果它是由 Spring 启动的任何东西,您应该能够使用 ConfigurableApplicationContext.close() 在 main() 方法(或 CommandLineRunner )中停止应用程序。

原文由 Dave Syer 发布,翻译遵循 CC BY-SA 3.0 许可协议

我找到了解决办法。你可以使用这个:

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

只需在运行时使用 .close()

原文由 ACV 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题