当前位置: 首页 > 知识库问答 >
问题:

Spring boot应用程序在关闭时不会禁止新的传入连接,但会突然退出

陈法
2023-03-14

我有一个Spring Boot应用程序,它创建了一个线程,在调用SpringApplication.exit()以终止长时间空闲的应用程序之前监视空闲时间。我有一个restcontroller类,它为web请求提供服务。

问题是,即使在调用SpringApplication.exit()之后,控制器似乎在应用程序本身退出之前接受传入连接一小段时间。当controller接受一个新的传入连接时,这会导致客户端突然终止,然后之前对SpringApplication.exit()的调用生效并使应用程序退出。

//伪代码

@RestController
public class AppController {

  @PostMapping("/testproc")
  public ExitStatus process(@RequestBody Job testJob) {
    logger.info("Job batch Id passed: {}", testJob.batchId);
    //do processing
    if(shutdownFlag) {
        //report error to client
    } else {
        //do regular processing
    }
  }
}

@SpringBootApplication
public class MyApplication {

  public static void main(String[] args) {
    ctx = SpringApplication.run(MyApplication.class, args);
    Thread shutdownThread = new Thread(new Runnable() {
                  //check for some condition
                  if(shutdownFlag) {
                       logger.info("Exiting");
                       SpringApplication.exit(ctx, () -> 0);
                       return;
                  }
             });

    shutdownThread.start();
  }
}

生成的日志:

2019-03-23 02:02:46.439  INFO 13484 --- [      Thread-10] c.i.e.newgenv1.svc.MyApplication   : Exiting
2019-03-23 02:02:46.441  INFO 13484 --- [      Thread-10] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6660a289: startup date [Sat Mar 23 02:02:29 IST 2019]; root of context hierarchy
2019-03-23 02:02:46.509  INFO 13484 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2019-03-23 02:02:46.665  INFO 13484 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 156 ms
2019-03-23 02:02:47.559  INFO 13484 --- [nio-8081-exec-2] c.i.etl.newgenv1.svc.AppController  : Job batch Id passed: 23
2019-03-23 02:02:53.828  INFO 13484 --- [      Thread-10] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

请注意记录的线路。关闭线程生成的“退出”行发生在控制器拾取连接并打印批处理id之前

共有1个答案

夏理
2023-03-14

您可以添加一个拦截器,它将检查是否启动了关闭。如果不是,流将继续它的正常执行,否则应该删除请求并发送正确的响应。

 类似资料:
  • 我有一个Spring Hibernate Tomcat MySql应用程序正在生产中,我遇到了一个问题。我认为应用程序没有关闭它的jdbc连接,当它达到极限(目前为200)时,应用程序停止响应,我必须重新启动tomcat。我需要在某处关闭此连接吗?这是我的数据源: 这是从3天到现在,应用程序监控连接的图像 这是我在卡塔琳娜号上所犯错误的摘录。输出日志文件: 类型异常报告 消息请求处理失败;嵌套异常

  • 问题内容: 我最近开始在应用程序中使用hibernate和c3p0作为ORM。但是,当我关闭会话工厂时,连接池不会自行关闭!这是我的应用程序中 唯一 可以进行会话操作的地方。 这是我的配置文件 请注意,空闲连接非常短的原因是它是我尚未通过集成测试的唯一方法。他们经常打开和关闭会话工厂,因此我总是用尽所有连接。正如我们在项目开始时一样,从长远来看,我认为这不是一个非常可持续的策略。 需要注意的“有趣

  • 问题内容: 我的问题是这样的: 即使读取完成(数百万行)的文件后,如何仍能使该线程保持活动状态 问题是我有一个从javafx应用程序线程启动的线程,然后该线程(新线程)对文本文件执行一些读/写操作,当面对巨大的文件以进行解析时,它不会自然退出,需要花费一千七百万具体来说,行大。 我假设这是由于线程保留了我所缺少的某些资源,但是,由于我使用的是try-with-resource模型,所以我不确定这是

  • 我想连接到FTP目标并向其写入文件。FTP在进入PASV模式后突然关闭。FTP服务器设置本身没有问题。我不确定我能在FTP服务器上修复什么来修复这个问题。有什么想法吗?

  • 我试图重新创建Connect四,我成功了。但我想通过频繁地切换颜色,给玩家一个获胜的四张光盘在哪里的指示。我对线程和编程中的时间概念是新的。 我也成功地给了用户这个指示,但是在关闭应用程序之后,控制台仍然会给出输出,也是在使用SetonCloserEquest时。 代码如下:

  • 我有一个类,,并用注释它。 我在该类中有两个方法: 我看到,当它应该打印它们中的内容时,它会打印出来,但当我在intelij中按一次停止按钮时,我会得到: 我需要再按一次停止按钮才能完全停止。 为什么即使到达也不关闭ExecutorService?我做错了什么? PS:这是我唯一的ExecutorService,没有其他线程是我做的。 停止按钮是intelij IDEA中play和debug按钮附