Vaadin中Push支持的问题

时间:2014-03-03 02:14:30

标签: vaadin add-on server-push

我在Vaadin 7中遇到了一些严重的服务器推送支持问题,而且它很难确定问题。我已经按照Book of 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中所述。

我发现Server Push支持非常古怪,因此难以识别问题。例如,在开发代码时,服务器通常不会自动重新启动;当我关闭浏览器(而不仅仅是浏览器窗口)时才识别新代码,停止服务器并重新启动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

我也发现了这个错误;不知道它是否表明存在严重问题(避难所试图解决它,因为我不想进入大气层):

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

也就是说,Firefox在服务器推送方面效果很好,而Chrome有问题,IE出现错误(惊喜!)。特别是,Chrome通常需要很长时间才能将UI交互(例如,按钮按钮)传达给服务器,从而在右上方出现一个微调器(从黄色变为橙色到红色)。当多个窗口打开时,IE只会更新错误的UI组件。因此,只要每个用户都使用Firefox就没有问题,但我无法承担这一点。

我发现了这篇帖子,开发人员对这个功能表达了沮丧:https://vaadin.com/forum#!/thread/4040408。这是最近的一篇文章,所以它听起来不太有希望。我需要服务器推送功能的唯一原因是允许ChatBox插件(https://vaadin.com/directory/-/directory/addon/chatbox)实时更新。

有什么想法吗?有没有人得到这些错误,并设法得到一些解决方法?或者更好的是,有没有人使用ChatBox附加组件来使用Server Push?

谢谢,

威廉

1 个答案:

答案 0 :(得分:2)

再试一次

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

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

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

无需setPollInterval

无需像上面评论中提到的那样致电UI::setPollInterval。该功能仅使用一种Push方法。

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

工作示例

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