【问题标题】:Java Spring Boot: Making standalone application run without exitJava Spring Boot:使独立应用程序无需退出即可运行
【发布时间】:2019-06-04 23:17:55
【问题描述】:

我正在创建独立的 Spring Boot Java 应用程序,其中处理调度程序、数据库驱动的事件。 我正在使用 spring boot 2.1.1,我希望我的独立 java 应用程序在我的应用程序中运行而不退出。 我不想依赖操作系统特定的工具,如 nohup、javaw 等。 我尝试使用 spring-boot-web 和嵌入式容器(tomcat/jetty),只是为了让应用程序在执行 main 方法时运行。 但它添加了不需要的依赖项并坚持从执行 java -jar 的控制台。 spring 或 java 提供什么更好的方法来做到这一点?

【问题讨论】:

  • 为什么要让它继续运行?如果它不是一个 Web 应用程序,它应该被触发、处理并退出。您可以在需要时再次调用它,例如库。
  • 保持运行的原因:应用程序执行了一些从DB读取的计划任务和事件。
  • 考虑启用调度并使用任务调度程序,它将继续运行并防止您的应用程序关闭。
  • @Ubercool 所说的 - 使用非守护线程池启用任务调度并在其上调度任务。这将防止您的应用程序关闭。
  • 启用调度器是很酷的选择,前提是至少有一个调度器任务一直在运行

标签: spring-boot


【解决方案1】:

应用程序将在最后一个非守护线程退出时退出。这是关闭应用程序上下文的时间。如果您自己创建一个非守护线程,您可以防止这种情况发生,它将等待以编程方式关闭上下文(例如,通过信号 ctrl+c)。

@Bean
public DisposableBean contextShutdownGate(ApplicationContext context) {
    CountDownLatch latch = new CountDownLatch(1);
    Thread await = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                latch.await();
            } catch (InterruptedException e) {
                LOGGER.error("contextAwait interrupted", e);
            }
        }
    }, "contextAwait-" + context.getId() + "-" + context.getStartupDate());
    await.setDaemon(false);
    await.start();
    return () -> {
        latch.countDown();
    };
}

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 2023-01-25
    • 2017-05-25
    • 1970-01-01
    • 2020-01-29
    • 2016-07-04
    • 2020-09-22
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多