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



我正在使用Vaadin Flow(14.1.18(,我的问题是我遇到的一个非常奇怪的行为。我已经将以下配置添加到我的SpringBoot项目的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

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

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信息19224-〔nio-9200-exec-3〕com.package.sandbox.MainView:部署配置>>KillIdleSessions:true--心跳间隔:1

但是,问题是,在运行时,Vaadin似乎忽略了所有这些配置,尽管我关闭了浏览器(UI实例将不再存在以发送检测信号(,但会话将无限期保持打开状态,永远不会关闭(或者从Vaadin的角度来看,被破坏(。

心跳用于关闭会话中的其他UI,这对关闭最后一个UI没有帮助。

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

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

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

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

因此,简而言之,

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

CCD_ 8控制心跳是否应防止会话超时用于原本空闲的UI。

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

最新更新