Vaadin 中的 Push 支持问题
Posted
技术标签:
【中文标题】Vaadin 中的 Push 支持问题【英文标题】:Problems with Push support in Vaadin 【发布时间】:2014-03-03 02:14:30 【问题描述】:我在 Vaadin 7 中的服务器推送支持方面遇到了一些严重问题,而且很难确定问题所在。我已经按照 Vaadin 中关于启用服务器推送的所有步骤进行操作,包括将 vaadin-push.jar 文件添加到 WEB-INF/lib,将“asyncSupported = true”参数添加到 @WebServlet 注释,以及添加@Push 注释到 UI 类。 (我还尝试在部署描述符中指定等效项。)我还将 org.atmosphere.useWebSocketAndServlet3=true 属性添加到我的 Tomcat 7 服务器的 catalina.properties 文件中,如 https://vaadin.com/wiki/-/wiki/Main/Working%20around%20push%20issues 中所建议的那样。
我发现服务器推送支持非常古怪,因此很难识别问题。比如在开发代码时,服务器往往不会自动重启;仅在我关闭浏览器(不仅仅是浏览器窗口)时识别新代码,停止服务器并重新启动 Eclipse;缺少这些步骤中的任何一个都将导致服务器推送无法正常工作。请注意,此问题仅在启用服务器推送时发生。我读到一些关于启用推送时会话不会过期的内容 (https://vaadin.com/forum#!/thread/3576361),所以也许这就是原因..
我经常遇到可疑的日志消息:
Mar 02, 2014 9:25:45 PM com.vaadin.server.communication.PushHandler$3 run
WARNING: Could not find push connection to close: 38450652-2a2b-4221-8300-8313e9c4779a with
transport WEBSOCKET
Mar 02, 2014 9:25:45 PM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already. Could not load
java.nio.ByteBuffer.
Atmosphere 似乎正在寻找异步支持:
INFO: Atmosphere is using async support:
org.atmosphere.container.Tomcat7AsyncSupportWithWebSocket running under container: Apache
Tomcat/7.0.47
我也发现了这个错误;不知道这是否表明一个严重的问题(没有尝试解决它,因为我不想进入 Atmosphere 的东西):
WARNING: No BroadcasterCache configured. Broadcasted message between client reconnection will be
LOST. It is recommended to configure the org.atmosphere.cache.UUIDBroadcasterCache
也就是说,Firefox 与 Server Push 配合得很好,而 Chrome 则存在问题并且 IE 会出现错误(惊喜!)。特别是,Chrome 通常需要很长时间才能将 UI 交互(例如,按钮推送)传达给服务器,从而在右上角出现一个微调器(将颜色从黄色变为橙色再变为红色)。当多个窗口打开时,IE 只会更新错误的 UI 组件。所以,只要每个用户都使用 Firefox 就没有问题,但我无法假设。
我看到了这篇文章,其中开发人员表达了他们对该功能的不满:https://vaadin.com/forum#!/thread/4040408。这是一篇近期发布的文章,因此听起来不太乐观。我需要服务器推送功能的唯一原因是允许 ChatBox 插件 (https://vaadin.com/directory/-/directory/addon/chatbox) 实时更新。
有什么想法吗?有没有人遇到过这类错误并设法得到一些解决方法?或者更好的是,有没有人让 ChatBox 插件与服务器推送一起使用?
谢谢,
威廉
【问题讨论】:
对,这很奇怪。你使用 SpringVaadinIntegration 插件吗? 感谢您的回答。不,只是使用普通的旧 Vaadin。 不确定应用程序@William 的要求是什么,但我遇到了类似的问题,无法解决。我改为使用UI.setPollInterval()
,它似乎工作并且可靠。这是一项民意调查,而不是推动,但至少它有效。
这似乎已经解决了,谢谢@hmjd!
【参考方案1】:
再试一次
Web Push 仍然是一项年轻的技术,尤其是WebSocket 品种。 Tomcat 例如将一个 WebSocket 实现替换为另一个。 Vaadin 采用Atmosphere library 以及 Vaadin 7 中的所有其他工作都相对较新。在发布此问题后的几个月里,情况有了很大改善。我建议再试一次 Push。
使用最新版本的网络服务器。例如,Tomcat 7 & 8 和Jetty 在对 Push 和 WebSocket 的支持方面都进行了重大更改。
使用最新版本的Java 8 和Vaadin(现在为7.3.7)。
不需要setPollInterval
不需要像上面的 cmets 中提到的那样调用UI::setPollInterval
。该功能仅使用一种推送方法。
您只需要@Push
注释。还有一个Thread,或者更好的ScheduledExecutorService,用于更新数据以显示在您的应用程序中。使用 @Push
注释可以使用 Atmosphere 库。 Atmosphere 尝试了多种 Push 技术,从 WebSocket 开始,并自动使用其他技术作为后备。
工作示例
我最近(2015 年 1 月)发布了一个在 Vaadin 7.3.7 工作的 working example of Push 作为对 another question 的回答。我的示例是故意最小化的,使用单个文件替换新的默认 Vaadin 应用项目中的 MyUI
文件的内容。
【讨论】:
以上是关于Vaadin 中的 Push 支持问题的主要内容,如果未能解决你的问题,请参考以下文章
Vaadin 19 中的 VaadinWebSecurityConfigurerAdapter 发生了啥?
更改 sqlcontainer 中的属性时出现 java.sql.SQLIntegrityConstraintViolationException - Vaadin