Приложение весенней загрузки при закрытии не запрещает новые входящие соединения, но внезапно завершает работу - PullRequest
1 голос
/ 23 марта 2019

У меня есть приложение весенней загрузки, которое создает поток, который отслеживает время простоя перед вызовом SpringApplication.exit (), чтобы завершить приложение, если оно не используется в течение длительного времени ... И у меня есть класс restcontroller, который обслуживает веб-запросы ..

Проблема в том, что даже после вызова SpringApplication.exit () контроллер, кажется, принимает входящие соединения в течение небольшого промежутка времени, прежде чем само приложение завершается. И это приводит к тому, что клиент внезапно прерывается, когда новое входящее соединение принимается контроллером, а затем вступает в силу более ранний вызов 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();
  }
}

созданных журналов:

<b>2019-03-23 02:02:46.439  INFO 13484 --- [      Thread-10] c.i.e.newgenv1.svc.MyApplication   : Exiting</b>
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
<b>2019-03-23 02:02:47.559  INFO 13484 --- [nio-8081-exec-2] c.i.etl.newgenv1.svc.AppController  : Job batch Id passed: 23</b>
2019-03-23 02:02:53.828  INFO 13484 --- [      Thread-10] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

Просьба учесть записанные строки. Строка «Выход», генерируемая потоком завершения, происходит до того, как Контроллер обнаруживает соединение и печатает идентификатор партии

Мне нужно либо остановить контроллер от получения новых подключений, либо сообщить клиенту код ошибки в это время. Но проблема в том, что контроллер устанавливает соединение, но прежде чем он может сообщить об ошибке, приложение завершает работу.

Я даже попробовал изящную логику выключения, изложенную здесь: https://dzone.com/articles/graceful-shutdown-spring-boot-applications

но все равно это не помогает ..

1 Ответ

1 голос
/ 23 марта 2019

Вы можете добавить перехватчик, который будет проверять, инициировано ли отключение.Если нет, поток продолжит свое нормальное выполнение, иначе запросы должны быть отброшены, и должен быть отправлен правильный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...