Приложение Spring Boot не может ответить на запрос, так как он был выключен. Таким образом, вы можете создать службу, которая обрабатывает процесс выключения как asyn c, вы можете подождать, пока клиент сообщит, что приложение успешно получило запрос на выключение, и затем завершить работу приложения.
Создать класс службы:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class ShutdownService implements ApplicationContextAware {
private ApplicationContext context;
@Async
public void shutDown() {
try {
Thread.sleep(5_000);
((ConfigurableApplicationContext) context).close();
} catch (InterruptedException e) {
//
}
}
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.context = ctx;
}
}
Чтобы заставить его работать, пометьте класс приложения как:
@EnableAsync
Вы также можете настроить Executor
настройки в соответствии с вашими потребностями.
Создать свой контроллер следующим образом:
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ShutdownController {
private final ShutdownService shutdownService;
public ShutdownController(ShutdownService shutdownService) {
this.shutdownService = shutdownService;
}
@PostMapping("/shutdown")
public ResponseEntity<String> shutdownContext() {
shutdownService.shutDown();
return ResponseEntity.ok().body("Shutdown request is successfully received.");
}
}
Вы можете дважды проверить, произошло ли что-то не так во время процесса выключения.