Spring Controller, как выйти из цикла на основе нового HttpRequest?

#java #spring #controller #while-loop #session-scope

#java #spring #контроллер #цикл while #область действия сеанса

Вопрос:

У меня есть Spring @Controller. Внутри контроллера есть метод, который после определенного запроса вводит цикл while, который проверяет наличие новых данных и прерывается только тогда, когда данные найдены:

 while(System.currentTimeMillis() < end amp;amp; controllersDataStore.getAutoupdate() == eventAutoUpdate ) {

        gridData = (GenericGrid) dsEventLogService.retrieveNewEventGridRows(gridHelper);
        if(gridData.getAaData().size()==0){
            try {
                Thread.sleep(POLLING_INTERVAL);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        else{
            break;
        }
    }
  

Мне нужно выйти из цикла в определенных случаях, даже если данные не найдены, после определенного действия пользователя. Итак, мне нужно из нового HttpRequest, чтобы иметь возможность выходить из предыдущего цикла while.

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

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

Есть ли какой-либо способ сделать это, кроме того, чтобы у контроллера была область сеанса? (Я даже не уверен, сработает ли это).

Заранее благодарю вас, я буду признателен за любой совет.

Комментарии:

1. Контроллер с сессионной областью — самое простое решение для этого, почему вы не хотите его пробовать?

2. Я неохотно, потому что контроллеры не должны быть привязаны к сеансу. Мне было интересно, есть ли «лучшее» решение.

3. Кто говорит? Контроллеры с ограниченной областью действия — это совершенно правильная вещь.

4. поскольку сервлеты (контроллеры) управляются контейнером, контейнер создает только один экземпляр сервлета для обработки запросов от всех пользователей. привязка к сеансу нарушает всю концепцию, не так ли?

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

Ответ №1:

Сохраните значение keepRunning в таблице конфигурации db и через n секунд проверьте это тоже.

Отдельный запрос в другом контроллере может обновлять переменную состояния независимо от этого контроллера.

Комментарии:

1. привет, мне нужна одна переменная за сеанс, хотя, как я буду различать пользователей?

2. Используйте HttpSession для сохранения этого флага keepRunning. Для каждого пользователя, в памяти, потокобезопасен и работает в кластеризованной среде.

3. Извините, но я не понимаю. Если я сохраню его в HttpSession, у меня не будет доступа к нему изнутри цикла while. Потому что переменная будет изменена в другом запросе, следовательно, в другом экземпляре сеанса. Я ошибаюсь?