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

Java 更改Vaadin流量(14)基本配置不会影响,java,session,vaadin,vaadin-flow,Java,Session,Vaadin,Vaadin Flow,我使用的是Vaadin Flow 14.1.18,我的问题是我遇到的一个非常奇怪的行为。 我已将以下配置添加到Spring Boot项目的application.properties文件中 //预期行为:Vaadin客户端每秒向服务器发送心跳信号 瓦丁心跳间隔=1 //预期行为:Vaadin服务器在3秒钟后关闭空闲会话3轮心跳失败 vaadin.closeidlessessions=true 我已经使用下面的代码检查了这些配置,以便在运行时实际应用 DeploymentConfiguration

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

//预期行为:Vaadin客户端每秒向服务器发送心跳信号 瓦丁心跳间隔=1 //预期行为:Vaadin服务器在3秒钟后关闭空闲会话3轮心跳失败 vaadin.closeidlessessions=true 我已经使用下面的代码检查了这些配置,以便在运行时实际应用

DeploymentConfiguration deployConf=VaadinSession.getCurrent.getConfiguration; int hbi=deployConf.getHeartbeatInterval; 布尔killIdle=deployConf.iscloseidlessessions; logger.infoDeployment Config>>killIdle会话:{}-HeartBeatInterval:{},killIdle,hbi; 我得到了下面的结果,这表明我的配置得到了应用

2020-03-05 23:16:01.015信息19224-[nio-9200-exec-3] com.package.sandbox.MainView:部署配置>>KillIDResessions: 真实心跳间隔:1


但是,问题是,在运行期间,Vaadin似乎忽略了所有这些配置,尽管我关闭了浏览器UI实例,但它将不再存在以发送心跳,在Vaadin看来,会话将无限期地保持打开状态,永远不会被关闭或破坏。

心跳用于关闭会话中的其他UI,这无助于关闭最后一个UI

当VaadinService处理完请求后,它调用VaadinServicecleanupSession。这将遍历会话中的所有UI,并检查自上次心跳以来经过的时间是否超过三个心跳间隔,在这种情况下,UI将关闭。其要点是清理会话中的非活动UI,例如从关闭的选项卡或刷新的窗口

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

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

如果用户界面保持打开但处于空闲状态,心跳将使会话保持活动状态,并防止会话超时处理程序关闭会话。这就是近距离对话发挥作用的地方。如果设置为true,则在请求结束后,Vaadin将检查非心跳请求的最后一个时间戳,如果超过会话超时,Vaadin将关闭该请求

简言之

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

closeIdleSessions控制心跳是否应防止会话超时,否则将导致空闲UI超时


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

心跳用于关闭会话中的其他UI,这无助于关闭上一个UI

当VaadinService处理完请求后,它调用VaadinServicecleanupSession。这将遍历会话中的所有UI,并检查自上次心跳以来经过的时间是否超过三个心跳间隔,在这种情况下,UI将关闭。其要点是清理会话中的非活动UI,例如从关闭的选项卡或刷新的窗口

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

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

如果用户界面保持打开但处于空闲状态,心跳将使会话保持活动状态,并防止会话超时处理程序关闭会话。这就是近距离对话发挥作用的地方。如果设置为true,则在请求结束后,Vaadin将检查非心跳请求的最后一个时间戳,如果超过会话超时,Vaadin将关闭该请求

简言之

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

closeIdleSessions控制心跳是否应防止会话超时,否则将导致空闲UI超时

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

哇,非常感谢您提供了如此全面的解释。在过去的几天里,我一直在阅读Vaadin的文档和探索论坛,但没有发现任何比这更好的东西。我将根据指令更改代码,希望这次能正常工作。再次感谢你,亲爱的,@ErikHi Erik,多亏你的帮助,我终于成功地处理了会话超时。但是现在我面临另一个与被破坏会话的垃圾收集相关的问题。如果您能研究这个问题并分享您的想法,我将不胜感激。不客气!我发布了你另一个问题的答案。哇,万分感谢你如此透彻和全面的解释。在过去的几天里,我一直在阅读Vaadin的文档和探索论坛,但没有发现任何比这更好的东西。我将根据指令更改代码,希望这次能正常工作。再次感谢你,亲爱的,@ErikHi Erik,多亏你的帮助,我终于成功地处理了会话超时。但是现在我面临另一个与被破坏会话的垃圾收集相关的问题。如果您能研究这个问题并分享您的想法,我将不胜感激。不客气!我贴出了你另一个问题的答案。