2014-03-03 77 views
2

我在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中所建议的。Vaadin推送支持问题

我发现服务器推送支持很古怪,很难识别问题。例如,在开发代码时,服务器通常不会自动重新启动;只关闭浏览器(不仅仅是浏览器窗口)时识别新代码,停止服务器并重新启动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. 

它似乎现场的气氛是找到异步支持:

INFO: Atmosphere is using async support:  
org.atmosphere.container.Tomcat7AsyncSupportWithWebSocket running under container: Apache  
Tomcat/7.0.47 

我也发现了这个错误;不知道这是否表示存在严重问题(还没有尝试解决它,因为我不想要进入大气层的东西):

WARNING: No BroadcasterCache configured. Broadcasted message between client reconnection will be 
LOST. It is recommended to configure the org.atmosphere.cache.UUIDBroadcasterCache 

也就是说,Firefox的工作得很好与服务器推送,而铬有问题和IE喷出错误(惊喜!)。特别是,Chrome通常需要很长时间才能将UI交互(例如按钮推送)传递到服务器,从而在右上方出现一个微调(从黄色变为橙色变为红色)。当多个窗口打开时,IE只会更新错误的UI组件。所以,只要每个用户使用Firefox都没有问题,但我不可能假设。

我遇到过这个帖子,开发人员对这个功能感到沮丧:https://vaadin.com/forum#!/thread/4040408。这是相当近期的一篇文章,所以听起来并不太有希望。我需要Server Push功能的唯一原因是允许ChatBox插件(https://vaadin.com/directory/-/directory/addon/chatbox)实时更新。

任何想法?有没有人得到这些类型的错误,并设法得到一些解决方法?或者更好的是,有没有人获得ChatBox加载项以使用服务器推送?

感谢,

威廉

+0

对,这是一些比较干净的东西。你使用SpringVaadinIntegration插件吗? – dzezzz

+0

感谢您的回答。不过,只是使用普通的旧Vaadin。 – William

+5

不确定您的应用程序@William的要求是什么,但我遇到过类似的问题,无法解决它们。我改为使用'UI.setPollInterval()',它似乎工作,并且可靠。这是一次民意调查,而不是推动,但至少它是有效的。 – hmjd

回答

2

再试一次

Web Push仍然是一个年轻的技术,尤其是WebSocket品种。例如,Tomcat用另一个替换了一个WebSocket实现。 Vaadin采用了Atmosphere library以及Vaadin 7中的所有其他工作都是相对较新的。在发布这个问题后的几个月里,情况有所改善。我建议再推一次尝试。

使用最新版本的Web服务器。例如, 8和Jetty对Push和WebSocket的支持做了重大改变。

使用最新版本Java 8Vaadin(现在7.3.7)。

不需要setPollInterval

不需要调用UI::setPollInterval正如在评论上述。该功能只使用一种方法来推送。

所有你需要的是@Push注释。而Thread或更好的ScheduledExecutorService更新数据以便在您的应用中显示。使用@Push注释参与Atmosphere库。 Atmosphere尝试多种Push技术,从WebSocket开始,并自动使用其他技术作为后备。

工作实例

我最近(2015-01)公布working example of Push在Vaadin 7.3.7工作作为一个答案another question。我的例子是故意最小化的,使用单个文件替换新的默认Vaadin应用程序项目中的MyUI文件内容。