Невозможно получить доступ к состоянию в VaadinSession или UI без блокировки сеанса

#tomcat #vaadin #production-environment

#tomcat #vaadin #производственная среда

Вопрос:

Vaadin 14

  1. Мы начали работу с приложением Vaadin. Это мой первый выход в эфир. Когда мы пытаемся перезагрузить всю страницу с помощью вкладки multiples (заполнить содержимое из базы данных). Эта ошибка возникает только при увеличении нагрузки на сервер, например (10 человек). Когда один или два человека используют приложение, такая ошибка / исключение не возникает.

Ниже приведен один из кодов, в котором возникает эта ошибка:

 private void reloadAssignmentButton_onClick(final ClickEvent<Button> event)
{
    try
    {
        this.clearAllLayouts();
        this.makeAllTabsInVisible();
        AssignmentFileDashboardView.log.info(UI.getCurrent().getSession().getAttribute(ConfigProperties.SESSION_KEY)
              "::AssignmentFileDashboardView:::reloadAssignmentButton_onClick:::::CAN_FILE_NUMBER"
              UI.getCurrent().getSession().getAttribute(ConfigProperties.CAN_FILE_NUMBER).toString());
        this.loadAssignment(
            Long.parseLong(UI.getCurrent().getSession()
                .getAttribute(ConfigProperties.CAN_FILE_NUMBER).toString()));
        AssignmentFileDashboardView.tabs.setSelectedTab(AssignmentFileDashboardView.assignmentTab);
    }
    catch(final Exception e)
    {
        AssignmentFileDashboardView.log
            .error(UI.getCurrent().getSession().getAttribute(ConfigProperties.SESSION_KEY)
                  "::AssignmentFileDashBoardView::assignmentRefreshButton_buttonClick::error:: "   e.getMessage()
                  e.getStackTrace(), e);
        
    }
    
}
  

Это моя конфигурация tomcat:

 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="30000" redirectPort="8443" maxThreads="1000" minSpareThreads="50" acceptCount="300" enableLookUps="false" maxKeepAliveRequest = "1"/>
  
  1. Нажатие на эти вкладки некоторое время перестает работать. Опять же, с одним или двумя пользователями он работает нормально, но иногда перестает работать.

  2. Иногда я нажимаю на вкладку, и страница загружается пустой. опять же, никаких проблем, когда 1 или 2 пользователя используют его.

(Первоначально я думал, что на вкладке может возникнуть проблема, и я меняю вкладку на несколько кнопок, думая, что кнопка всегда будет вызывать событие щелчка, несмотря ни на что, но кнопка now также иногда делает то же самое.)

Мы живем, пожалуйста, помогите мне. Заранее спасибо.

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

1. Подобные ошибки обычно возникают, когда вы запускаете свой пользовательский интерфейс, манипулирующий кодом вне текущего «запроса» (где Vaadin заботится о блокировке сеанса для вас). Вы каким-либо образом запускаете указанный код асинхронно?

2. Да, просмотр 2 вкладок с использованием одной таблицы. И я думаю, что во многих представлениях это происходит.

3. Я не понимаю, как это подразумевает асинхронные операции? В любом случае вам следует ознакомиться с доступом к пользовательскому интерфейсу вне запроса: vaadin.com/docs/v14/flow/advanced/tutorial-push-access.html

4. Нет, этого не будет (если только ухудшит ситуацию). Скорее всего, вы обращаетесь к сеансу, когда он не заблокирован. Вы должны вручную заблокировать сеанс. В push-документе объясняется только проблема (код вне запроса, изменяющий пользовательский интерфейс).

5. Пожалуйста, укажите полное исключение stacktrace

Ответ №1:

  1. У меня был пользовательский интерфейс, который был родительской страницей.
  2. Эта родительская страница имела вертикальный макет, в котором открывались дочерние страницы.
  3. На этой родительской странице было несколько кнопок (которые нужно было показывать и скрывать по событиям дочерних страниц), вкладки (которые нужно было показывать и скрывать по событиям дочерних страниц), метки (которые нужно было обновлять по событиям дочерних страниц) и тому подобное.
  4. Чтобы выполнить все эти обновления, я сделал родительские «Компоненты Vaadin» статическими, поскольку я не могу создать объект родительской страницы, поскольку нам нужно было обновить их, пока он был открыт.

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

Обучение: никогда не пытайтесь сделать компонент Vaadin «статичным». На самом деле, старайтесь держаться подальше от ключевого слова «static» как можно больше (если вы не знаете последствий, в данном случае это был я).