Использование конечной точки весеннего останова - PullRequest
0 голосов
/ 28 апреля 2020

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

@RestController
public class ShutdownController implements ApplicationContextAware {

    private ApplicationContext context;

    @PostMapping("/shutdown")
    public void shutdownContext() {
        ((ConfigurableApplicationContext) context).close();
    }

    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        this.context = ctx;

    }
}

Проблема возникает, когда я пытаюсь отправить запрос на конечную точку из моего приложения. Это код, который я запускаю:

new RestTemplate().postForLocation(shutdownUri, null);

Броски:

org.springframework.web.client.ResourceAccessException: ошибка ввода-вывода при запросе POST для "http://localhost: 8083 / shutdown": неожиданный конец файла с сервера; вложенное исключение: java. net .SocketException: неожиданный конец файла с сервера

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

1 Ответ

0 голосов
/ 28 апреля 2020

Приложение 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.");
    }
}

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

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