更改Vaadin流程(14)基本配置不影响

Maj*_*jid 2 java session vaadin vaadin-flow

我正在使用 Vaadin Flow (14.1.18),我的问题是我遇到过的一个非常奇怪的行为。我已将以下配置添加到 Spring Boot 项目的 application.properties 文件中。

// 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
Run Code Online (Sandbox Code Playgroud)

我已经使用下面的代码检查了这些配置是否在运行时实际应用

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

我得到以下结果,显示我的配置已应用

2020-03-05 23:16:01.015 INFO 19224 --- [nio-9200-exec-3] com.package.sandbox.MainView:部署配置 >> KillIdleSessions:true -- HeartBeatInterval:1

但是,问题是,在运行时,Vaadin 似乎忽略了所有这些配置,尽管我关闭了浏览器(UI 实例将不再在那里发送心跳),会话仍无限期地保持打开状态,并且永远不会关闭(或销毁) ,从 Vaadin 的角度来看)。

Taz*_*voo 8

心跳用于关闭会话中的其他 UI,它不会帮助关闭最后一个 UI。

VaadinService完成处理请求后,它会调用VaadinService#cleanupSession。这将循环遍历会话中的所有 UI,并检查自上次心跳以来经过的时间是否长于三个心跳间隔,在这种情况下,UI 将关闭。这样做的目的是清理会话中不活动的 UI,例如关闭的选项卡或刷新的窗口。

当您关闭最后一个选项卡时,服务器将不会再收到该会话的任何请求。由于清理代码是在请求结束时运行的,因此不会再触发它。这可以防止您的最后一个 UI 被关闭。

相反,会话超时会发挥作用。server.servlet.session.timeout您可以使用例如120s或进行配置2m。嵌入式 Tomcat 有一个每分钟运行一次的收割者线程,它将关闭所有不活动的会话。请注意,对于 Spring,会话超时的最小值是一分钟。

如果您让 UI 打开但空闲,心跳将使会话保持活动状态,并防止会话超时处理程序关闭它。这就是closeIdleSessions发挥作用的地方。如果设置为true,则请求结束后,Vaadin会检查非心跳请求的最后时间戳,如果超过会话超时,则会被Vaadin关闭。

所以,简而言之

heartbeatInterval控制会话中其他不活动 UI 的关闭速度,但不影响最后一个 UI。

closeIdleSessions控制心跳是否应防止空闲 UI 的会话超时。

注意:更改 中的值后application.properties,您可能需要一个隐身窗口来测试您的更改,因为最后一个会话可能已被序列化并在重新启动后重新使用。

  • 哇,一百万感谢您如此彻底和全面的解释。在过去的几天里,我一直在阅读 Vaadin 文档并探索论坛,但没有发现任何比这更好的东西。我将根据说明更改我的代码,希望这次能成功。再次感谢你,亲爱的,@Erik (2认同)