更改 Vaadin 流程 (14) 基本配置不影响
Changing Vaadin flow (14) basic configuration doesn't affect
我正在使用 Vaadin Flow (14.1.18),我的问题是我遇到的一个非常奇怪的行为。
我已将以下配置添加到我的 Spring 引导项目的 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 INFO 19224 --- [nio-9200-exec-3]
com.package.sandbox.MainView : Deployment Config >> KillIdleSessions :
true -- HeartBeatInterval : 1
但是,问题是,在运行时,Vaadin 似乎忽略了所有这些配置,尽管我关闭了浏览器(UI 实例将不再发送心跳)会话仍然存在无限期地打开并且永远不会关闭(或销毁,在 Vaadin 看来)。
心跳用于关闭会话中的其他 UI,它无助于关闭最后一个 UI。
当 VaadinService
处理完请求后,它会调用 VaadinService#cleanupSession
。这将循环遍历会话中的所有 UIs,并检查自上次心跳以来经过的时间是否长于三个心跳间隔,在这种情况下 UI 将关闭。这样做的目的是清除会话中的非活动 UIs,例如来自关闭的选项卡或刷新的 windows.
当您关闭最后一个选项卡时,服务器将不会再收到该会话的任何请求。由于清理代码是 运行 在请求结束时,它不会再被触发。这可以防止您的最后一个 UI 被关闭。
相反,会话超时开始起作用。您可以使用 server.servlet.session.timeout
配置它,例如120s
或 2m
。嵌入式 Tomcat 有一个每分钟 运行 一次的收割线程,它将关闭所有不活动的会话。请注意,对于 Spring,会话超时的最小值为一分钟。
如果您让 UI 打开但空闲,心跳将使会话保持活动状态,并防止会话超时处理程序关闭它。这就是 closeIdleSessions
发挥作用的地方。如果设置为true,一个请求结束后,Vaadin会检查非心跳请求的最后一个时间戳,如果超过session超时时间,会被Vaadin关闭。
所以,简而言之
heartbeatInterval
控制会话中其他非活动 UI 的关闭速度,但不影响最后一个 UI.
closeIdleSessions
控制心跳是否应防止会话因其他空闲 UI.
而超时
注意:在 application.properties
中更改值后,您可能需要隐身 window 来测试您的更改,因为上次会话可能已经序列化并在重启后重新使用。
我正在使用 Vaadin Flow (14.1.18),我的问题是我遇到的一个非常奇怪的行为。 我已将以下配置添加到我的 Spring 引导项目的 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 INFO 19224 --- [nio-9200-exec-3] com.package.sandbox.MainView : Deployment Config >> KillIdleSessions : true -- HeartBeatInterval : 1
但是,问题是,在运行时,Vaadin 似乎忽略了所有这些配置,尽管我关闭了浏览器(UI 实例将不再发送心跳)会话仍然存在无限期地打开并且永远不会关闭(或销毁,在 Vaadin 看来)。
心跳用于关闭会话中的其他 UI,它无助于关闭最后一个 UI。
当 VaadinService
处理完请求后,它会调用 VaadinService#cleanupSession
。这将循环遍历会话中的所有 UIs,并检查自上次心跳以来经过的时间是否长于三个心跳间隔,在这种情况下 UI 将关闭。这样做的目的是清除会话中的非活动 UIs,例如来自关闭的选项卡或刷新的 windows.
当您关闭最后一个选项卡时,服务器将不会再收到该会话的任何请求。由于清理代码是 运行 在请求结束时,它不会再被触发。这可以防止您的最后一个 UI 被关闭。
相反,会话超时开始起作用。您可以使用 server.servlet.session.timeout
配置它,例如120s
或 2m
。嵌入式 Tomcat 有一个每分钟 运行 一次的收割线程,它将关闭所有不活动的会话。请注意,对于 Spring,会话超时的最小值为一分钟。
如果您让 UI 打开但空闲,心跳将使会话保持活动状态,并防止会话超时处理程序关闭它。这就是 closeIdleSessions
发挥作用的地方。如果设置为true,一个请求结束后,Vaadin会检查非心跳请求的最后一个时间戳,如果超过session超时时间,会被Vaadin关闭。
所以,简而言之
heartbeatInterval
控制会话中其他非活动 UI 的关闭速度,但不影响最后一个 UI.
closeIdleSessions
控制心跳是否应防止会话因其他空闲 UI.
注意:在 application.properties
中更改值后,您可能需要隐身 window 来测试您的更改,因为上次会话可能已经序列化并在重启后重新使用。