В моем приложении мне нужно реализовать функции, которые гарантируют, что если клиент сделает запрос GET, приложение будет удерживать этот запрос до тех пор, пока в базе данных не произойдет какое-либо изменение, а также можно будет установить максимальное время удержания. Например:
Пользователь делает запрос GET, и запрос будет удерживаться в течение 20 секунд. Если в течение этих 20 секунд в базе данных что-то изменится, приложение выпускает этот запрос с необходимыми данными, иначе приложение удерживает запрос в течение 20 секунд.
Я решаю использовать длительный опрос. В своем приложении я также использую Spring Boot. Можете ли вы сказать мне, возможно ли это сделать с помощью Spring или мне следует добавить для этого какую-нибудь другую библиотеку?
Я также нашел Spring Scheluder для удержания запроса в течение некоторого интервала, но проблема в том, что планировщик не разрешен для методов с параметрами, но мне нужно получить данные от конкретного пользователя, поэтому должен быть передан хотя бы идентификатор пользователя. Также я не уверен, можно ли вручную выпустить этот планировщик, когда это необходимо.
Спасибо за совет!
Сильно связано: stackoverflow.com/q/31458910/1079354
Обычно клиент, но не сервер, решает, как долго он хочет ждать ответа от сервера или отключается из-за отсутствия ответа, поэтому я не уверен, является ли HTTP правильный протокол в вашем случае, тогда
@RomanVottner, а какой протокол вы порекомендуете?
@Scheduled не используется для обработки запросов. Он используется как внутренняя функция crontab для вашего приложения, для выполнения специальной работы, такой как очистка кеша или обновление токена OAuth.




Для длинного запроса вы можете использовать DeferredResult. когда вы возвращаете ответ DeferredResult, поток запроса будет свободен, и этот запрос обрабатывается рабочим потоком. Вот один пример:
@GetMapping("/test")
DeferredResult<String> test(){
Long timeOutInMilliSec = 100000L;
String timeOutResp = "Time Out.";
DeferredResult<String> deferredResult = new DeferredResult<>(timeOutInMilliSec,timeOutResp);
CompletableFuture.runAsync(()->{
try {
//Long pooling task;If task is not completed within 100 sec timeout response retrun for this request
TimeUnit.SECONDS.sleep(10);
//set result after completing task to return response to client
deferredResult.setResult("Task Finished");
}catch (Exception ex){
}
});
return deferredResult;
}
На этот запрос дайте ответ через 10 секунд ожидания. если вы подождете более 100 секунд, вы получите ответ по таймауту.
Посмотрите на это.
Вероятно, вам следует рассмотреть SSE или WebSockets, чтобы сервер уведомлял клиентов, когда работа выполнена. Поскольку длинный опрос добавляет много накладных расходов HTTP