Vaadin 14浏览器多标签支持与并行运行问题咨询
Vaadin 14 多标签页并行运行解决方案
Vaadin 14 本身完全支持打开多个浏览器标签页,你遇到的标签页操作阻塞问题是框架默认的会话锁机制导致的。
阻塞原因
Vaadin 14 默认对同一个用户的HttpSession加全局独占锁,同一时间只有一个来自该用户的请求能拿到锁执行,不管请求来自哪个标签页。所以当一个标签页有长耗时任务在请求线程内执行时,会一直占用会话锁,其他标签页的请求只能排队等待,就出现了你遇到的同步阻塞现象。
实现多标签页并行的方案
你可以通过异步处理长耗时任务的方式,既保留同浏览器共享登录态的能力,又实现多标签页互不阻塞:
- 第一步:为项目开启Push支持,用于异步任务执行完成后主动通知前端更新
你需要在项目的AppShellConfigurator实现类上添加@Push注解:@Push public class AppConfiguration implements AppShellConfigurator { } - 第二步:将所有长耗时业务逻辑移到独立异步线程执行,避免占用请求线程的会话锁
处理长任务的业务代码参考示例如下:public void runLongTask() { // 先记录当前标签页对应的UI实例 UI currentUI = UI.getCurrent(); // 启动独立线程执行业务逻辑,不占用请求线程的会话锁 new Thread(() -> { // 此处放置你的长耗时业务代码,执行过程不会阻塞其他标签页的操作 String taskResult = yourLongTimeBusinessMethod(); // 需要更新当前标签页UI时,调用UI.access方法拿当前UI的锁操作,不影响全局会话 currentUI.access(() -> { Notification.show("任务执行完成: " + taskResult); }); }).start(); }
同浏览器单登录的实现
HttpSession本身就是同浏览器多标签页共享的,你只需要将用户登录态存储在HttpSession中,所有打开的标签页都可以读取到同一份登录信息,不需要用户重复登录,和上述多标签页并行方案完全兼容。
额外配置优化(可选)
你可以在Spring Boot项目的application.properties中调整会话锁的等待超时时间,避免极端情况下的请求长时间挂起:
# 会话锁最长等待时间,单位为秒,默认值为180 vaadin.session.lock.timeout=30
内容的提问来源于stack exchange,提问作者Miłosz Bąbliński
相关产品推荐
相关产品推荐

