Весенний ОТДЫХ с длинным опросом

В моем приложении мне нужно реализовать функции, которые гарантируют, что если клиент сделает запрос GET, приложение будет удерживать этот запрос до тех пор, пока в базе данных не произойдет какое-либо изменение, а также можно будет установить максимальное время удержания. Например:

Пользователь делает запрос GET, и запрос будет удерживаться в течение 20 секунд. Если в течение этих 20 секунд в базе данных что-то изменится, приложение выпускает этот запрос с необходимыми данными, иначе приложение удерживает запрос в течение 20 секунд.

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

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

Спасибо за совет!

Вероятно, вам следует рассмотреть SSE или WebSockets, чтобы сервер уведомлял клиентов, когда работа выполнена. Поскольку длинный опрос добавляет много накладных расходов HTTP

rena 28.03.2018 18:27

Сильно связано: stackoverflow.com/q/31458910/1079354

Makoto 28.03.2018 18:36

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

Roman Vottner 28.03.2018 19:11

@RomanVottner, а какой протокол вы порекомендуете?

Joe Grizz 28.03.2018 21:07

@Scheduled не используется для обработки запросов. Он используется как внутренняя функция crontab для вашего приложения, для выполнения специальной работы, такой как очистка кеша или обновление токена OAuth.

Jose Martinez 29.03.2018 14:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
4 443
1

Ответы 1

Для длинного запроса вы можете использовать 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 секунд, вы получите ответ по таймауту.

Посмотрите на это.

Другие вопросы по теме