Изменение конфигурации Vaadin flow (14) basi c не влияет - PullRequest
1 голос
/ 05 марта 2020

Я использую Vaadin Flow (14.1.18), и мой вопрос - очень странное поведение, с которым я столкнулся. Я добавил следующие конфиги в файл application.properties моего проекта Spring Boot.

// Expected behavior: Vaadin Client to send heartbeat to the server every second    
vaadin.heartbeatInterval=1
// Expected Behavior: Vaadin Server to close Idle sessions after 3 seconds (3 rounds of failed heart beats)
vaadin.closeIdleSessions=true

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

DeploymentConfiguration deployConf = VaadinSession.getCurrent().getConfiguration();
int hbi =deployConf.getHeartbeatInterval();
boolean killIdle = deployConf.isCloseIdleSessions();
logger.info("Deployment Config >> KillIdleSessions : {} -- HeartBeatInterval : {}", killIdle, hbi);

И я получить следующий результат, который показывает, что мои конфиги были применены

2020-03-05 23: 16: 01.015 INFO 19224 --- [nio-9200-exe c -3] com.package. sandbox.MainView: Конфигурация развертывания >> KillIdleSessions: true - HeartBeatInterval: 1

Но проблема в том, что во время выполнения Vaadin игнорирует все эти конфигурации, и, несмотря на то, что я закрываю браузер (Экземпляр пользовательского интерфейса больше не будет отправлять тактовые импульсы), сеанс остается открытым неопределенно долго и никогда не закрывается (или уничтожается, с точки зрения Ваадина).

1 Ответ

3 голосов
/ 06 марта 2020

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

Когда VaadinService завершил обработку запроса, он вызывает VaadinService#cleanupSession. Это перебирает все пользовательские интерфейсы в сеансе и проверяет, превышает ли время, прошедшее с момента последнего тактового импульса, три интервала тактовых импульсов, и в этом случае пользовательский интерфейс закрывается. Смысл этого состоит в том, чтобы очистить неактивные пользовательские интерфейсы в сеансе, например, от закрытых вкладок или обновленных windows.

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

Вместо этого в игру вступает тайм-аут сеанса. Вы можете настроить его с помощью server.servlet.session.timeout, например 120s или 2m. Во встроенном Tomcat есть поток жнецов, который запускается раз в минуту, и он закрывает все неактивные сеансы. Обратите внимание, что в Spring минимальное значение для тайм-аута сеанса составляет одну минуту.

Если пользовательский интерфейс оставлен открытым, но бездействующим, тактовые импульсы будут поддерживать сеанс активным и предотвращать закрытие формы обработчиком тайм-аута сеанса. Здесь closeIdleSessions вступает в игру. Если для него задано значение true, после завершения запроса Vaadin проверит последнюю метку времени запроса без сердцебиения, а если превышено время ожидания сеанса, он будет закрыт Vaadin.

Итак, вкратце

heartbeatInterval контролирует, как быстро закрываются другие неактивные пользовательские интерфейсы в сеансе, но не влияет на последний пользовательский интерфейс.

closeIdleSessions контролирует, должны ли тактовые импульсы предотвращать тайм-аут сеанса для пользовательский интерфейс в противном случае.

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

...